/// <summary>
 /// Event raised upon completion of CreateBobAsync.
 /// </summary>
 /// <param name="e"></param>
 private void OnCreateBlobCompleted(CreateBlobCompletedArgs e)
 {
     if (this.CreateBlobCompleted != null)
     {
         this.CreateBlobCompleted(this, e);
     }
 }
        /// <summary>
        /// Creates a blob associated with a session.
        /// </summary>
        /// <param name="session">A Smash session object.</param>
        /// <param name="fileExtension">File extension for the blob.</param>
        /// <param name="state">State to be passed as userState in the completion event args.</param>
        public void CreateBlobAsync(SmashSession session, string fileExtension, object state)
        {
            if (session == null)
            {
                throw new ArgumentNullException("session");
            }

            IAsyncResult asyncResult = SmashClientREST.CreateBlobAsync(
                session.ClientIdentity,
                session.MeetingToken,
                session.SessionID,
                session.ClientID,
                fileExtension,
                new ServiceAgent<Contracts.CreateBlobResponse>.OnCompleteDelegate(
                    (response) =>
                    {
                        CreateBlobCompletedArgs e = new CreateBlobCompletedArgs(response.Exception, response.Aborted, response.StateObject);
                        if (response.Exception == null && !response.Aborted)
                        {
                            SmashBlobUploader blobUploader = new SmashBlobUploader(session.ClientIdentity, session.MeetingToken, session.SessionID, session.ClientID, response.BlobAddress, response.BlobSharedSignature);

                            e.BlobUploader = blobUploader;
                        }
                        OnCreateBlobCompleted(e);
                    }),
                state);

            SmashClientREST.HandleCompletion(asyncResult, state);
        }