Merge branch 'Polling' of https://code.grnet.gr/git/pithos-ms-client into Polling
[pithos-ms-client] / trunk / Pithos.Network / ICloudClient.cs
1 #region\r
2 /* -----------------------------------------------------------------------\r
3  * <copyright file="ICloudClient.cs" company="GRNet">\r
4  * \r
5  * Copyright 2011-2012 GRNET S.A. All rights reserved.\r
6  *\r
7  * Redistribution and use in source and binary forms, with or\r
8  * without modification, are permitted provided that the following\r
9  * conditions are met:\r
10  *\r
11  *   1. Redistributions of source code must retain the above\r
12  *      copyright notice, this list of conditions and the following\r
13  *      disclaimer.\r
14  *\r
15  *   2. Redistributions in binary form must reproduce the above\r
16  *      copyright notice, this list of conditions and the following\r
17  *      disclaimer in the documentation and/or other materials\r
18  *      provided with the distribution.\r
19  *\r
20  *\r
21  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS\r
22  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
24  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR\r
25  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\r
28  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
32  * POSSIBILITY OF SUCH DAMAGE.\r
33  *\r
34  * The views and conclusions contained in the software and\r
35  * documentation are those of the authors and should not be\r
36  * interpreted as representing official policies, either expressed\r
37  * or implied, of GRNET S.A.\r
38  * </copyright>\r
39  * -----------------------------------------------------------------------\r
40  */\r
41 #endregion\r
42 using System;\r
43 using System.Collections.Generic;\r
44 using System.Diagnostics.Contracts;\r
45 using System.Net;\r
46 using System.Threading;\r
47 using System.Threading.Tasks;\r
48 using Pithos.Interfaces;\r
49 \r
50 namespace Pithos.Network\r
51 {\r
52     [ContractClass(typeof(ICloudClientContract))]\r
53     public interface ICloudClient\r
54     {\r
55 \r
56         string ApiKey { get; set; }\r
57         string UserName { get; set; }\r
58         Uri StorageUrl { get; set; }\r
59 \r
60         string Token { get; set; }\r
61 \r
62         bool UsePithos { get; set; }\r
63         Task<AccountInfo> Authenticate();\r
64         //WebProxy Proxy { get; set; }\r
65         double DownloadPercentLimit { get; set; }\r
66         double UploadPercentLimit { get; set; }\r
67         string AuthenticationUrl { get; set; }\r
68 \r
69         #region Container operations\r
70 \r
71         Task<IList<ContainerInfo>> ListContainers(string account);\r
72         IList<ObjectInfo> ListObjects(string account, Uri container, DateTimeOffset? since = null);\r
73         IList<ObjectInfo> ListObjects(string account, Uri container, Uri folder, DateTimeOffset? since = null);\r
74         Task<bool> ContainerExists(string account, Uri container);\r
75         Task<ContainerInfo> GetContainerInfo(string account, Uri container);\r
76         Task CreateContainer(string account, Uri container);\r
77         Task DeleteContainer(string account, Uri container);\r
78         #endregion\r
79 \r
80         #region Object operations        \r
81         Task GetObject(string account, Uri container, Uri objectName, string fileName, CancellationToken cancellationToken);\r
82         Task PutObject(string account, Uri container, Uri objectName, string fileName, string hash = null, string contentType = "application/octet-stream");\r
83         Task DeleteObject(string account, Uri container, Uri objectName, bool isDirectory);\r
84         //void DeleteObject(string container, string objectName, string account = null);\r
85         Task MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName);\r
86         Task<bool> ObjectExists(string account, Uri container, Uri objectName);\r
87         Task<ObjectInfo> GetObjectInfo(string account, Uri container, Uri objectName);\r
88         Task CreateFolder(string account, Uri container, Uri folder);\r
89         #endregion\r
90 \r
91         #region Hashmap operations        \r
92         Task<TreeHash> GetHashMap(string account, Uri container, Uri objectName);\r
93         Task<IList<string>> PutHashMap(string account, Uri container, Uri objectName, TreeHash hash);\r
94         Task PostBlock(string account, Uri container, byte[] block, int offset, int count,string blockHash, CancellationToken token);\r
95         Task<byte[]> GetBlock(string account, Uri container, Uri relativeUrl, long start, long? end, CancellationToken cancellationToken);\r
96         #endregion\r
97 \r
98         #region Sharing operations        \r
99         IList<ObjectInfo> ListSharedObjects(HashSet<string> knownContainers, DateTimeOffset? since);\r
100         void ShareObject(string account, Uri container, Uri objectName, string shareTo, bool read, bool write);\r
101 \r
102         #endregion\r
103 \r
104         Task<AccountInfo> GetAccountPolicies(AccountInfo accountInfo);\r
105 \r
106         void UpdateMetadata(ObjectInfo objectInfo);\r
107 \r
108         void UpdateMetadata(ContainerInfo Container);\r
109         IList<ShareAccountInfo> ListSharingAccounts(DateTime? since=null);\r
110         Task WipeContainer(string account, Uri container);\r
111     }\r
112 \r
113 \r
114     [ContractClassFor(typeof(ICloudClient))]\r
115     public abstract class ICloudClientContract:ICloudClient\r
116     {\r
117 \r
118         public string ApiKey { get; set; }\r
119         public string UserName { get; set; }\r
120         public Uri StorageUrl { get; set; }\r
121         public string Token { get; set; }\r
122         \r
123         public double DownloadPercentLimit { get; set; }\r
124         public double UploadPercentLimit { get; set; }\r
125 \r
126         public string AuthenticationUrl { get; set; }\r
127 \r
128         public bool UsePithos { get; set; }\r
129 \r
130         public Task<AccountInfo> Authenticate()\r
131         {\r
132             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");\r
133             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");\r
134 \r
135             return default(Task<AccountInfo>);\r
136         }\r
137 \r
138         public Task<IList<ContainerInfo>> ListContainers(string account)\r
139         {\r
140             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
141             Contract.Requires(StorageUrl!=null);            \r
142 \r
143             return default(Task<IList<ContainerInfo>>);\r
144         }\r
145 \r
146         public IList<ObjectInfo> ListSharedObjects(HashSet<string> knownContainers, DateTimeOffset? since)\r
147         {\r
148 \r
149             Contract.Requires(knownContainers!=null);\r
150             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
151             Contract.Requires(StorageUrl != null);\r
152 \r
153             return default(IList<ObjectInfo>);\r
154         }\r
155 \r
156         public void ShareObject(string account, Uri container, Uri objectName, string shareTo, bool read, bool write)\r
157         {\r
158             \r
159             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
160             Contract.Requires(StorageUrl != null);\r
161             Contract.Requires(container!=null);\r
162             Contract.Requires(!container.IsAbsoluteUri);\r
163             Contract.Requires(objectName != null);\r
164             Contract.Requires(!objectName.IsAbsoluteUri);\r
165             Contract.Requires(!String.IsNullOrWhiteSpace(account));\r
166             Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));\r
167    \r
168         }\r
169 \r
170         public Task<AccountInfo> GetAccountPolicies(AccountInfo accountInfo)\r
171         {\r
172             Contract.Requires(accountInfo!=null);\r
173 \r
174             return default(Task<AccountInfo>);\r
175         }\r
176 \r
177         public void UpdateMetadata(ObjectInfo objectInfo)\r
178         {\r
179             Contract.Requires(objectInfo!=null);\r
180 \r
181             return ;\r
182         }\r
183         \r
184         public void UpdateMetadata(ContainerInfo objectInfo)\r
185         {\r
186             Contract.Requires(objectInfo!=null);\r
187 \r
188             return ;\r
189         }\r
190 \r
191         public IList<ShareAccountInfo> ListSharingAccounts(DateTime? since = new DateTime?())\r
192         {\r
193             return default(IList<ShareAccountInfo>);\r
194         }\r
195 \r
196         public Task WipeContainer(string account, Uri container)\r
197         {\r
198             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
199             Contract.Requires(StorageUrl != null);\r
200             Contract.Requires(container != null);\r
201             Contract.Requires(!container.IsAbsoluteUri);\r
202 \r
203             return default(Task);\r
204         }\r
205 \r
206 \r
207         public IList<ObjectInfo> ListObjects(string account, Uri container, DateTimeOffset? since = null)\r
208         {\r
209             \r
210             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
211             Contract.Requires(StorageUrl != null);\r
212             Contract.Requires(container != null);\r
213             Contract.Requires(!container.IsAbsoluteUri);\r
214 \r
215             return default(IList<ObjectInfo>);\r
216         }\r
217 \r
218         public IList<ObjectInfo> ListObjects(string account, Uri container, Uri folder, DateTimeOffset? since = null)\r
219         {\r
220             \r
221             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
222             Contract.Requires(StorageUrl != null);\r
223             Contract.Requires(container != null);\r
224             Contract.Requires(!container.IsAbsoluteUri);\r
225 \r
226             //Contract.Requires(!String.IsNullOrWhiteSpace(folder));\r
227 \r
228             return default(IList<ObjectInfo>);\r
229         }\r
230 \r
231         public Task<bool> ContainerExists(string account, Uri container)\r
232         {\r
233             \r
234             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
235             Contract.Requires(StorageUrl!=null);\r
236             Contract.Requires(container != null);\r
237             Contract.Requires(!container.IsAbsoluteUri);\r
238 \r
239             return default(Task<bool>);\r
240         }\r
241 \r
242         public Task<ContainerInfo> GetContainerInfo(string account, Uri container)\r
243         {\r
244             \r
245             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
246             Contract.Requires(StorageUrl!=null);\r
247             Contract.Requires(container != null);\r
248             Contract.Requires(!container.IsAbsoluteUri);\r
249 \r
250             return default(Task<ContainerInfo>);\r
251         }\r
252 \r
253         public Task CreateContainer(string account, Uri container)\r
254         {\r
255             \r
256             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
257             Contract.Requires(StorageUrl!=null);\r
258             Contract.Requires(container != null);\r
259             Contract.Requires(!container.IsAbsoluteUri);\r
260 \r
261             return default(Task);\r
262         }\r
263 \r
264         public Task DeleteContainer(string account, Uri container)\r
265         {\r
266             \r
267             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
268             Contract.Requires(StorageUrl!=null);\r
269             Contract.Requires(container != null);\r
270             Contract.Requires(!container.IsAbsoluteUri);\r
271 \r
272             return default(Task);\r
273         }\r
274 \r
275         public Task GetObject(string account, Uri container, Uri objectName, string fileName, CancellationToken cancellationToken)\r
276         {\r
277             \r
278             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
279             Contract.Requires(StorageUrl!=null);\r
280             Contract.Requires(container != null);\r
281             Contract.Requires(!container.IsAbsoluteUri);\r
282             Contract.Requires(objectName != null);\r
283             Contract.Requires(!objectName.IsAbsoluteUri);\r
284 \r
285             return default(Task);\r
286         }\r
287 \r
288         public Task PutObject(string account, Uri container, Uri objectName, string fileName, string hash = null, string contentType = "application/octet-stream")\r
289         {\r
290             \r
291             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
292             Contract.Requires(StorageUrl!=null);\r
293             Contract.Requires(!String.IsNullOrWhiteSpace(fileName));\r
294             Contract.Requires(container != null);\r
295             Contract.Requires(!container.IsAbsoluteUri);\r
296             Contract.Requires(objectName != null);\r
297             Contract.Requires(!objectName.IsAbsoluteUri);\r
298             Contract.Requires(!String.IsNullOrWhiteSpace(contentType));\r
299 \r
300             return default(Task);\r
301         }\r
302 \r
303         public Task DeleteObject(string account, Uri container, Uri objectName, bool isDirectory)\r
304         {\r
305             \r
306             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
307             Contract.Requires(StorageUrl!=null);\r
308             Contract.Requires(container != null);\r
309             Contract.Requires(!container.IsAbsoluteUri);\r
310             Contract.Requires(objectName != null);\r
311             Contract.Requires(!objectName.IsAbsoluteUri);\r
312 \r
313             return default(Task);\r
314         }\r
315 \r
316         public Task MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName)\r
317         {\r
318             \r
319             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
320             Contract.Requires(StorageUrl!=null);\r
321             Contract.Requires(sourceContainer != null);\r
322             Contract.Requires(!sourceContainer.IsAbsoluteUri);\r
323             Contract.Requires(oldObjectName != null);\r
324             Contract.Requires(!oldObjectName.IsAbsoluteUri);\r
325 \r
326             Contract.Requires(targetContainer != null);\r
327             Contract.Requires(!targetContainer.IsAbsoluteUri);\r
328             Contract.Requires(newObjectName != null);\r
329             Contract.Requires(!newObjectName.IsAbsoluteUri);\r
330 \r
331             return default(Task);\r
332         }\r
333 \r
334         public Task<bool> ObjectExists(string account, Uri container, Uri objectName)\r
335         {\r
336             \r
337             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
338             Contract.Requires(StorageUrl!=null);\r
339             Contract.Requires(container != null);\r
340             Contract.Requires(!container.IsAbsoluteUri);\r
341             Contract.Requires(objectName != null);\r
342             Contract.Requires(!objectName.IsAbsoluteUri);\r
343 \r
344             return default(Task<bool>);\r
345         }\r
346 \r
347         public Task<ObjectInfo> GetObjectInfo(string account, Uri container, Uri objectName)\r
348         {\r
349             \r
350             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
351             Contract.Requires(StorageUrl!=null);\r
352             Contract.Requires(container != null);\r
353             Contract.Requires(!container.IsAbsoluteUri);\r
354             Contract.Requires(objectName != null);\r
355             Contract.Requires(!objectName.IsAbsoluteUri);\r
356 \r
357             return default(Task<ObjectInfo>);\r
358         }\r
359 \r
360         public Task CreateFolder(string account, Uri container, Uri folder)\r
361         {\r
362             \r
363             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
364             Contract.Requires(StorageUrl != null);\r
365             Contract.Requires(container != null);\r
366             Contract.Requires(!container.IsAbsoluteUri);\r
367             Contract.Requires(folder != null);\r
368             Contract.Requires(!folder .IsAbsoluteUri);\r
369 \r
370             return default(Task);\r
371         }\r
372 \r
373         public Task<TreeHash> GetHashMap(string account, Uri container, Uri objectName)\r
374         {\r
375             \r
376             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
377             Contract.Requires(StorageUrl != null);\r
378             Contract.Requires(container != null);\r
379             Contract.Requires(!container.IsAbsoluteUri);\r
380             Contract.Requires(objectName != null);\r
381             Contract.Requires(!objectName.IsAbsoluteUri);\r
382 \r
383             return default(Task<TreeHash>);\r
384         }\r
385 \r
386         public Task<IList<string>> PutHashMap(string account, Uri container, Uri objectName, TreeHash hash)\r
387         {\r
388             \r
389             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
390             Contract.Requires(StorageUrl != null);\r
391             Contract.Requires(container != null);\r
392             Contract.Requires(!container.IsAbsoluteUri);\r
393             Contract.Requires(objectName != null);\r
394             Contract.Requires(!objectName.IsAbsoluteUri);\r
395             Contract.Requires(hash != null);\r
396 \r
397             return default(Task<IList<string>>);\r
398         }\r
399 \r
400         public Task PostBlock(string account, Uri container, byte[] block, int offset, int count, string blockHash,CancellationToken token)\r
401         {\r
402             \r
403             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
404             Contract.Requires(StorageUrl != null);\r
405             Contract.Requires(container != null);\r
406             Contract.Requires(!container.IsAbsoluteUri);\r
407             Contract.Requires(block != null);\r
408             Contract.Requires(offset>=0);\r
409             Contract.Requires(offset < block.Length);\r
410             Contract.Requires(count>=0);\r
411             Contract.Requires(count <= block.Length);\r
412             \r
413             return default(Task);\r
414         }\r
415 \r
416         public Task<byte[]> GetBlock(string account, Uri container, Uri relativeUrl, long start, long? end, CancellationToken cancellationToken)\r
417         {\r
418             \r
419             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
420             Contract.Requires(StorageUrl != null);\r
421             Contract.Requires(container != null);\r
422             Contract.Requires(!container.IsAbsoluteUri);\r
423             Contract.Requires(relativeUrl != null);\r
424             Contract.Requires(start>=0);\r
425             Contract.Requires(end==null || end>=0);\r
426 \r
427             return default(Task<byte[]>);\r
428         }\r
429 \r
430     }\r
431 }\r