public ICancellableAsyncResult BeginUploadFromStream(Stream source, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, AsyncCallback callback, object state) { CommonUtils.AssertNotNull("source", source); this.attributes.AssertNoSnapshot(); if (!source.CanSeek) { throw new InvalidOperationException(); } long size = source.Length - source.Position; if ((size % Constants.PageSize) != 0) { throw new ArgumentException(SR.InvalidPageSize, "source"); } BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.PageBlob, this.ServiceClient); DateTime? expiryTime = modifiedOptions.MaximumExecutionTime.HasValue ? DateTime.Now + modifiedOptions.MaximumExecutionTime.Value : (DateTime?)null; OperationContext tempOperationContext = new OperationContext(); ExecutionState<NullType> executionState = new ExecutionState<NullType>(null /* cmd */, modifiedOptions.RetryPolicy, tempOperationContext); ChainedAsyncResult<NullType> chainedResult = new ChainedAsyncResult<NullType>(callback, state); lock (chainedResult.CancellationLockerObject) { ICancellableAsyncResult result = this.BeginOpenWrite( size, accessCondition, modifiedOptions, operationContext, ar => { chainedResult.UpdateCompletedSynchronously(ar.CompletedSynchronously); lock (chainedResult.CancellationLockerObject) { chainedResult.CancelDelegate = null; try { Stream blobStream = this.EndOpenWrite(ar); source.WriteToAsync( blobStream, null /* maxLength */, expiryTime, false, executionState, tempOperationContext, null /* streamCopyState */, completedState => { chainedResult.UpdateCompletedSynchronously(executionState.CompletedSynchronously); try { blobStream.Close(); chainedResult.OnComplete(executionState.ExceptionRef); } catch (Exception e) { chainedResult.OnComplete(e); } }); chainedResult.CancelDelegate = executionState.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } catch (Exception e) { chainedResult.OnComplete(e); } } }, null /* state */); chainedResult.CancelDelegate = result.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } return chainedResult; }
private void WritePagesHandler(Stream pageData, long startOffset, string contentMD5, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, ChainedAsyncResult<NullType> chainedResult) { lock (chainedResult.CancellationLockerObject) { ICancellableAsyncResult result = Executor.BeginExecuteAsync( this.PutPageImpl(pageData, startOffset, contentMD5, accessCondition, options), options.RetryPolicy, operationContext, ar => { chainedResult.UpdateCompletedSynchronously(ar.CompletedSynchronously); try { Executor.EndExecuteAsync<NullType>(ar); chainedResult.OnComplete(); } catch (Exception e) { chainedResult.OnComplete(e); } }, null /* asyncState */); chainedResult.CancelDelegate = result.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } }
private void DeleteIfExistsHandler(DeleteSnapshotsOption deleteSnapshotsOption, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, ChainedAsyncResult<bool> chainedResult) { lock (chainedResult.CancellationLockerObject) { ICancellableAsyncResult savedExistsResult = this.BeginExists( options, operationContext, existsResult => { chainedResult.UpdateCompletedSynchronously(existsResult.CompletedSynchronously); lock (chainedResult.CancellationLockerObject) { chainedResult.CancelDelegate = null; try { bool exists = this.EndExists(existsResult); if (!exists) { chainedResult.Result = false; chainedResult.OnComplete(); return; } ICancellableAsyncResult savedDeleteResult = this.BeginDelete( deleteSnapshotsOption, accessCondition, options, operationContext, deleteResult => { chainedResult.UpdateCompletedSynchronously(deleteResult.CompletedSynchronously); chainedResult.CancelDelegate = null; try { this.EndDelete(deleteResult); chainedResult.Result = true; chainedResult.OnComplete(); } catch (StorageException e) { if (e.RequestInformation.HttpStatusCode == (int)HttpStatusCode.NotFound) { chainedResult.Result = false; chainedResult.OnComplete(); } else { chainedResult.OnComplete(e); } } catch (Exception e) { chainedResult.OnComplete(e); } }, null /* state */); chainedResult.CancelDelegate = savedDeleteResult.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } catch (Exception e) { chainedResult.OnComplete(e); } } }, null /* state */); chainedResult.CancelDelegate = savedExistsResult.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } }
private void UploadFromStreamHandler(Stream source, string contentMD5, AccessCondition accessCondition, OperationContext operationContext, BlobRequestOptions options, ChainedAsyncResult<NullType> chainedResult) { ICancellableAsyncResult result = Executor.BeginExecuteAsync( this.PutBlobImpl(source, contentMD5, accessCondition, options), options.RetryPolicy, operationContext, ar => { chainedResult.UpdateCompletedSynchronously(ar.CompletedSynchronously); try { Executor.EndExecuteAsync<NullType>(ar); chainedResult.OnComplete(); } catch (Exception e) { chainedResult.OnComplete(e); } }, null /* asyncState */); chainedResult.CancelDelegate = result.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } }
private void PutBlockHandler(string blockId, Stream blockData, string contentMD5, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, ChainedAsyncResult<NullType> chainedResult) { lock (chainedResult.CancellationLockerObject) { ICancellableAsyncResult result = Executor.BeginExecuteAsync( this.PutBlockImpl(blockData, blockId, contentMD5, accessCondition, options), options.RetryPolicy, operationContext, ar => { try { Executor.EndExecuteAsync<NullType>(ar); chainedResult.OnComplete(); } catch (Exception e) { chainedResult.OnComplete(e); } }, null /* asyncState */); chainedResult.CancelDelegate = result.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } }
private void CreateIfNotExistsHandler(BlobRequestOptions options, OperationContext operationContext, ChainedAsyncResult<bool> chainedResult) { lock (chainedResult.CancellationLockerObject) { ICancellableAsyncResult savedExistsResult = this.BeginExists( options, operationContext, existsResult => { chainedResult.UpdateCompletedSynchronously(existsResult.CompletedSynchronously); lock (chainedResult.CancellationLockerObject) { chainedResult.CancelDelegate = null; try { bool exists = this.EndExists(existsResult); if (exists) { chainedResult.Result = false; chainedResult.OnComplete(); return; } ICancellableAsyncResult savedCreateResult = this.BeginCreate( options, operationContext, createResult => { chainedResult.UpdateCompletedSynchronously(createResult.CompletedSynchronously); chainedResult.CancelDelegate = null; try { this.EndCreate(createResult); chainedResult.Result = true; chainedResult.OnComplete(); } catch (StorageException e) { if ((e.RequestInformation.ExtendedErrorInformation != null) && (e.RequestInformation.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.ContainerAlreadyExists)) { chainedResult.Result = false; chainedResult.OnComplete(); } else { chainedResult.OnComplete(e); } } catch (Exception e) { chainedResult.OnComplete(e); } }, null /* state */); chainedResult.CancelDelegate = savedCreateResult.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } catch (Exception e) { chainedResult.OnComplete(e); } } }, null /* state */); chainedResult.CancelDelegate = savedExistsResult.Cancel; if (chainedResult.CancelRequested) { chainedResult.Cancel(); } } }