#region
/* -----------------------------------------------------------------------
*
*
* Copyright 2011-2012 GRNET S.A. All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
*
* THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and
* documentation are those of the authors and should not be
* interpreted as representing official policies, either expressed
* or implied, of GRNET S.A.
*
* -----------------------------------------------------------------------
*/
#endregion
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Pithos.Interfaces;
namespace Pithos.Network
{
[ContractClass(typeof(ICloudClientContract))]
public interface ICloudClient
{
string ApiKey { get; set; }
string UserName { get; set; }
Uri StorageUrl { get; set; }
string Token { get; set; }
bool UsePithos { get; set; }
Task Authenticate();
//WebProxy Proxy { get; set; }
double DownloadPercentLimit { get; set; }
double UploadPercentLimit { get; set; }
string AuthenticationUrl { get; set; }
#region Container operations
Task> ListContainers(string account);
IList ListObjects(string account, Uri container, DateTimeOffset? since = null);
IList ListObjects(string account, Uri container, Uri folder, DateTimeOffset? since = null);
Task ContainerExists(string account, Uri container);
Task GetContainerInfo(string account, Uri container);
Task CreateContainer(string account, Uri container);
Task DeleteContainer(string account, Uri container);
#endregion
#region Object operations
Task GetObject(string account, Uri container, Uri objectName, string fileName, CancellationToken cancellationToken);
Task PutObject(string account, Uri container, Uri objectName, string fileName, string hash = null, string contentType = "application/octet-stream");
Task DeleteObject(string account, Uri container, Uri objectName, bool isDirectory);
//void DeleteObject(string container, string objectName, string account = null);
Task MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName);
Task ObjectExists(string account, Uri container, Uri objectName);
Task GetObjectInfo(string account, Uri container, Uri objectName);
Task CreateFolder(string account, Uri container, Uri folder);
#endregion
#region Hashmap operations
Task GetHashMap(string account, Uri container, Uri objectName);
Task> PutHashMap(string account, Uri container, Uri objectName, TreeHash hash);
Task PostBlock(string account, Uri container, byte[] block, int offset, int count,string blockHash, CancellationToken token);
Task GetBlock(string account, Uri container, Uri relativeUrl, long start, long? end, CancellationToken cancellationToken);
#endregion
#region Sharing operations
IList ListSharedObjects(HashSet knownContainers, DateTimeOffset? since);
void ShareObject(string account, Uri container, Uri objectName, string shareTo, bool read, bool write);
#endregion
Task GetAccountPolicies(AccountInfo accountInfo);
void UpdateMetadata(ObjectInfo objectInfo);
void UpdateMetadata(ContainerInfo Container);
IList ListSharingAccounts(DateTime? since=null);
Task WipeContainer(string account, Uri container);
}
[ContractClassFor(typeof(ICloudClient))]
public abstract class ICloudClientContract:ICloudClient
{
public string ApiKey { get; set; }
public string UserName { get; set; }
public Uri StorageUrl { get; set; }
public string Token { get; set; }
public double DownloadPercentLimit { get; set; }
public double UploadPercentLimit { get; set; }
public string AuthenticationUrl { get; set; }
public bool UsePithos { get; set; }
public Task Authenticate()
{
Contract.Requires(!String.IsNullOrWhiteSpace(ApiKey), "ApiKey must be filled before calling Authenticate");
Contract.Requires(!String.IsNullOrWhiteSpace(UserName), "UserName must be filled before calling Authenticate");
return default(Task);
}
public Task> ListContainers(string account)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
return default(Task>);
}
public IList ListSharedObjects(HashSet knownContainers, DateTimeOffset? since)
{
Contract.Requires(knownContainers!=null);
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
return default(IList);
}
public void ShareObject(string account, Uri container, Uri objectName, string shareTo, bool read, bool write)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container!=null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
Contract.Requires(!String.IsNullOrWhiteSpace(account));
Contract.Requires(!String.IsNullOrWhiteSpace(shareTo));
}
public Task GetAccountPolicies(AccountInfo accountInfo)
{
Contract.Requires(accountInfo!=null);
return default(Task);
}
public void UpdateMetadata(ObjectInfo objectInfo)
{
Contract.Requires(objectInfo!=null);
return ;
}
public void UpdateMetadata(ContainerInfo objectInfo)
{
Contract.Requires(objectInfo!=null);
return ;
}
public IList ListSharingAccounts(DateTime? since = new DateTime?())
{
return default(IList);
}
public Task WipeContainer(string account, Uri container)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
return default(Task);
}
public IList ListObjects(string account, Uri container, DateTimeOffset? since = null)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
return default(IList);
}
public IList ListObjects(string account, Uri container, Uri folder, DateTimeOffset? since = null)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
//Contract.Requires(!String.IsNullOrWhiteSpace(folder));
return default(IList);
}
public Task ContainerExists(string account, Uri container)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
return default(Task);
}
public Task GetContainerInfo(string account, Uri container)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
return default(Task);
}
public Task CreateContainer(string account, Uri container)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
return default(Task);
}
public Task DeleteContainer(string account, Uri container)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
return default(Task);
}
public Task GetObject(string account, Uri container, Uri objectName, string fileName, CancellationToken cancellationToken)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
return default(Task);
}
public Task PutObject(string account, Uri container, Uri objectName, string fileName, string hash = null, string contentType = "application/octet-stream")
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(!String.IsNullOrWhiteSpace(fileName));
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
Contract.Requires(!String.IsNullOrWhiteSpace(contentType));
return default(Task);
}
public Task DeleteObject(string account, Uri container, Uri objectName, bool isDirectory)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
return default(Task);
}
public Task MoveObject(string account, Uri sourceContainer, Uri oldObjectName, Uri targetContainer, Uri newObjectName)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(sourceContainer != null);
Contract.Requires(!sourceContainer.IsAbsoluteUri);
Contract.Requires(oldObjectName != null);
Contract.Requires(!oldObjectName.IsAbsoluteUri);
Contract.Requires(targetContainer != null);
Contract.Requires(!targetContainer.IsAbsoluteUri);
Contract.Requires(newObjectName != null);
Contract.Requires(!newObjectName.IsAbsoluteUri);
return default(Task);
}
public Task ObjectExists(string account, Uri container, Uri objectName)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
return default(Task);
}
public Task GetObjectInfo(string account, Uri container, Uri objectName)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl!=null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
return default(Task);
}
public Task CreateFolder(string account, Uri container, Uri folder)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(folder != null);
Contract.Requires(!folder .IsAbsoluteUri);
return default(Task);
}
public Task GetHashMap(string account, Uri container, Uri objectName)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
return default(Task);
}
public Task> PutHashMap(string account, Uri container, Uri objectName, TreeHash hash)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(objectName != null);
Contract.Requires(!objectName.IsAbsoluteUri);
Contract.Requires(hash != null);
return default(Task>);
}
public Task PostBlock(string account, Uri container, byte[] block, int offset, int count, string blockHash,CancellationToken token)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(block != null);
Contract.Requires(offset>=0);
Contract.Requires(offset < block.Length);
Contract.Requires(count>=0);
Contract.Requires(count <= block.Length);
return default(Task);
}
public Task GetBlock(string account, Uri container, Uri relativeUrl, long start, long? end, CancellationToken cancellationToken)
{
Contract.Requires(!String.IsNullOrWhiteSpace(Token));
Contract.Requires(StorageUrl != null);
Contract.Requires(container != null);
Contract.Requires(!container.IsAbsoluteUri);
Contract.Requires(relativeUrl != null);
Contract.Requires(start>=0);
Contract.Requires(end==null || end>=0);
return default(Task);
}
}
}