DocSpace-buildtools/thirdparty/AppLimit.CloudComputing.SharpBox/CloudStorageAsyncFunctions.cs
2020-03-13 16:40:58 +03:00

210 lines
6.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using AppLimit.CloudComputing.SharpBox.Common;
namespace AppLimit.CloudComputing.SharpBox
{
public partial class CloudStorage
{
#region Async Functions
internal class BackgroundRequest : AsyncObjectRequest
{
public object OperationResult;
public object OperationParameter;
}
internal class OpenRequest : BackgroundRequest
{
public ICloudStorageConfiguration config;
public ICloudStorageAccessToken token;
}
/// <summary>
/// This method implements a asyncallback for the open
/// request, which is describe in BeginOpenRequest
/// </summary>
/// <param name="state">A reference to the start object</param>
private void OpenRequestCallback(object state)
{
// cast the request
var req = state as OpenRequest;
try
{
// perform the request
req.OperationResult = Open(req.config, req.token);
}
catch (Exception e)
{
// failure to login
var openRequest = req.result.AsyncState as BackgroundRequest;
openRequest.OperationResult = null;
openRequest.errorReason = e;
}
// call the async callback
req.callback(req.result);
}
/// <summary>
/// Starts the async open request
/// </summary>
/// <param name="callback"></param>
/// <param name="configuration"></param>
/// <param name="token"></param>
/// <returns></returns>
public IAsyncResult BeginOpenRequest(AsyncCallback callback, ICloudStorageConfiguration configuration, ICloudStorageAccessToken token)
{
// build the request data structure
var request = new OpenRequest { callback = callback };
request.result = new AsyncResultEx(request);
request.config = configuration;
request.token = token;
// add to threadpool
ThreadPool.QueueUserWorkItem(OpenRequestCallback, request);
// return the result
return request.result;
}
/// <summary>
/// Finishs the async open request
/// </summary>
/// <param name="asyncResult"></param>
/// <returns></returns>
public ICloudStorageAccessToken EndOpenRequest(IAsyncResult asyncResult)
{
var req = asyncResult.AsyncState as OpenRequest;
return req.OperationResult as ICloudStorageAccessToken;
}
/// <summary>
/// This method implements a asyncallback for the get childs
/// request, which is describe in BeginGetChildsRequest
/// </summary>
/// <param name="state"></param>
private static void GetChildsRequestCallback(object state)
{
// cast the request
var req = state as BackgroundRequest;
try
{
var retList = new List<ICloudFileSystemEntry>();
foreach (var e in req.OperationParameter as ICloudDirectoryEntry)
{
retList.Add(e);
}
req.OperationResult = retList;
}
catch (Exception e)
{
// failure to login
var openRequest = req.result.AsyncState as BackgroundRequest;
openRequest.OperationResult = null;
openRequest.errorReason = e;
}
// call the async callback
req.callback(req.result);
}
/// <summary>
/// Starts the asyn get childs call
/// </summary>
/// <param name="callback"></param>
/// <param name="parent"></param>
/// <returns></returns>
public IAsyncResult BeginGetChildsRequest(AsyncCallback callback, ICloudDirectoryEntry parent)
{
// build the request data structure
var request = new BackgroundRequest();
request.callback = callback;
request.result = new AsyncResultEx(request);
request.OperationParameter = parent;
// add to threadpool
ThreadPool.QueueUserWorkItem(GetChildsRequestCallback, request);
// return the result
return request.result;
}
/// <summary>
/// Finishes the async get childs call
/// </summary>
/// <param name="asyncResult"></param>
/// <returns></returns>
public List<ICloudFileSystemEntry> EndGetChildsRequest(IAsyncResult asyncResult)
{
var req = asyncResult.AsyncState as BackgroundRequest;
return req.OperationResult as List<ICloudFileSystemEntry>;
}
/// <summary>
/// This method implements a asyncallback for the getroot
/// request, which is describe in BeginGetRootRequest
/// </summary>
/// <param name="state"></param>
private void GetRootRequestCallback(object state)
{
// cast the request
var req = state as BackgroundRequest;
try
{
req.OperationResult = GetRoot();
}
catch (Exception e)
{
// failure to login
var openRequest = req.result.AsyncState as BackgroundRequest;
openRequest.OperationResult = null;
openRequest.errorReason = e;
}
// call the async callback
req.callback(req.result);
}
/// <summary>
/// Starts the asyn getRoot call
/// </summary>
/// <param name="callback"></param>
/// <returns></returns>
public IAsyncResult BeginGetRootRequest(AsyncCallback callback)
{
// build the request data structure
var request = new BackgroundRequest { callback = callback };
request.result = new AsyncResultEx(request);
request.OperationParameter = null;
// add to threadpool
ThreadPool.QueueUserWorkItem(GetRootRequestCallback, request);
// return the result
return request.result;
}
/// <summary>
/// Finishes the async getRoot call
/// </summary>
/// <param name="asyncResult"></param>
/// <returns></returns>
public ICloudDirectoryEntry EndGetRootRequest(IAsyncResult asyncResult)
{
var req = asyncResult.AsyncState as BackgroundRequest;
return req.OperationResult as ICloudDirectoryEntry;
}
#endregion
}
}