/// <summary>
 /// Puts the block list.
 /// </summary>
 /// <param name="requestState">State of the request.</param>
 private void PutBlockList(AsyncWebRequestState requestState)
 {
     if (!this.cancellationTokens.IsCancellationRequested)
     {
         var webRequest = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(this.request.PutBlockBlobListUri());
         webRequest.Method = RequestType.Put.ToString();
         webRequest.Headers[MsVersionHeader] = Constants.HeaderVersion;
         requestState.WebRequestState        = webRequest;
         webRequest.BeginGetRequestStream(new AsyncCallback(this.BlockListWriteToStreamCallback), requestState);
     }
 }
        /// <summary>
        /// Reads the HTTP response callback.
        /// </summary>
        /// <param name="asynchronousResult">The asynchronous result.</param>
        private void ReadHttpResponseCallback(IAsyncResult asynchronousResult)
        {
            if (!this.cancellationTokens.IsCancellationRequested)
            {
                AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState;
                try
                {
                    HttpWebRequest webRequest = (HttpWebRequest)requestState.WebRequestState;
                    if (webRequest.HaveResponse && asynchronousResult.IsCompleted)
                    {
                        requestState.RequestPayload.IsTransported = true;
                    }
                }
                catch (Exception ex)
                {
                    if (requestState != null)
                    {
                        if (requestState.RequestPayload.RetryCount <= Constants.RetryLimit)
                        {
                            requestState.RequestPayload.RetryCount++;
                            this.UploadFileChunk(requestState.RequestPayload, requestState.FileToUpload);
                        }
                        else
                        {
                            this.cancellationTokens.Cancel();
                            this.NotifyClient(UploadCompleteReason.ErrorOccurred, ex.Message);
                        }
                    }
                }

                lock (this.lockingObject)
                {
                    if (this.packets.Count > 1)
                    {
                        if (this.IsUploadFinished())
                        {
                            this.PutBlockList(requestState);
                        }
                    }
                    else
                    {
                        this.NotifyClient(UploadCompleteReason.UploadCommitted);
                    }
                }
            }
        }
 /// <summary>
 /// Blocks the list write to stream callback.
 /// </summary>
 /// <param name="asynchronousResult">The asynchronous result.</param>
 private void BlockListWriteToStreamCallback(IAsyncResult asynchronousResult)
 {
     if (!this.cancellationTokens.IsCancellationRequested)
     {
         AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState;
         HttpWebRequest       webRequest   = (HttpWebRequest)requestState.WebRequestState;
         Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult);
         var    writer        = XmlWriter.Create(requestStream, new XmlWriterSettings()
         {
             Encoding = Encoding.UTF8
         });
         RequestGenerator.UncommittedBlockBlobList(this.packets.Count()).Save(writer);
         writer.Flush();
         requestStream.Close();
         requestState.WebRequestState = webRequest;
         webRequest.BeginGetResponse(new AsyncCallback(this.BlockListReadHttpResponseCallback), requestState);
     }
 }
 /// <summary>
 /// Writes to stream callback.
 /// </summary>
 /// <param name="asynchronousResult">The asynchronous result.</param>
 private void WriteToStreamCallback(IAsyncResult asynchronousResult)
 {
     if (!this.cancellationTokens.IsCancellationRequested)
     {
         AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState;
         HttpWebRequest       webRequest   = (HttpWebRequest)requestState.WebRequestState;
         Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult);
         requestStream.Write(requestState.RequestPayload.GetPayload(), 0, requestState.RequestPayload.GetPayload().Length);
         requestStream.Close();
         var webRequestState = new AsyncWebRequestState()
         {
             WebRequestState = webRequest,
             RequestPayload  = requestState.RequestPayload,
             FileToUpload    = requestState.FileToUpload
         };
         webRequest.BeginGetResponse(new AsyncCallback(this.ReadHttpResponseCallback), webRequestState);
     }
 }
 /// <summary>
 /// Uploads the file chunk.
 /// </summary>
 /// <param name="requestPayload">The request payload.</param>
 /// <param name="fileToUpload">The file to upload.</param>
 /// <param name="blockUri">The block URI.</param>
 private void UploadFileChunk(DataPacket requestPayload, UserFile fileToUpload, Uri blockUri = null)
 {
     if (!this.cancellationTokens.IsCancellationRequested)
     {
         if (requestPayload != null && fileToUpload != null)
         {
             HttpWebRequest webRequest = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(blockUri == null ? this.request.SASUrl : blockUri);
             webRequest.Method = RequestType.Put.ToString();
             var webRequestState = new AsyncWebRequestState()
             {
                 WebRequestState = webRequest,
                 RequestPayload  = requestPayload,
                 FileToUpload    = fileToUpload
             };
             webRequest.BeginGetRequestStream(new AsyncCallback(this.WriteToStreamCallback), webRequestState);
         }
     }
 }
        /// <summary>
        /// Blocks the list read HTTP response callback.
        /// </summary>
        /// <param name="asynchronousResult">The asynchronous result.</param>
        private void BlockListReadHttpResponseCallback(IAsyncResult asynchronousResult)
        {
            if (!this.cancellationTokens.IsCancellationRequested)
            {
                AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState;
                try
                {
                    HttpWebRequest  webRequest  = (HttpWebRequest)requestState.WebRequestState;
                    HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
                    StreamReader    reader      = new StreamReader(webResponse.GetResponseStream());
                    reader.ReadToEnd();
                    reader.Close();
                }
                catch (Exception ex)
                {
                    this.NotifyClient(UploadCompleteReason.ErrorOccurred, ex.Message);
                }

                this.NotifyClient(UploadCompleteReason.UploadCommitted);
            }
        }