Changed proxy settings to request update if the proxy requires authentication
[pithos-ms-client] / trunk / Pithos.Network / ICloudClient.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
4 using System.Net;
5 using System.Threading.Tasks;
6 using Pithos.Interfaces;
7
8 namespace Pithos.Network
9 {
10     [ContractClass(typeof(ICloudClientContract))]
11     public interface ICloudClient
12     {
13
14         string ApiKey { get; set; }
15         string UserName { get; set; }
16         Uri StorageUrl { get; set; }
17
18         string Token { get; set; }
19
20         bool UsePithos { get; set; }
21         AccountInfo Authenticate();
22         WebProxy Proxy { get; set; }
23         double DownloadPercentLimit { get; set; }
24         double UploadPercentLimit { get; set; }
25         string AuthenticationUrl { get; set; }
26
27         #region Container operations
28
29         IList<ContainerInfo> ListContainers(string account);
30         IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null);
31         IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null);
32         bool ContainerExists(string account, string container);
33         ContainerInfo GetContainerInfo(string account, string container);
34         void CreateContainer(string account, string container);
35         void DeleteContainer(string account, string container);
36         #endregion
37
38         #region Object operations        
39         Task GetObject(string account, string container, string objectName, string fileName);
40         Task PutObject(string account, string container, string objectName, string fileName, string hash = null, string contentType = "application/octet-stream");
41         void DeleteObject(string account, string container, string objectName);
42         //void DeleteObject(string container, string objectName, string account = null);
43         void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName);
44         bool ObjectExists(string account, string container, string objectName);
45         ObjectInfo GetObjectInfo(string account, string container, string objectName);
46         void CreateFolder(string account, string container, string folder);
47         #endregion
48
49         #region Hashmap operations        
50         Task<TreeHash> GetHashMap(string account, string container, string objectName);
51         Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash);
52         Task PostBlock(string account, string container, byte[] block, int offset, int count);
53         Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end);
54         #endregion
55
56         #region Sharing operations        
57         IList<ObjectInfo> ListSharedObjects(DateTime? since);
58         void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write);
59
60         #endregion
61
62         AccountInfo GetAccountPolicies(AccountInfo accountInfo);
63
64         void UpdateMetadata(ObjectInfo objectInfo);
65
66         void UpdateMetadata(ContainerInfo Container);
67     }
68
69
70     [ContractClassFor(typeof(ICloudClient))]
71     public abstract class ICloudClientContract:ICloudClient
72     {
73
74         public string ApiKey { get; set; }
75         public string UserName { get; set; }
76         public Uri StorageUrl { get; set; }
77         public string Token { get; set; }
78
79         public WebProxy Proxy { get; set; }
80         public double DownloadPercentLimit { get; set; }
81         public double UploadPercentLimit { get; set; }
82
83         public string AuthenticationUrl { get; set; }
84
85         public bool UsePithos { get; set; }
86
87         public AccountInfo Authenticate()
88         {
89             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");
90             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");
91
92             return default(AccountInfo);
93         }
94
95         public IList<ContainerInfo> ListContainers(string account)
96         {
97             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
98             Contract.Requires(StorageUrl!=null);            
99
100             return default(IList<ContainerInfo>);
101         }
102
103         public IList<ObjectInfo> ListSharedObjects(DateTime? since)
104         {
105
106             
107             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
108             Contract.Requires(StorageUrl != null);
109
110             return default(IList<ObjectInfo>);
111         }
112
113         public void ShareObject(string account, string container, string objectName, string shareTo, bool read, bool write)
114         {
115             
116             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
117             Contract.Requires(StorageUrl != null);
118             Contract.Requires(!String.IsNullOrWhiteSpace(container));
119             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
120             Contract.Requires(!String.IsNullOrWhiteSpace(account));
121             Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));
122    
123         }
124
125         public AccountInfo GetAccountPolicies(AccountInfo accountInfo)
126         {
127             Contract.Requires(accountInfo!=null);
128
129             return default(AccountInfo);
130         }
131
132         public void UpdateMetadata(ObjectInfo objectInfo)
133         {
134             Contract.Requires(objectInfo!=null);
135
136             return ;
137         }
138         
139         public void UpdateMetadata(ContainerInfo objectInfo)
140         {
141             Contract.Requires(objectInfo!=null);
142
143             return ;
144         }
145
146
147         public IList<ObjectInfo> ListObjects(string account, string container, DateTime? since = null)
148         {
149             
150             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
151             Contract.Requires(StorageUrl != null);
152             Contract.Requires(!String.IsNullOrWhiteSpace(container));
153
154             return default(IList<ObjectInfo>);
155         }
156
157         public IList<ObjectInfo> ListObjects(string account, string container, string folder, DateTime? since = null)
158         {
159             
160             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
161             Contract.Requires(StorageUrl != null);
162             Contract.Requires(!String.IsNullOrWhiteSpace(container));
163             Contract.Requires(!String.IsNullOrWhiteSpace(folder));
164
165             return default(IList<ObjectInfo>);
166         }
167
168         public bool ContainerExists(string account, string container)
169         {
170             
171             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
172             Contract.Requires(StorageUrl!=null);
173             Contract.Requires(!String.IsNullOrWhiteSpace(container));
174
175             return default(bool);
176         }
177
178         public ContainerInfo GetContainerInfo(string account, string container)
179         {
180             
181             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
182             Contract.Requires(StorageUrl!=null);
183             Contract.Requires(!String.IsNullOrWhiteSpace(container));
184
185             return default(ContainerInfo);
186         }
187
188         public void CreateContainer(string account, string container)
189         {
190             
191             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
192             Contract.Requires(StorageUrl!=null);
193             Contract.Requires(!String.IsNullOrWhiteSpace(container));
194         }
195
196         public void DeleteContainer(string account, string container)
197         {
198             
199             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
200             Contract.Requires(StorageUrl!=null);
201             Contract.Requires(!String.IsNullOrWhiteSpace(container));
202         }
203
204         public Task GetObject(string account, string container, string objectName, string fileName)
205         {
206             
207             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
208             Contract.Requires(StorageUrl!=null);
209             Contract.Requires(!String.IsNullOrWhiteSpace(container));
210             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
211
212             return default(Task);
213         }
214
215         public Task PutObject(string account, string container, string objectName, string fileName, string hash = null, string contentType = "application/octet-stream")
216         {
217             
218             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
219             Contract.Requires(StorageUrl!=null);
220             Contract.Requires(!String.IsNullOrWhiteSpace(container));
221             Contract.Requires(!String.IsNullOrWhiteSpace(fileName));                        
222             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
223             Contract.Requires(!String.IsNullOrWhiteSpace(contentType));
224
225             return default(Task);
226         }
227
228         public void DeleteObject(string account, string container, string objectName)
229         {
230             
231             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
232             Contract.Requires(StorageUrl!=null);
233             Contract.Requires(!String.IsNullOrWhiteSpace(container));
234             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));            
235         }
236
237         public void MoveObject(string account, string sourceContainer, string oldObjectName, string targetContainer, string newObjectName)
238         {
239             
240             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
241             Contract.Requires(StorageUrl!=null);
242             Contract.Requires(!String.IsNullOrWhiteSpace(sourceContainer));
243             Contract.Requires(!String.IsNullOrWhiteSpace(oldObjectName));
244             Contract.Requires(!String.IsNullOrWhiteSpace(targetContainer));
245             Contract.Requires(!String.IsNullOrWhiteSpace(newObjectName));
246         }
247
248         public bool ObjectExists(string account, string container, string objectName)
249         {
250             
251             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
252             Contract.Requires(StorageUrl!=null);
253             Contract.Requires(!String.IsNullOrWhiteSpace(container));
254             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
255
256             return default(bool);
257         }
258
259         public ObjectInfo GetObjectInfo(string account, string container, string objectName)
260         {
261             
262             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
263             Contract.Requires(StorageUrl!=null);
264             Contract.Requires(!String.IsNullOrWhiteSpace(container));
265             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
266
267             return default(ObjectInfo);
268         }
269
270         public void CreateFolder(string account, string container, string folder)
271         {
272             
273             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
274             Contract.Requires(StorageUrl != null);
275             Contract.Requires(!String.IsNullOrWhiteSpace(container));
276             Contract.Requires(!String.IsNullOrWhiteSpace(folder));            
277         }
278
279         public Task<TreeHash> GetHashMap(string account, string container, string objectName)
280         {
281             
282             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
283             Contract.Requires(StorageUrl != null);
284             Contract.Requires(!String.IsNullOrWhiteSpace(container));
285             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
286
287             return default(Task<TreeHash>);
288         }
289
290         public Task<IList<string>> PutHashMap(string account, string container, string objectName, TreeHash hash)
291         {
292             
293             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
294             Contract.Requires(StorageUrl != null);
295             Contract.Requires(!String.IsNullOrWhiteSpace(container));
296             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
297             Contract.Requires(hash != null);
298
299             return default(Task<IList<string>>);
300         }
301
302         public Task PostBlock(string account, string container, byte[] block, int offset, int count)
303         {
304             
305             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
306             Contract.Requires(StorageUrl != null);
307             Contract.Requires(!String.IsNullOrWhiteSpace(container));
308             Contract.Requires(block != null);
309             Contract.Requires(offset>=0);
310             Contract.Requires(offset < block.Length);
311             Contract.Requires(count>=0);
312             Contract.Requires(count <= block.Length);
313             
314             return default(Task);
315         }
316
317         public Task<byte[]> GetBlock(string account, string container, Uri relativeUrl, long start, long? end)
318         {
319             
320             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
321             Contract.Requires(StorageUrl != null);
322             Contract.Requires(!String.IsNullOrWhiteSpace(container));
323             Contract.Requires(relativeUrl!=null);
324             Contract.Requires(start>=0);
325             Contract.Requires(end==null || end>=0);
326
327             return default(Task<byte[]>);
328         }
329
330     }
331 }