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);
65 [ContractClassFor(typeof(ICloudClient))]
66 public abstract class ICloudClientContract:ICloudClient
69 public string ApiKey { get; set; }
70 public string UserName { get; set; }
71 public Uri StorageUrl { get; set; }
72 public string Token { get; set; }
74 public Uri Proxy { get; set; }
75 public double DownloadPercentLimit { get; set; }
76 public double UploadPercentLimit { get; set; }
78 public string AuthenticationUrl { get; set; }
80 public bool UsePithos { get; set; }
82 public AccountInfo Authenticate()
84 Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");
85 Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");
87 return default(AccountInfo);
90 public IList<ContainerInfo> ListContainers(string account)
92 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
93 Contract.Requires(StorageUrl!=null);
95 return default(IList<ContainerInfo>);
98 public IList<ObjectInfo> ListSharedObjects(DateTime? since)
102 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
103 Contract.Requires(StorageUrl != null);
105 return default(IList<ObjectInfo>);
108 public void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write)
111 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
112 Contract.Requires(StorageUrl != null);
113 Contract.Requires(!String.IsNullOrWhiteSpace(container));
114 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
115 Contract.Requires(!String.IsNullOrWhiteSpace(account));
116 Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));
120 public AccountInfo GetAccountPolicies(AccountInfo accountInfo)
122 Contract.Requires(accountInfo!=null);
124 return default(AccountInfo);
128 public IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null)
131 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
132 Contract.Requires(StorageUrl != null);
133 Contract.Requires(!String.IsNullOrWhiteSpace(container));
135 return default(IList<ObjectInfo>);
138 public IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null)
141 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
142 Contract.Requires(StorageUrl != null);
143 Contract.Requires(!String.IsNullOrWhiteSpace(container));
144 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
146 return default(IList<ObjectInfo>);
149 public bool ContainerExists(string account, string container)
152 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
153 Contract.Requires(StorageUrl!=null);
154 Contract.Requires(!String.IsNullOrWhiteSpace(container));
156 return default(bool);
159 public ContainerInfo GetContainerInfo(string account, string container)
162 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
163 Contract.Requires(StorageUrl!=null);
164 Contract.Requires(!String.IsNullOrWhiteSpace(container));
166 return default(ContainerInfo);
169 public void CreateContainer(string account, string container)
172 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
173 Contract.Requires(StorageUrl!=null);
174 Contract.Requires(!String.IsNullOrWhiteSpace(container));
177 public void DeleteContainer(string account, string container)
180 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
181 Contract.Requires(StorageUrl!=null);
182 Contract.Requires(!String.IsNullOrWhiteSpace(container));
185 public Task GetObject(string account, string container, string objectName, string fileName)
188 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
189 Contract.Requires(StorageUrl!=null);
190 Contract.Requires(!String.IsNullOrWhiteSpace(container));
191 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
193 return default(Task);
196 public Task PutObject(string account, string container, string objectName, string fileName, string hash = null)
199 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
200 Contract.Requires(StorageUrl!=null);
201 Contract.Requires(!String.IsNullOrWhiteSpace(container));
202 Contract.Requires(!String.IsNullOrWhiteSpace(fileName));
203 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
205 return default(Task);
208 public void DeleteObject(string account, string container, string objectName)
211 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
212 Contract.Requires(StorageUrl!=null);
213 Contract.Requires(!String.IsNullOrWhiteSpace(container));
214 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
217 public void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName)
220 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
221 Contract.Requires(StorageUrl!=null);
222 Contract.Requires(!String.IsNullOrWhiteSpace(sourceContainer));
223 Contract.Requires(!String.IsNullOrWhiteSpace(oldObjectName));
224 Contract.Requires(!String.IsNullOrWhiteSpace(targetContainer));
225 Contract.Requires(!String.IsNullOrWhiteSpace(newObjectName));
228 public bool ObjectExists(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));
236 return default(bool);
239 public ObjectInfo GetObjectInfo(string account, string container, string objectName)
242 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
243 Contract.Requires(StorageUrl!=null);
244 Contract.Requires(!String.IsNullOrWhiteSpace(container));
245 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
247 return default(ObjectInfo);
250 public void CreateFolder(string account, string container, string folder)
253 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
254 Contract.Requires(StorageUrl != null);
255 Contract.Requires(!String.IsNullOrWhiteSpace(container));
256 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
259 public Task<TreeHash> GetHashMap(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(Task<TreeHash>);
270 public Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash)
273 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
274 Contract.Requires(StorageUrl != null);
275 Contract.Requires(!String.IsNullOrWhiteSpace(container));
276 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
277 Contract.Requires(hash != null);
279 return default(Task<IList<string>>);
282 public Task PostBlock(string account, string container, byte[] block, int offset, int count)
285 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
286 Contract.Requires(StorageUrl != null);
287 Contract.Requires(!String.IsNullOrWhiteSpace(container));
288 Contract.Requires(block != null);
289 Contract.Requires(offset>=0);
290 Contract.Requires(offset < block.Length);
291 Contract.Requires(count>=0);
292 Contract.Requires(count <= block.Length);
294 return default(Task);
297 public Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end)
300 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
301 Contract.Requires(StorageUrl != null);
302 Contract.Requires(!String.IsNullOrWhiteSpace(container));
303 Contract.Requires(relativeUrl!=null);
304 Contract.Requires(start>=0);
305 Contract.Requires(end==null || end>=0);
307 return default(Task<byte[]>);