2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
4 using System.Threading.Tasks;
5 using Pithos.Interfaces;
7 namespace Pithos.Network
9 [ContractClass(typeof(ICloudClientContract))]
10 public interface ICloudClient
13 string ApiKey { get; set; }
14 string UserName { get; set; }
15 Uri StorageUrl { get; set; }
17 string Token { get; set; }
19 bool UsePithos { get; set; }
20 AccountInfo Authenticate();
21 Uri Proxy { get; set; }
22 double DownloadPercentLimit { get; set; }
23 double UploadPercentLimit { get; set; }
24 string AuthenticationUrl { get; set; }
26 #region Container operations
28 IList<ContainerInfo> ListContainers(string account);
29 IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null);
30 IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null);
31 bool ContainerExists(string account, string container);
32 ContainerInfo GetContainerInfo(string account, string container);
33 void CreateContainer(string account, string container);
34 void DeleteContainer(string account, string container);
37 #region Object operations
38 Task GetObject(string account, string container, string objectName, string fileName);
39 Task PutObject(string account, string container, string objectName, string fileName, string hash = null);
40 void DeleteObject(string account, string container, string objectName);
41 //void DeleteObject(string container, string objectName, string account = null);
42 void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName);
43 bool ObjectExists(string account, string container, string objectName);
44 ObjectInfo GetObjectInfo(string account, string container, string objectName);
45 void CreateFolder(string account, string container, string folder);
48 #region Hashmap operations
49 Task<TreeHash> GetHashMap(string account, string container, string objectName);
50 Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash);
51 Task PostBlock(string account, string container, byte[] block, int offset, int count);
52 Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end);
55 #region Sharing operations
56 IList<ObjectInfo> ListSharedObjects(DateTime? since);
57 void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write);
61 AccountInfo GetAccountPolicies(AccountInfo accountInfo);
63 void UpdateMetadata(ObjectInfo objectInfo);
67 [ContractClassFor(typeof(ICloudClient))]
68 public abstract class ICloudClientContract:ICloudClient
71 public string ApiKey { get; set; }
72 public string UserName { get; set; }
73 public Uri StorageUrl { get; set; }
74 public string Token { get; set; }
76 public Uri Proxy { get; set; }
77 public double DownloadPercentLimit { get; set; }
78 public double UploadPercentLimit { get; set; }
80 public string AuthenticationUrl { get; set; }
82 public bool UsePithos { get; set; }
84 public AccountInfo Authenticate()
86 Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");
87 Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");
89 return default(AccountInfo);
92 public IList<ContainerInfo> ListContainers(string account)
94 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
95 Contract.Requires(StorageUrl!=null);
97 return default(IList<ContainerInfo>);
100 public IList<ObjectInfo> ListSharedObjects(DateTime? since)
104 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
105 Contract.Requires(StorageUrl != null);
107 return default(IList<ObjectInfo>);
110 public void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write)
113 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
114 Contract.Requires(StorageUrl != null);
115 Contract.Requires(!String.IsNullOrWhiteSpace(container));
116 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
117 Contract.Requires(!String.IsNullOrWhiteSpace(account));
118 Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));
122 public AccountInfo GetAccountPolicies(AccountInfo accountInfo)
124 Contract.Requires(accountInfo!=null);
126 return default(AccountInfo);
129 public void UpdateMetadata(ObjectInfo objectInfo)
131 Contract.Requires(objectInfo!=null);
137 public IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null)
140 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
141 Contract.Requires(StorageUrl != null);
142 Contract.Requires(!String.IsNullOrWhiteSpace(container));
144 return default(IList<ObjectInfo>);
147 public IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null)
150 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
151 Contract.Requires(StorageUrl != null);
152 Contract.Requires(!String.IsNullOrWhiteSpace(container));
153 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
155 return default(IList<ObjectInfo>);
158 public bool ContainerExists(string account, string container)
161 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
162 Contract.Requires(StorageUrl!=null);
163 Contract.Requires(!String.IsNullOrWhiteSpace(container));
165 return default(bool);
168 public ContainerInfo GetContainerInfo(string account, string container)
171 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
172 Contract.Requires(StorageUrl!=null);
173 Contract.Requires(!String.IsNullOrWhiteSpace(container));
175 return default(ContainerInfo);
178 public void CreateContainer(string account, string container)
181 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
182 Contract.Requires(StorageUrl!=null);
183 Contract.Requires(!String.IsNullOrWhiteSpace(container));
186 public void DeleteContainer(string account, string container)
189 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
190 Contract.Requires(StorageUrl!=null);
191 Contract.Requires(!String.IsNullOrWhiteSpace(container));
194 public Task GetObject(string account, string container, string objectName, string fileName)
197 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
198 Contract.Requires(StorageUrl!=null);
199 Contract.Requires(!String.IsNullOrWhiteSpace(container));
200 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
202 return default(Task);
205 public Task PutObject(string account, string container, string objectName, string fileName, string hash = null)
208 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
209 Contract.Requires(StorageUrl!=null);
210 Contract.Requires(!String.IsNullOrWhiteSpace(container));
211 Contract.Requires(!String.IsNullOrWhiteSpace(fileName));
212 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
214 return default(Task);
217 public void DeleteObject(string account, string container, string objectName)
220 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
221 Contract.Requires(StorageUrl!=null);
222 Contract.Requires(!String.IsNullOrWhiteSpace(container));
223 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
226 public void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName)
229 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
230 Contract.Requires(StorageUrl!=null);
231 Contract.Requires(!String.IsNullOrWhiteSpace(sourceContainer));
232 Contract.Requires(!String.IsNullOrWhiteSpace(oldObjectName));
233 Contract.Requires(!String.IsNullOrWhiteSpace(targetContainer));
234 Contract.Requires(!String.IsNullOrWhiteSpace(newObjectName));
237 public bool ObjectExists(string account, string container, string objectName)
240 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
241 Contract.Requires(StorageUrl!=null);
242 Contract.Requires(!String.IsNullOrWhiteSpace(container));
243 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
245 return default(bool);
248 public ObjectInfo GetObjectInfo(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(ObjectInfo);
259 public void CreateFolder(string account, string container, string folder)
262 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
263 Contract.Requires(StorageUrl != null);
264 Contract.Requires(!String.IsNullOrWhiteSpace(container));
265 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
268 public Task<TreeHash> GetHashMap(string account, string container, string objectName)
271 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
272 Contract.Requires(StorageUrl != null);
273 Contract.Requires(!String.IsNullOrWhiteSpace(container));
274 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
276 return default(Task<TreeHash>);
279 public Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash)
282 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
283 Contract.Requires(StorageUrl != null);
284 Contract.Requires(!String.IsNullOrWhiteSpace(container));
285 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
286 Contract.Requires(hash != null);
288 return default(Task<IList<string>>);
291 public Task PostBlock(string account, string container, byte[] block, int offset, int count)
294 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
295 Contract.Requires(StorageUrl != null);
296 Contract.Requires(!String.IsNullOrWhiteSpace(container));
297 Contract.Requires(block != null);
298 Contract.Requires(offset>=0);
299 Contract.Requires(offset < block.Length);
300 Contract.Requires(count>=0);
301 Contract.Requires(count <= block.Length);
303 return default(Task);
306 public Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end)
309 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
310 Contract.Requires(StorageUrl != null);
311 Contract.Requires(!String.IsNullOrWhiteSpace(container));
312 Contract.Requires(relativeUrl!=null);
313 Contract.Requires(start>=0);
314 Contract.Requires(end==null || end>=0);
316 return default(Task<byte[]>);