Added Permissions, Tags
[pithos-ms-client] / trunk / Pithos.Core / Agents / CloudTransferAction.cs
1 using System;
2 using System.Diagnostics.Contracts;
3 using System.IO;
4 using System.Threading;
5 using Pithos.Interfaces;
6 using Pithos.Network;
7
8 namespace Pithos.Core.Agents
9 {
10     public enum CloudActionType
11     {
12         MustSynch,
13         UploadUnconditional,
14         DownloadUnconditional,
15         DeleteLocal,
16         DeleteCloud,
17         RenameCloud
18     }
19
20     public class CloudAction
21     {
22         public AccountInfo AccountInfo { get; set; }
23         public CloudActionType Action { get; set; }
24         public FileInfo LocalFile { get; set; }
25         public ObjectInfo CloudFile { get; set; }
26         public FileState FileState { get; set; }
27         public string Container { get; set; }
28
29
30         public Lazy<string> LocalHash { get; protected set; }
31         private Lazy<string> _topHash;
32         public Lazy<string> TopHash
33         {
34             get { return _topHash; }
35             set { _topHash = value; }
36         }
37
38
39         [ContractInvariantMethod]
40         private void Invariants()
41         {
42             Contract.Invariant(AccountInfo!=null);
43         }
44
45         protected CloudAction(AccountInfo accountInfo,CloudActionType action)
46         {
47             if (accountInfo==null)
48                 throw new ArgumentNullException("accountInfo");
49             Contract.EndContractBlock();
50
51             Action = action;
52             AccountInfo = accountInfo;
53         }
54
55         public CloudAction(AccountInfo accountInfo, CloudActionType action, FileInfo localFile, ObjectInfo cloudFile, FileState state, int blockSize, string algorithm)
56             : this(accountInfo,action)
57         {
58             LocalFile = localFile;
59             CloudFile = cloudFile;
60             FileState = state;
61             if (LocalFile != null)
62             {
63                 LocalHash = new Lazy<string>(() => LocalFile.CalculateHash(blockSize,algorithm),
64                                              LazyThreadSafetyMode.ExecutionAndPublication);
65             }
66         }
67
68         //Calculate the download path for the cloud file
69         public string GetDownloadPath()
70         {
71             if (CloudFile == null)
72                 return String.Empty;
73             var filePath = CloudFile.RelativeUrlToFilePath(AccountInfo.UserName);
74             return Path.Combine(AccountInfo.AccountPath, filePath);
75         }
76
77         public override string ToString()
78         {
79             return String.Format("{0}:{1}->{2}", this.Action, this.LocalFile.FullName, this.CloudFile.Name);
80         }
81     }    
82
83     public class CloudDownloadAction:CloudAction
84     {
85         public CloudDownloadAction(AccountInfo accountInfo, ObjectInfo cloudFile)
86             :base(accountInfo,CloudActionType.DownloadUnconditional)
87         {            
88             if (String.IsNullOrWhiteSpace(cloudFile.Container))
89                 throw new ArgumentException("CloudFile.Container","cloudFile");
90             Contract.EndContractBlock();
91
92             CloudFile = cloudFile;
93         }
94
95         [ContractInvariantMethod]
96         private void Invariants()
97         {
98             Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
99         }
100
101         public override string ToString()
102         {
103             return String.Format("{0}: _ <- {1}", this.Action, this.CloudFile.Name);
104         }
105         
106     }
107     public class CloudDeleteAction:CloudAction
108     {
109         public CloudDeleteAction(AccountInfo accountInfo,FileInfo fileInfo, FileState fileState)
110             : this(accountInfo,new ObjectInfo(accountInfo.AccountPath,accountInfo.UserName,fileInfo),fileState)
111         {
112         }
113
114         public CloudDeleteAction(AccountInfo accountInfo, ObjectInfo cloudFile, FileState fileState) 
115             : base(accountInfo,CloudActionType.DeleteCloud)
116         {
117             CloudFile = cloudFile;
118             FileState = fileState;
119         }
120
121         public CloudDeleteAction(CloudAction action)
122             : this(action.AccountInfo,action.CloudFile,action.FileState)
123         {}
124
125         [ContractInvariantMethod]
126         private void Invariants()
127         {
128             Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
129         }
130
131         public override string ToString()
132         {
133             return String.Format("{0}: _ ->{1}", this.Action, this.CloudFile.Name);
134         }
135
136     }
137
138     public class CloudUploadAction:CloudAction
139     {
140         public CloudUploadAction(AccountInfo accountInfo, FileInfo fileInfo, FileState state, int blockSize, string algorithm)
141             : base(accountInfo, CloudActionType.UploadUnconditional, fileInfo, 
142             new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName,fileInfo), state, blockSize, algorithm)
143         {
144         }
145
146         [ContractInvariantMethod]
147         private void Invariants()
148         {
149             Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
150         }
151
152     }
153
154     public class CloudMoveAction:CloudAction
155     {
156         public ObjectInfo OldCloudFile { get; set; }
157
158         public FileInfo OldLocalFile { get; set; }
159
160         public CloudMoveAction(AccountInfo accountInfo, CloudActionType action, FileInfo oldFile, FileInfo newFile)
161             :base(accountInfo,action)
162         {
163             LocalFile = newFile;
164             CloudFile = new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, newFile);
165             
166             OldLocalFile = oldFile;
167             OldCloudFile = new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, oldFile);
168
169             //This is a rename operation, a hash will not be used
170             LocalHash = new Lazy<string>(() => String.Empty, LazyThreadSafetyMode.ExecutionAndPublication);
171         }
172
173         public override string ToString()
174         {
175             return String.Format("{0}:{1}->{2}", this.Action, OldCloudFile.Name, CloudFile.Name);
176         }
177
178     }
179
180 }