Multiple changes to enable delete detection, safer uploading
[pithos-ms-client] / trunk / Pithos.Network / ICloudClient.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
4 using System.Threading.Tasks;
5 using Pithos.Interfaces;
6
7 namespace Pithos.Network
8 {
9     [ContractClass(typeof(ICloudClientContract))]
10     public interface ICloudClient
11     {
12         string ApiKey { get; set; }
13         string UserName { get; set; }
14         Uri StorageUrl { get; set; }
15         string Token { get; set; }
16         bool UsePithos { get; set; }
17         void Authenticate(string userName,string apiKey);
18         Uri Proxy { get; set; }
19         double DownloadPercentLimit { get; set; }
20         double UploadPercentLimit { get; set; }
21         string AuthenticationUrl { get; set; }
22
23
24         IList<ContainerInfo> ListContainers();
25         IList<ObjectInfo> ListObjects(string container,DateTime? since=null);
26         IList<ObjectInfo> ListObjects(string container, string folder, DateTime? since = null); 
27         bool ContainerExists(string container);
28         ContainerInfo GetContainerInfo(string container);
29         void CreateContainer(string container);
30         void DeleteContainer(string container);
31         
32         Task GetObject(string container, string objectName, string fileName);
33         Task PutObject(string container, string objectName, string fileName, string hash = null);
34         void DeleteObject(string container, string objectName, string trashContainer);
35         void DeleteObject(string container, string objectName);
36         void MoveObject(string sourceContainer, string oldObjectName, string targetContainer,string newObjectName);
37         bool ObjectExists(string container,string objectName);
38         ObjectInfo GetObjectInfo(string container, string objectName);
39         void CreateFolder(string container, string folder);
40
41
42         Task<TreeHash> GetHashMap(string container, string objectName);
43         Task<IList<string>> PutHashMap(string container, string objectName, TreeHash hash);
44         Task PostBlock(string container,byte[] block,int offset,int count);
45         Task<byte[]> GetBlock(string container, Uri relativeUrl, long start, long? end);
46     }
47
48
49     [ContractClassFor(typeof(ICloudClient))]
50     public abstract class ICloudClientContract:ICloudClient
51     {
52         public string ApiKey { get; set; }
53         public string UserName { get; set; }
54         public Uri StorageUrl { get; set; }
55         public string Token { get; set; }
56         public Uri Proxy { get; set; }
57         public double DownloadPercentLimit { get; set; }
58         public double UploadPercentLimit { get; set; }
59
60         public string AuthenticationUrl { get; set; }
61
62         public bool UsePithos { get; set; }
63
64         public void Authenticate(string userName, string apiKey)
65         {
66             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(apiKey), "ApiKey must be filled before calling Authenticate");
67             Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(userName), "UserName must be filled before calling Authenticate");
68
69
70             Contract.Ensures(apiKey==ApiKey);
71             Contract.Ensures(userName==UserName);
72             Contract.Ensures(StorageUrl!=null);
73             Contract.Ensures(!String.IsNullOrWhiteSpace(Token));
74             
75         }
76
77         public IList<ContainerInfo> ListContainers()
78         {
79             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
80             Contract.Requires(StorageUrl!=null);            
81
82             return default(IList<ContainerInfo>);
83         }
84
85         public IList<ObjectInfo> ListObjects(string container, DateTime? since = null)
86         {
87             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
88             Contract.Requires(StorageUrl != null);
89             Contract.Requires(!String.IsNullOrWhiteSpace(container));
90
91             return default(IList<ObjectInfo>);
92         }
93
94         public IList<ObjectInfo> ListObjects(string container, string folder, DateTime? since = null)
95         {
96             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
97             Contract.Requires(StorageUrl != null);
98             Contract.Requires(!String.IsNullOrWhiteSpace(container));
99             Contract.Requires(!String.IsNullOrWhiteSpace(folder));
100
101             return default(IList<ObjectInfo>);
102         }
103
104         public bool ContainerExists(string container)
105         {
106             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
107             Contract.Requires(StorageUrl!=null);
108             Contract.Requires(!String.IsNullOrWhiteSpace(container));
109
110             return default(bool);
111         }
112
113         public ContainerInfo GetContainerInfo(string container)
114         {
115             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
116             Contract.Requires(StorageUrl!=null);
117             Contract.Requires(!String.IsNullOrWhiteSpace(container));
118
119             return default(ContainerInfo);
120         }
121
122         public void CreateContainer(string container)
123         {
124             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
125             Contract.Requires(StorageUrl!=null);
126             Contract.Requires(!String.IsNullOrWhiteSpace(container));
127         }
128
129         public void DeleteContainer(string container)
130         {
131             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
132             Contract.Requires(StorageUrl!=null);
133             Contract.Requires(!String.IsNullOrWhiteSpace(container));
134         }
135
136         public Task GetObject(string container, string objectName, string fileName)
137         {
138             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
139             Contract.Requires(StorageUrl!=null);
140             Contract.Requires(!String.IsNullOrWhiteSpace(container));
141             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
142
143             return default(Task);
144         }
145
146         public Task PutObject(string container, string objectName, string fileName, string hash = null)
147         {
148             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
149             Contract.Requires(StorageUrl!=null);
150             Contract.Requires(!String.IsNullOrWhiteSpace(container));
151             Contract.Requires(!String.IsNullOrWhiteSpace(fileName));                        
152             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
153
154             return default(Task);
155         }
156
157         public void DeleteObject(string container, string objectName, string trashContainer)
158         {
159             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
160             Contract.Requires(StorageUrl!=null);
161             Contract.Requires(!String.IsNullOrWhiteSpace(container));
162             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
163             Contract.Requires(!String.IsNullOrWhiteSpace(trashContainer));
164         }
165
166         public void DeleteObject(string container, string objectName)
167         {
168             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
169             Contract.Requires(StorageUrl!=null);
170             Contract.Requires(!String.IsNullOrWhiteSpace(container));
171             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));            
172         }
173
174         public void MoveObject(string sourceContainer, string oldObjectName, string targetContainer,string newObjectName)
175         {
176             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
177             Contract.Requires(StorageUrl!=null);
178             Contract.Requires(!String.IsNullOrWhiteSpace(sourceContainer));
179             Contract.Requires(!String.IsNullOrWhiteSpace(oldObjectName));
180             Contract.Requires(!String.IsNullOrWhiteSpace(targetContainer));
181             Contract.Requires(!String.IsNullOrWhiteSpace(newObjectName));
182         }
183
184         public bool ObjectExists(string container,string objectName)
185         {
186             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
187             Contract.Requires(StorageUrl!=null);
188             Contract.Requires(!String.IsNullOrWhiteSpace(container));
189             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
190
191             return default(bool);
192         }
193
194         public ObjectInfo GetObjectInfo(string container,string objectName)
195         {
196             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
197             Contract.Requires(StorageUrl!=null);
198             Contract.Requires(!String.IsNullOrWhiteSpace(container));
199             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
200
201             return default(ObjectInfo);
202         }
203
204         public void CreateFolder(string container, string folder)
205         {
206             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
207             Contract.Requires(StorageUrl != null);
208             Contract.Requires(!String.IsNullOrWhiteSpace(container));
209             Contract.Requires(!String.IsNullOrWhiteSpace(folder));            
210         }
211
212         public Task<TreeHash> GetHashMap(string container, string objectName)
213         {
214             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
215             Contract.Requires(StorageUrl != null);
216             Contract.Requires(!String.IsNullOrWhiteSpace(container));
217             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
218
219             return default(Task<TreeHash>);
220         }
221
222         public Task<IList<string>> PutHashMap(string container, string objectName, TreeHash hash)
223         {
224             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
225             Contract.Requires(StorageUrl != null);
226             Contract.Requires(!String.IsNullOrWhiteSpace(container));
227             Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
228             Contract.Requires(hash != null);
229
230             return default(Task<IList<string>>);
231         }
232
233         public Task PostBlock(string container,byte[] block,int offset,int count)
234         {
235             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
236             Contract.Requires(StorageUrl != null);
237             Contract.Requires(!String.IsNullOrWhiteSpace(container));
238             Contract.Requires(block != null);
239             Contract.Requires(offset>=0);
240             Contract.Requires(offset < block.Length);
241             Contract.Requires(count>=0);
242             Contract.Requires(count <= block.Length);
243             
244             return default(Task);
245         }
246
247         public Task<byte[]> GetBlock(string container, Uri relativeUrl, long start, long? end)
248         {
249             Contract.Requires(!String.IsNullOrWhiteSpace(Token));
250             Contract.Requires(StorageUrl != null);
251             Contract.Requires(!String.IsNullOrWhiteSpace(container));
252             Contract.Requires(relativeUrl!=null);
253             Contract.Requires(start>=0);
254             Contract.Requires(end==null || end>=0);
255
256             return default(Task<byte[]>);
257         }
258     }
259
260     public class ContainerInfo
261     {
262         public string Name { get; set; }
263         public long Count { get; set; }
264         public long Bytes { get; set; }
265         public string BlockHash { get; set; }
266         public int BlockSize { get; set; }
267
268         public static ContainerInfo Empty=new ContainerInfo();
269     }
270 }