cab3eb7ffdc719f2d19020ff5e57bffac746a4f1
[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         bool ContainerExists(string account, Uri container);\r
75         ContainerInfo GetContainerInfo(string account, Uri container);\r
76         void 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         void DeleteObject(string account, Uri container, Uri objectName, bool isDirectory);\r
84         //void DeleteObject(string container, string objectName, string account = null);\r
85         void MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName);\r
86         bool ObjectExists(string account, Uri container, Uri objectName);\r
87         Task<ObjectInfo> GetObjectInfo(string account, Uri container, Uri objectName);\r
88         void 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 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(bool);\r
240         }\r
241 \r
242         public 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(ContainerInfo);\r
251         }\r
252 \r
253         public void 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 \r
262         public Task DeleteContainer(string account, Uri container)\r
263         {\r
264             \r
265             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
266             Contract.Requires(StorageUrl!=null);\r
267             Contract.Requires(container != null);\r
268             Contract.Requires(!container.IsAbsoluteUri);\r
269 \r
270             return default(Task);\r
271         }\r
272 \r
273         public Task GetObject(string account, Uri container, Uri objectName, string fileName, CancellationToken cancellationToken)\r
274         {\r
275             \r
276             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
277             Contract.Requires(StorageUrl!=null);\r
278             Contract.Requires(container != null);\r
279             Contract.Requires(!container.IsAbsoluteUri);\r
280             Contract.Requires(objectName != null);\r
281             Contract.Requires(!objectName.IsAbsoluteUri);\r
282 \r
283             return default(Task);\r
284         }\r
285 \r
286         public Task PutObject(string account, Uri container, Uri objectName, string fileName, string hash = null, string contentType = "application/octet-stream")\r
287         {\r
288             \r
289             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
290             Contract.Requires(StorageUrl!=null);\r
291             Contract.Requires(!String.IsNullOrWhiteSpace(fileName));\r
292             Contract.Requires(container != null);\r
293             Contract.Requires(!container.IsAbsoluteUri);\r
294             Contract.Requires(objectName != null);\r
295             Contract.Requires(!objectName.IsAbsoluteUri);\r
296             Contract.Requires(!String.IsNullOrWhiteSpace(contentType));\r
297 \r
298             return default(Task);\r
299         }\r
300 \r
301         public void DeleteObject(string account, Uri container, Uri objectName, bool isDirectory)\r
302         {\r
303             \r
304             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
305             Contract.Requires(StorageUrl!=null);\r
306             Contract.Requires(container != null);\r
307             Contract.Requires(!container.IsAbsoluteUri);\r
308             Contract.Requires(objectName != null);\r
309             Contract.Requires(!objectName.IsAbsoluteUri);\r
310         }\r
311 \r
312         public void MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName)\r
313         {\r
314             \r
315             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
316             Contract.Requires(StorageUrl!=null);\r
317             Contract.Requires(sourceContainer != null);\r
318             Contract.Requires(!sourceContainer.IsAbsoluteUri);\r
319             Contract.Requires(oldObjectName != null);\r
320             Contract.Requires(!oldObjectName.IsAbsoluteUri);\r
321 \r
322             Contract.Requires(targetContainer != null);\r
323             Contract.Requires(!targetContainer.IsAbsoluteUri);\r
324             Contract.Requires(newObjectName != null);\r
325             Contract.Requires(!newObjectName.IsAbsoluteUri);\r
326 \r
327         }\r
328 \r
329         public bool ObjectExists(string account, Uri container, Uri objectName)\r
330         {\r
331             \r
332             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
333             Contract.Requires(StorageUrl!=null);\r
334             Contract.Requires(container != null);\r
335             Contract.Requires(!container.IsAbsoluteUri);\r
336             Contract.Requires(objectName != null);\r
337             Contract.Requires(!objectName.IsAbsoluteUri);\r
338 \r
339             return default(bool);\r
340         }\r
341 \r
342         public Task<ObjectInfo> GetObjectInfo(string account, Uri container, Uri objectName)\r
343         {\r
344             \r
345             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
346             Contract.Requires(StorageUrl!=null);\r
347             Contract.Requires(container != null);\r
348             Contract.Requires(!container.IsAbsoluteUri);\r
349             Contract.Requires(objectName != null);\r
350             Contract.Requires(!objectName.IsAbsoluteUri);\r
351 \r
352             return default(Task<ObjectInfo>);\r
353         }\r
354 \r
355         public void CreateFolder(string account, Uri container, Uri folder)\r
356         {\r
357             \r
358             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
359             Contract.Requires(StorageUrl != null);\r
360             Contract.Requires(container != null);\r
361             Contract.Requires(!container.IsAbsoluteUri);\r
362             Contract.Requires(folder != null);\r
363             Contract.Requires(!folder .IsAbsoluteUri);\r
364         }\r
365 \r
366         public Task<TreeHash> GetHashMap(string account, Uri container, Uri objectName)\r
367         {\r
368             \r
369             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
370             Contract.Requires(StorageUrl != null);\r
371             Contract.Requires(container != null);\r
372             Contract.Requires(!container.IsAbsoluteUri);\r
373             Contract.Requires(objectName != null);\r
374             Contract.Requires(!objectName.IsAbsoluteUri);\r
375 \r
376             return default(Task<TreeHash>);\r
377         }\r
378 \r
379         public Task<IList<string>> PutHashMap(string account, Uri container, Uri objectName, TreeHash hash)\r
380         {\r
381             \r
382             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
383             Contract.Requires(StorageUrl != null);\r
384             Contract.Requires(container != null);\r
385             Contract.Requires(!container.IsAbsoluteUri);\r
386             Contract.Requires(objectName != null);\r
387             Contract.Requires(!objectName.IsAbsoluteUri);\r
388             Contract.Requires(hash != null);\r
389 \r
390             return default(Task<IList<string>>);\r
391         }\r
392 \r
393         public Task PostBlock(string account, Uri container, byte[] block, int offset, int count, string blockHash,CancellationToken token)\r
394         {\r
395             \r
396             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
397             Contract.Requires(StorageUrl != null);\r
398             Contract.Requires(container != null);\r
399             Contract.Requires(!container.IsAbsoluteUri);\r
400             Contract.Requires(block != null);\r
401             Contract.Requires(offset>=0);\r
402             Contract.Requires(offset < block.Length);\r
403             Contract.Requires(count>=0);\r
404             Contract.Requires(count <= block.Length);\r
405             \r
406             return default(Task);\r
407         }\r
408 \r
409         public Task<byte[]> GetBlock(string account, Uri container, Uri relativeUrl, long start, long? end, CancellationToken cancellationToken)\r
410         {\r
411             \r
412             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
413             Contract.Requires(StorageUrl != null);\r
414             Contract.Requires(container != null);\r
415             Contract.Requires(!container.IsAbsoluteUri);\r
416             Contract.Requires(relativeUrl != null);\r
417             Contract.Requires(start>=0);\r
418             Contract.Requires(end==null || end>=0);\r
419 \r
420             return default(Task<byte[]>);\r
421         }\r
422 \r
423     }\r
424 }\r