public Task DeleteMessageAsync(IDeviceIdentity deviceIdentity, int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);

            if (tableMessage.ETag == null)
            {
                throw new ArgumentException("Transient message cannot be deleted.");
            }

            return(this.table.ExecuteAsync(TableOperation.Delete(tableMessage)));
        }
        public Task SetMessageAsync(int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);
            TableOperation            tableOperation;

            if (tableMessage.ETag == null)
            {
                tableMessage.PartitionKey = CalculatePartitionKey(packetId);
                tableMessage.RowKey       = packetId.ToString(CultureInfo.InvariantCulture);
                tableOperation            = TableOperation.Insert(tableMessage);
            }
            else
            {
                tableOperation = TableOperation.Replace(tableMessage);
            }
            return(this.table.ExecuteAsync(tableOperation));
        }
        public Task SetMessageAsync(IDeviceIdentity deviceIdentity, int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);
            TableOperation            tableOperation;

            if (tableMessage.ETag == null)
            {
                string rowKey = CalculateRowKey(deviceIdentity.Id, packetId);
                tableMessage.PartitionKey = CalculatePartitionKey(rowKey);
                tableMessage.RowKey       = rowKey;
                tableOperation            = TableOperation.Insert(tableMessage);
            }
            else
            {
                tableOperation = TableOperation.Replace(tableMessage);
            }
            return(this.table.ExecuteAsync(tableOperation));
        }