Exemple #1
0
        protected override IEnumerator <IAsyncResult> CreateQueueImpl(IAccountIdentifier identity, string account, string queue, long defaultMessageTtl, long defaultMessageVisibilityTimeout, NameValueCollection metadata, TimeSpan?timeout, RequestContext requestContext, AsyncIteratorContext <CreateQueueResult> context)
        {
            RemainingTime        remainingTime  = new RemainingTime(timeout);
            List <SASPermission> sASPermissions = new List <SASPermission>()
            {
                SASPermission.Write,
                SASPermission.Create
            };
            SASAuthorizationParameters sASAuthorizationParameter = this.authorizationManager.CheckAccessWithMultiplePermissions(identity, account, null, null, PermissionLevel.Write, SasType.AccountSas, SasResourceType.Container, sASPermissions, remainingTime);

            if (metadata == null)
            {
                metadata = new NameValueCollection();
            }
            IStorageAccount storageAccount = this.storageManager.CreateAccountInstance(account);
            IAsyncResult    asyncResult    = base.BeginGetQueueProperties(identity, account, queue, false, sASAuthorizationParameter, new TimeSpan?(remainingTime), requestContext, context.GetResumeCallback(), context.GetResumeState("QueueManager.CreateQueueImpl"));

            yield return(asyncResult);

            QueueProperties queueProperty = null;
            bool            flag          = true;

            try
            {
                queueProperty = base.EndGetQueueProperties(asyncResult);
            }
            catch (ContainerNotFoundException containerNotFoundException)
            {
                flag = false;
            }
            if (!flag)
            {
                Logger <IRestProtocolHeadLogger> .Instance.Info.Log("Contacting XAC Server in order to create the queue");

                storageAccount.Timeout = remainingTime;
                DateTime?nullable = null;
                asyncResult = storageAccount.BeginCreateQueueContainer(queue, nullable, null, QueueHelpers.SerializeMetadata(metadata), context.GetResumeCallback(), context.GetResumeState("QueueManager.CreateQueueImpl"));
                yield return(asyncResult);

                bool flag1 = false;
                try
                {
                    storageAccount.EndCreateQueueContainer(asyncResult);
                }
                catch (ContainerAlreadyExistsException containerAlreadyExistsException)
                {
                    flag1 = true;
                }
                if (flag1)
                {
                    flag        = true;
                    asyncResult = base.BeginGetQueueProperties(identity, account, queue, false, new TimeSpan?(remainingTime), requestContext, context.GetResumeCallback(), context.GetResumeState("QueueManager.CreateQueueImpl"));
                    try
                    {
                        queueProperty = base.EndGetQueueProperties(asyncResult);
                    }
                    catch (ContainerNotFoundException containerNotFoundException1)
                    {
                        flag = false;
                    }
                    if (flag)
                    {
                        if (!QueueHelpers.IsMetadataSame(queueProperty.Metadata, metadata))
                        {
                            throw new ContainerAlreadyExistsException(string.Concat("Queue '", queue, "' already exists, and the metadata is different."));
                        }
                        context.ResultData = CreateQueueResult.AlreadyExists;
                    }
                }
            }
            else
            {
                Logger <IRestProtocolHeadLogger> .Instance.Info.Log("Queue already exists no need to contact XAC Server.");

                if (!QueueHelpers.IsMetadataSame(queueProperty.Metadata, metadata))
                {
                    throw new ContainerAlreadyExistsException(string.Concat("Queue '", queue, "' already exists, and the metadata is different."));
                }
                context.ResultData = CreateQueueResult.AlreadyExists;
            }
        }