Convert all url usages to use the Uri class instead of raw strings.
[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         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         IList<ContainerInfo> ListContainers(string account);\r
72         IList<ObjectInfo> ListObjects(string account, Uri container, DateTime? since = null);\r
73         IList<ObjectInfo> ListObjects(string account, Uri container, Uri folder, DateTime? 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         void 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         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, 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, DateTime? 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         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     }\r
111 \r
112 \r
113     [ContractClassFor(typeof(ICloudClient))]\r
114     public abstract class ICloudClientContract:ICloudClient\r
115     {\r
116 \r
117         public string ApiKey { get; set; }\r
118         public string UserName { get; set; }\r
119         public Uri StorageUrl { get; set; }\r
120         public string Token { get; set; }\r
121         \r
122         public double DownloadPercentLimit { get; set; }\r
123         public double UploadPercentLimit { get; set; }\r
124 \r
125         public string AuthenticationUrl { get; set; }\r
126 \r
127         public bool UsePithos { get; set; }\r
128 \r
129         public AccountInfo Authenticate()\r
130         {\r
131             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");\r
132             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");\r
133 \r
134             return default(AccountInfo);\r
135         }\r
136 \r
137         public IList<ContainerInfo> ListContainers(string account)\r
138         {\r
139             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
140             Contract.Requires(StorageUrl!=null);            \r
141 \r
142             return default(IList<ContainerInfo>);\r
143         }\r
144 \r
145         public IList<ObjectInfo> ListSharedObjects(HashSet<string> knownContainers, DateTime? since)\r
146         {\r
147 \r
148             Contract.Requires(knownContainers!=null);\r
149             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
150             Contract.Requires(StorageUrl != null);\r
151 \r
152             return default(IList<ObjectInfo>);\r
153         }\r
154 \r
155         public void ShareObject(string account, Uri container, Uri objectName, string shareTo, bool read, bool write)\r
156         {\r
157             \r
158             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
159             Contract.Requires(StorageUrl != null);\r
160             Contract.Requires(container!=null);\r
161             Contract.Requires(!container.IsAbsoluteUri);\r
162             Contract.Requires(objectName != null);\r
163             Contract.Requires(!objectName.IsAbsoluteUri);\r
164             Contract.Requires(!String.IsNullOrWhiteSpace(account));\r
165             Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));\r
166    \r
167         }\r
168 \r
169         public AccountInfo GetAccountPolicies(AccountInfo accountInfo)\r
170         {\r
171             Contract.Requires(accountInfo!=null);\r
172 \r
173             return default(AccountInfo);\r
174         }\r
175 \r
176         public void UpdateMetadata(ObjectInfo objectInfo)\r
177         {\r
178             Contract.Requires(objectInfo!=null);\r
179 \r
180             return ;\r
181         }\r
182         \r
183         public void UpdateMetadata(ContainerInfo objectInfo)\r
184         {\r
185             Contract.Requires(objectInfo!=null);\r
186 \r
187             return ;\r
188         }\r
189 \r
190         public IList<ShareAccountInfo> ListSharingAccounts(DateTime? since = new DateTime?())\r
191         {\r
192             return default(IList<ShareAccountInfo>);\r
193         }\r
194 \r
195 \r
196         public IList<ObjectInfo> ListObjects(string account, Uri container, DateTime? since = null)\r
197         {\r
198             \r
199             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
200             Contract.Requires(StorageUrl != null);\r
201             Contract.Requires(container != null);\r
202             Contract.Requires(!container.IsAbsoluteUri);\r
203 \r
204             return default(IList<ObjectInfo>);\r
205         }\r
206 \r
207         public IList<ObjectInfo> ListObjects(string account, Uri container, Uri folder, DateTime? 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             //Contract.Requires(!String.IsNullOrWhiteSpace(folder));\r
216 \r
217             return default(IList<ObjectInfo>);\r
218         }\r
219 \r
220         public bool ContainerExists(string account, Uri container)\r
221         {\r
222             \r
223             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
224             Contract.Requires(StorageUrl!=null);\r
225             Contract.Requires(container != null);\r
226             Contract.Requires(!container.IsAbsoluteUri);\r
227 \r
228             return default(bool);\r
229         }\r
230 \r
231         public ContainerInfo GetContainerInfo(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(ContainerInfo);\r
240         }\r
241 \r
242         public void CreateContainer(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 \r
251         public void DeleteContainer(string account, Uri container)\r
252         {\r
253             \r
254             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
255             Contract.Requires(StorageUrl!=null);\r
256             Contract.Requires(container != null);\r
257             Contract.Requires(!container.IsAbsoluteUri);\r
258         }\r
259 \r
260         public Task GetObject(string account, Uri container, Uri objectName, string fileName, CancellationToken cancellationToken)\r
261         {\r
262             \r
263             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
264             Contract.Requires(StorageUrl!=null);\r
265             Contract.Requires(container != null);\r
266             Contract.Requires(!container.IsAbsoluteUri);\r
267             Contract.Requires(objectName != null);\r
268             Contract.Requires(!objectName.IsAbsoluteUri);\r
269 \r
270             return default(Task);\r
271         }\r
272 \r
273         public Task PutObject(string account, Uri container, Uri objectName, string fileName, string hash = null, string contentType = "application/octet-stream")\r
274         {\r
275             \r
276             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
277             Contract.Requires(StorageUrl!=null);\r
278             Contract.Requires(!String.IsNullOrWhiteSpace(fileName));\r
279             Contract.Requires(container != null);\r
280             Contract.Requires(!container.IsAbsoluteUri);\r
281             Contract.Requires(objectName != null);\r
282             Contract.Requires(!objectName.IsAbsoluteUri);\r
283             Contract.Requires(!String.IsNullOrWhiteSpace(contentType));\r
284 \r
285             return default(Task);\r
286         }\r
287 \r
288         public void DeleteObject(string account, Uri container, Uri objectName, bool isDirectory)\r
289         {\r
290             \r
291             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
292             Contract.Requires(StorageUrl!=null);\r
293             Contract.Requires(container != null);\r
294             Contract.Requires(!container.IsAbsoluteUri);\r
295             Contract.Requires(objectName != null);\r
296             Contract.Requires(!objectName.IsAbsoluteUri);\r
297         }\r
298 \r
299         public void MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName)\r
300         {\r
301             \r
302             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
303             Contract.Requires(StorageUrl!=null);\r
304             Contract.Requires(sourceContainer != null);\r
305             Contract.Requires(!sourceContainer.IsAbsoluteUri);\r
306             Contract.Requires(oldObjectName != null);\r
307             Contract.Requires(!oldObjectName.IsAbsoluteUri);\r
308 \r
309             Contract.Requires(targetContainer != null);\r
310             Contract.Requires(!targetContainer.IsAbsoluteUri);\r
311             Contract.Requires(newObjectName != null);\r
312             Contract.Requires(!newObjectName.IsAbsoluteUri);\r
313 \r
314         }\r
315 \r
316         public bool ObjectExists(string account, Uri container, Uri objectName)\r
317         {\r
318             \r
319             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
320             Contract.Requires(StorageUrl!=null);\r
321             Contract.Requires(container != null);\r
322             Contract.Requires(!container.IsAbsoluteUri);\r
323             Contract.Requires(objectName != null);\r
324             Contract.Requires(!objectName.IsAbsoluteUri);\r
325 \r
326             return default(bool);\r
327         }\r
328 \r
329         public ObjectInfo GetObjectInfo(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(ObjectInfo);\r
340         }\r
341 \r
342         public void CreateFolder(string account, Uri container, Uri folder)\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(folder != null);\r
350             Contract.Requires(!folder .IsAbsoluteUri);\r
351         }\r
352 \r
353         public Task<TreeHash> GetHashMap(string account, Uri container, Uri objectName)\r
354         {\r
355             \r
356             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
357             Contract.Requires(StorageUrl != null);\r
358             Contract.Requires(container != null);\r
359             Contract.Requires(!container.IsAbsoluteUri);\r
360             Contract.Requires(objectName != null);\r
361             Contract.Requires(!objectName.IsAbsoluteUri);\r
362 \r
363             return default(Task<TreeHash>);\r
364         }\r
365 \r
366         public Task<IList<string>> PutHashMap(string account, Uri container, Uri objectName, TreeHash hash)\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             Contract.Requires(hash != null);\r
376 \r
377             return default(Task<IList<string>>);\r
378         }\r
379 \r
380         public Task PostBlock(string account, Uri container, byte[] block, int offset, int count, CancellationToken token)\r
381         {\r
382             \r
383             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
384             Contract.Requires(StorageUrl != null);\r
385             Contract.Requires(container != null);\r
386             Contract.Requires(!container.IsAbsoluteUri);\r
387             Contract.Requires(block != null);\r
388             Contract.Requires(offset>=0);\r
389             Contract.Requires(offset < block.Length);\r
390             Contract.Requires(count>=0);\r
391             Contract.Requires(count <= block.Length);\r
392             \r
393             return default(Task);\r
394         }\r
395 \r
396         public Task<byte[]> GetBlock(string account, Uri container, Uri relativeUrl, long start, long? end, CancellationToken cancellationToken)\r
397         {\r
398             \r
399             Contract.Requires(!String.IsNullOrWhiteSpace(Token));\r
400             Contract.Requires(StorageUrl != null);\r
401             Contract.Requires(container != null);\r
402             Contract.Requires(!container.IsAbsoluteUri);\r
403             Contract.Requires(relativeUrl != null);\r
404             Contract.Requires(start>=0);\r
405             Contract.Requires(end==null || end>=0);\r
406 \r
407             return default(Task<byte[]>);\r
408         }\r
409 \r
410     }\r
411 }\r