public static Exception GetExceptionFromOutcome(Outcome outcome)
        {
            Exception retException = null;

            if (outcome == null)
            {
                retException = new IotHubException("Unknown error.");
                return(retException);
            }

            if (outcome.DescriptorCode == Rejected.Code)
            {
                var rejected = (Rejected)outcome;
                retException = AmqpErrorMapper.ToIotHubClientContract(rejected.Error);
            }
            else if (outcome.DescriptorCode == Released.Code)
            {
                retException = new OperationCanceledException("AMQP link released.");
            }
            else
            {
                retException = new IotHubException("Unknown error.");
            }

            return(retException);
        }
        protected override async Task OnSendEventAsync(IEnumerable <Message> messages)
        {
            // List to hold messages in Amqp friendly format
            var messageList = new List <Data>();

            foreach (var message in messages)
            {
                using (AmqpMessage amqpMessage = message.ToAmqpMessage())
                {
                    var data = new Data()
                    {
                        Value = MessageConverter.ReadStream(amqpMessage.ToStream())
                    };
                    messageList.Add(data);
                }
            }

            Outcome outcome;

            using (var amqpMessage = AmqpMessage.Create(messageList))
            {
                amqpMessage.MessageFormat = AmqpConstants.AmqpBatchedMessageFormat;
                outcome = await this.SendAmqpMessageAsync(amqpMessage);
            }

            if (outcome.DescriptorCode != Accepted.Code)
            {
                throw AmqpErrorMapper.GetExceptionFromOutcome(outcome);
            }
        }
        protected async override Task OnSendEventAsync(Message message)
        {
            Outcome outcome;

            using (AmqpMessage amqpMessage = message.ToAmqpMessage())
            {
                outcome = await this.SendAmqpMessageAsync(amqpMessage);
            }

            if (outcome.DescriptorCode != Accepted.Code)
            {
                throw AmqpErrorMapper.GetExceptionFromOutcome(outcome);
            }
        }
Beispiel #4
0
        public static Exception ToIotHubClientContract(Exception exception)
        {
            if (exception is TimeoutException)
            {
                return(new IotHubCommunicationException(exception.Message));
            }
            else if (exception is UnauthorizedAccessException)
            {
                return(new UnauthorizedException(exception.Message));
            }
            else
            {
                var amqpException = exception as AmqpException;
                if (amqpException != null)
                {
                    return(AmqpErrorMapper.ToIotHubClientContract(amqpException.Error));
                }

                return(exception);
            }
        }
        async Task DisposeMessageAsync(string lockToken, Outcome outcome)
        {
            var deliveryTag = IotHubConnection.ConvertToDeliveryTag(lockToken);

            Outcome disposeOutcome;

            try
            {
                ReceivingAmqpLink deviceBoundReceivingLink = await this.GetDeviceBoundReceivingLinkAsync();

                disposeOutcome = await deviceBoundReceivingLink.DisposeMessageAsync(deliveryTag, outcome, batchable : true, timeout : this.OperationTimeout);
            }
            catch (Exception exception)
            {
                if (exception.IsFatal())
                {
                    throw;
                }

                throw AmqpClientHelper.ToIotHubClientContract(exception);
            }

            if (disposeOutcome.DescriptorCode != Accepted.Code)
            {
                if (disposeOutcome.DescriptorCode == Rejected.Code)
                {
                    var rejected = (Rejected)disposeOutcome;

                    // Special treatment for NotFound amqp rejected error code in case of DisposeMessage
                    if (rejected.Error != null && rejected.Error.Condition.Equals(AmqpErrorCode.NotFound))
                    {
                        throw new DeviceMessageLockLostException(rejected.Error.Description);
                    }
                }

                throw AmqpErrorMapper.GetExceptionFromOutcome(disposeOutcome);
            }
        }