2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
4 using System.Threading.Tasks;
5 using Pithos.Interfaces;
7 namespace Pithos.Network
9 [ContractClass(typeof(ICloudClientContract))]
10 public interface ICloudClient
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; }
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);
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);
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);
49 [ContractClassFor(typeof(ICloudClient))]
50 public abstract class ICloudClientContract:ICloudClient
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; }
60 public string AuthenticationUrl { get; set; }
62 public bool UsePithos { get; set; }
64 public void Authenticate(string userName, string apiKey)
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");
70 Contract.Ensures(apiKey==ApiKey);
71 Contract.Ensures(userName==UserName);
72 Contract.Ensures(StorageUrl!=null);
73 Contract.Ensures(!String.IsNullOrWhiteSpace(Token));
77 public IList<ContainerInfo> ListContainers()
79 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
80 Contract.Requires(StorageUrl!=null);
82 return default(IList<ContainerInfo>);
85 public IList<ObjectInfo> ListObjects(string container, DateTime? since = null)
87 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
88 Contract.Requires(StorageUrl != null);
89 Contract.Requires(!String.IsNullOrWhiteSpace(container));
91 return default(IList<ObjectInfo>);
94 public IList<ObjectInfo> ListObjects(string container, string folder, DateTime? since = null)
96 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
97 Contract.Requires(StorageUrl != null);
98 Contract.Requires(!String.IsNullOrWhiteSpace(container));
99 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
101 return default(IList<ObjectInfo>);
104 public bool ContainerExists(string container)
106 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
107 Contract.Requires(StorageUrl!=null);
108 Contract.Requires(!String.IsNullOrWhiteSpace(container));
110 return default(bool);
113 public ContainerInfo GetContainerInfo(string container)
115 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
116 Contract.Requires(StorageUrl!=null);
117 Contract.Requires(!String.IsNullOrWhiteSpace(container));
119 return default(ContainerInfo);
122 public void CreateContainer(string container)
124 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
125 Contract.Requires(StorageUrl!=null);
126 Contract.Requires(!String.IsNullOrWhiteSpace(container));
129 public void DeleteContainer(string container)
131 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
132 Contract.Requires(StorageUrl!=null);
133 Contract.Requires(!String.IsNullOrWhiteSpace(container));
136 public Task GetObject(string container, string objectName, string fileName)
138 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
139 Contract.Requires(StorageUrl!=null);
140 Contract.Requires(!String.IsNullOrWhiteSpace(container));
141 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
143 return default(Task);
146 public Task PutObject(string container, string objectName, string fileName, string hash = null)
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));
154 return default(Task);
157 public void DeleteObject(string container, string objectName, string trashContainer)
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));
166 public void DeleteObject(string container, string objectName)
168 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
169 Contract.Requires(StorageUrl!=null);
170 Contract.Requires(!String.IsNullOrWhiteSpace(container));
171 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
174 public void MoveObject(string sourceContainer, string oldObjectName, string targetContainer,string newObjectName)
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));
184 public bool ObjectExists(string container,string objectName)
186 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
187 Contract.Requires(StorageUrl!=null);
188 Contract.Requires(!String.IsNullOrWhiteSpace(container));
189 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
191 return default(bool);
194 public ObjectInfo GetObjectInfo(string container,string objectName)
196 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
197 Contract.Requires(StorageUrl!=null);
198 Contract.Requires(!String.IsNullOrWhiteSpace(container));
199 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
201 return default(ObjectInfo);
204 public void CreateFolder(string container, string folder)
206 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
207 Contract.Requires(StorageUrl != null);
208 Contract.Requires(!String.IsNullOrWhiteSpace(container));
209 Contract.Requires(!String.IsNullOrWhiteSpace(folder));
212 public Task<TreeHash> GetHashMap(string container, string objectName)
214 Contract.Requires(!String.IsNullOrWhiteSpace(Token));
215 Contract.Requires(StorageUrl != null);
216 Contract.Requires(!String.IsNullOrWhiteSpace(container));
217 Contract.Requires(!String.IsNullOrWhiteSpace(objectName));
219 return default(Task<TreeHash>);
222 public Task<IList<string>> PutHashMap(string container, string objectName, TreeHash hash)
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);
230 return default(Task<IList<string>>);
233 public Task PostBlock(string container,byte[] block,int offset,int count)
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);
244 return default(Task);
247 public Task<byte[]> GetBlock(string container, Uri relativeUrl, long start, long? end)
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);
256 return default(Task<byte[]>);
260 public class ContainerInfo
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; }
268 public static ContainerInfo Empty=new ContainerInfo();