2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
5 using System.Threading.Tasks;
6 using Pithos.Interfaces;
8 namespace Pithos.Network
10 [ContractClass(typeof(ICloudClientContract))]
11 public interface ICloudClient
14 string ApiKey { get; set; }
15 string UserName { get; set; }
16 Uri StorageUrl { get; set; }
18 string Token { get; set; }
20 bool UsePithos { get; set; }
21 AccountInfo Authenticate();
22 WebProxy Proxy { get; set; }
23 double DownloadPercentLimit { get; set; }
24 double UploadPercentLimit { get; set; }
25 string AuthenticationUrl { get; set; }
27 #region Container operations
29 IList<ContainerInfo> ListContainers(string account);
30 IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null);
31 IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null);
32 bool ContainerExists(string account, string container);
33 ContainerInfo GetContainerInfo(string account, string container);
34 void CreateContainer(string account, string container);
35 void DeleteContainer(string account, string container);
38 #region Object operations
39 Task GetObject(string account, string container, string objectName, string fileName);
40 Task PutObject(string account, string container, string objectName, string fileName, string hash = null, string contentType = "application/octet-stream");
41 void DeleteObject(string account, string container, string objectName);
42 //void DeleteObject(string container, string objectName, string account = null);
43 void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName);
44 bool ObjectExists(string account, string container, string objectName);
45 ObjectInfo GetObjectInfo(string account, string container, string objectName);
46 void CreateFolder(string account, string container, string folder);
49 #region Hashmap operations
50 Task<TreeHash> GetHashMap(string account, string container, string objectName);
51 Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash);
52 Task PostBlock(string account, string container, byte[] block, int offset, int count);
53 Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end);
56 #region Sharing operations
57 IList<ObjectInfo> ListSharedObjects(DateTime? since);
58 void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write);
62 AccountInfo GetAccountPolicies(AccountInfo accountInfo);
64 void UpdateMetadata(ObjectInfo objectInfo);
66 void UpdateMetadata(ContainerInfo Container);
70 [ContractClassFor(typeof(ICloudClient))]
71 public abstract class ICloudClientContract:ICloudClient
74 public string ApiKey { get; set; }
75 public string UserName { get; set; }
76 public Uri StorageUrl { get; set; }
77 public string Token { get; set; }
79 public WebProxy Proxy { get; set; }
80 public double DownloadPercentLimit { get; set; }
81 public double UploadPercentLimit { get; set; }
83 public string AuthenticationUrl { get; set; }
85 public bool UsePithos { get; set; }
87 public AccountInfo Authenticate()
89 Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");
90 Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");
92 return default(AccountInfo);
95 public IList<ContainerInfo> ListContainers(string account)
97 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
98 Contract.Requires(StorageUrl!=null);
100 return default(IList<ContainerInfo>);
103 public IList<ObjectInfo> ListSharedObjects(DateTime? since)
107 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
108 Contract.Requires(StorageUrl != null);
110 return default(IList<ObjectInfo>);
113 public void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write)
116 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
117 Contract.Requires(StorageUrl != null);
118 Contract.Requires(!String.IsNullOrWhiteSpace(container));
119 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
120 Contract.Requires(!String.IsNullOrWhiteSpace(account));
121 Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));
125 public AccountInfo GetAccountPolicies(AccountInfo accountInfo)
127 Contract.Requires(accountInfo!=null);
129 return default(AccountInfo);
132 public void UpdateMetadata(ObjectInfo objectInfo)
134 Contract.Requires(objectInfo!=null);
139 public void UpdateMetadata(ContainerInfo objectInfo)
141 Contract.Requires(objectInfo!=null);
147 public IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null)
150 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
151 Contract.Requires(StorageUrl != null);
152 Contract.Requires(!String.IsNullOrWhiteSpace(container));
154 return default(IList<ObjectInfo>);
157 public IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null)
160 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
161 Contract.Requires(StorageUrl != null);
162 Contract.Requires(!String.IsNullOrWhiteSpace(container));
163 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
165 return default(IList<ObjectInfo>);
168 public bool ContainerExists(string account, string container)
171 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
172 Contract.Requires(StorageUrl!=null);
173 Contract.Requires(!String.IsNullOrWhiteSpace(container));
175 return default(bool);
178 public ContainerInfo GetContainerInfo(string account, string container)
181 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
182 Contract.Requires(StorageUrl!=null);
183 Contract.Requires(!String.IsNullOrWhiteSpace(container));
185 return default(ContainerInfo);
188 public void CreateContainer(string account, string container)
191 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
192 Contract.Requires(StorageUrl!=null);
193 Contract.Requires(!String.IsNullOrWhiteSpace(container));
196 public void DeleteContainer(string account, string container)
199 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
200 Contract.Requires(StorageUrl!=null);
201 Contract.Requires(!String.IsNullOrWhiteSpace(container));
204 public Task GetObject(string account, string container, string objectName, string fileName)
207 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
208 Contract.Requires(StorageUrl!=null);
209 Contract.Requires(!String.IsNullOrWhiteSpace(container));
210 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
212 return default(Task);
215 public Task PutObject(string account, string container, string objectName, string fileName, string hash = null, string contentType = "application/octet-stream")
218 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
219 Contract.Requires(StorageUrl!=null);
220 Contract.Requires(!String.IsNullOrWhiteSpace(container));
221 Contract.Requires(!String.IsNullOrWhiteSpace(fileName));
222 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
223 Contract.Requires(!String.IsNullOrWhiteSpace(contentType));
225 return default(Task);
228 public void DeleteObject(string account, string container, string objectName)
231 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
232 Contract.Requires(StorageUrl!=null);
233 Contract.Requires(!String.IsNullOrWhiteSpace(container));
234 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
237 public void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName)
240 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
241 Contract.Requires(StorageUrl!=null);
242 Contract.Requires(!String.IsNullOrWhiteSpace(sourceContainer));
243 Contract.Requires(!String.IsNullOrWhiteSpace(oldObjectName));
244 Contract.Requires(!String.IsNullOrWhiteSpace(targetContainer));
245 Contract.Requires(!String.IsNullOrWhiteSpace(newObjectName));
248 public bool ObjectExists(string account, string container, string objectName)
251 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
252 Contract.Requires(StorageUrl!=null);
253 Contract.Requires(!String.IsNullOrWhiteSpace(container));
254 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
256 return default(bool);
259 public ObjectInfo GetObjectInfo(string account, string container, string objectName)
262 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
263 Contract.Requires(StorageUrl!=null);
264 Contract.Requires(!String.IsNullOrWhiteSpace(container));
265 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
267 return default(ObjectInfo);
270 public void CreateFolder(string account, string container, string folder)
273 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
274 Contract.Requires(StorageUrl != null);
275 Contract.Requires(!String.IsNullOrWhiteSpace(container));
276 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
279 public Task<TreeHash> GetHashMap(string account, string container, string objectName)
282 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
283 Contract.Requires(StorageUrl != null);
284 Contract.Requires(!String.IsNullOrWhiteSpace(container));
285 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
287 return default(Task<TreeHash>);
290 public Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash)
293 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
294 Contract.Requires(StorageUrl != null);
295 Contract.Requires(!String.IsNullOrWhiteSpace(container));
296 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
297 Contract.Requires(hash != null);
299 return default(Task<IList<string>>);
302 public Task PostBlock(string account, string container, byte[] block, int offset, int count)
305 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
306 Contract.Requires(StorageUrl != null);
307 Contract.Requires(!String.IsNullOrWhiteSpace(container));
308 Contract.Requires(block != null);
309 Contract.Requires(offset>=0);
310 Contract.Requires(offset < block.Length);
311 Contract.Requires(count>=0);
312 Contract.Requires(count <= block.Length);
314 return default(Task);
317 public Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end)
320 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
321 Contract.Requires(StorageUrl != null);
322 Contract.Requires(!String.IsNullOrWhiteSpace(container));
323 Contract.Requires(relativeUrl!=null);
324 Contract.Requires(start>=0);
325 Contract.Requires(end==null || end>=0);
327 return default(Task<byte[]>);