A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Revision:
7:9e9ab3b0efef
Parent:
6:641a9672db08
Child:
8:20dc883fb313
--- a/link.c	Fri Jul 29 15:58:39 2016 -0700
+++ b/link.c	Fri Aug 12 10:04:13 2016 -0700
@@ -324,16 +324,26 @@
                         {
                             if ((delivery_instance->delivery_id >= first) && (delivery_instance->delivery_id <= last))
                             {
-                                delivery_instance->on_delivery_settled(delivery_instance->callback_context, delivery_instance->delivery_id);
-                                amqpalloc_free(delivery_instance);
-                                if (list_remove(link_instance->pending_deliveries, pending_delivery) != 0)
+                                AMQP_VALUE delivery_state;
+                                if (disposition_get_state(disposition, &delivery_state) != 0)
                                 {
                                     /* error */
-                                    break;
                                 }
                                 else
                                 {
-                                    pending_delivery = next_pending_delivery;
+                                    delivery_instance->on_delivery_settled(delivery_instance->callback_context, delivery_instance->delivery_id, delivery_state);
+                                    amqpalloc_free(delivery_instance);
+                                    if (list_remove(link_instance->pending_deliveries, pending_delivery) != 0)
+                                    {
+                                        /* error */
+                                        break;
+                                    }
+                                    else
+                                    {
+                                        pending_delivery = next_pending_delivery;
+                                    }
+
+                                    amqpvalue_destroy(delivery_state);
                                 }
                             }
                             else
@@ -491,7 +501,7 @@
     (void)send_result;
 	if (link_instance->snd_settle_mode == sender_settle_mode_settled)
 	{
-		delivery_instance->on_delivery_settled(delivery_instance->callback_context, delivery_instance->delivery_id);
+		delivery_instance->on_delivery_settled(delivery_instance->callback_context, delivery_instance->delivery_id, NULL);
 		amqpalloc_free(delivery_instance);
 		(void)list_remove(link_instance->pending_deliveries, delivery_instance_list_item);
 	}
@@ -910,7 +920,7 @@
 	else
 	{
 		if ((link->role != role_sender) ||
-            (link->link_state != LINK_STATE_ATTACHED))
+			(link->link_state != LINK_STATE_ATTACHED))
 		{
 			result = LINK_TRANSFER_ERROR;
 		}
@@ -927,13 +937,12 @@
 			}
 			else
 			{
-				unsigned char delivery_tag_bytes[sizeof(link->delivery_count)];
+                sequence_no delivery_count = link->delivery_count + 1;
+                unsigned char delivery_tag_bytes[sizeof(delivery_count)];
 				delivery_tag delivery_tag;
 				bool settled;
 
-				(void)memcpy(delivery_tag_bytes, &link->delivery_count, sizeof(link->delivery_count));
-
-				link->delivery_count++;
+				(void)memcpy(delivery_tag_bytes, &delivery_count, sizeof(delivery_count));
 
 				delivery_tag.bytes = &delivery_tag_bytes;
 				delivery_tag.length = sizeof(delivery_tag_bytes);
@@ -1001,6 +1010,7 @@
 									break;
 
 								case SESSION_SEND_TRANSFER_OK:
+									link->delivery_count = delivery_count;
 									link->link_credit--;
 									result = LINK_TRANSFER_OK;
 									break;