Mark Radbourne / Mbed 2 deprecated iothub_client_sample_amqp

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers cbs.c Source File

cbs.c

00001 // Copyright (c) Microsoft. All rights reserved.
00002 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
00003 
00004 #include <stdlib.h>
00005 #ifdef _CRTDBG_MAP_ALLOC
00006 #include <crtdbg.h>
00007 #endif
00008 
00009 #include <stdbool.h>
00010 #include <stdio.h>
00011 #include <string.h>
00012 #include "azure_uamqp_c/cbs.h"
00013 #include "azure_uamqp_c/amqp_management.h"
00014 #include "azure_uamqp_c/amqpalloc.h"
00015 #include "azure_uamqp_c/session.h"
00016 
00017 typedef struct CBS_INSTANCE_TAG
00018 {
00019     AMQP_MANAGEMENT_HANDLE amqp_management;
00020 } CBS_INSTANCE;
00021 
00022 static int add_string_key_value_pair_to_map(AMQP_VALUE map, const char* key, const char* value)
00023 {
00024     int result;
00025 
00026     AMQP_VALUE key_value = amqpvalue_create_string(key);
00027     if (key == NULL)
00028     {
00029         result = __LINE__;
00030     }
00031     else
00032     {
00033         AMQP_VALUE value_value = amqpvalue_create_string(value);
00034         if (value_value == NULL)
00035         {
00036             result = __LINE__;
00037         }
00038         else
00039         {
00040             if (amqpvalue_set_map_value(map, key_value, value_value) != 0)
00041             {
00042                 result = __LINE__;
00043             }
00044             else
00045             {
00046                 result = 0;
00047             }
00048 
00049             amqpvalue_destroy(key_value);
00050         }
00051 
00052         amqpvalue_destroy(value_value);
00053     }
00054 
00055     return result;
00056 }
00057 
00058 static int set_pending_operation_properties(MESSAGE_HANDLE message)
00059 {
00060     int result = 0;
00061 
00062     PROPERTIES_HANDLE properties = properties_create();
00063     if (properties == NULL)
00064     {
00065         result = __LINE__;
00066     }
00067     else
00068     {
00069         AMQP_VALUE reply_to = amqpvalue_create_address_string("cbs");
00070         if (reply_to == NULL)
00071         {
00072             result = __LINE__;
00073         }
00074         else
00075         {
00076             if (properties_set_reply_to(properties, reply_to) != 0)
00077             {
00078                 result = __LINE__;
00079             }
00080 
00081             amqpvalue_destroy(reply_to);
00082         }
00083 
00084         AMQP_VALUE message_id = amqpvalue_create_message_id_ulong(0x43);
00085         if (message_id == NULL)
00086         {
00087             result = __LINE__;
00088         }
00089         else
00090         {
00091             if (properties_set_message_id(properties, message_id) != 0)
00092             {
00093                 result = __LINE__;
00094             }
00095 
00096             amqpvalue_destroy(message_id);
00097         }
00098 
00099         if (message_set_properties(message, properties) != 0)
00100         {
00101             result = __LINE__;
00102         }
00103 
00104         properties_destroy(properties);
00105     }
00106 
00107     return result;
00108 }
00109 
00110 CBS_HANDLE cbs_create(SESSION_HANDLE session, ON_AMQP_MANAGEMENT_STATE_CHANGED on_amqp_management_state_changed, void* callback_context)
00111 {
00112     CBS_INSTANCE* result;
00113 
00114     if (session == NULL)
00115     {
00116         result = NULL;
00117     }
00118     else
00119     {
00120         result = (CBS_INSTANCE*)amqpalloc_malloc(sizeof(CBS_INSTANCE));
00121         if (result != NULL)
00122         {
00123             result->amqp_management = amqpmanagement_create(session, "$cbs", on_amqp_management_state_changed, callback_context);
00124             if (result->amqp_management == NULL)
00125             {
00126                 amqpalloc_free(result);
00127                 result = NULL;
00128             }
00129         }
00130     }
00131     return result;
00132 }
00133 
00134 void cbs_destroy(CBS_HANDLE cbs)
00135 {
00136     if (cbs != NULL)
00137     {
00138         (void)cbs_close(cbs);
00139         amqpmanagement_destroy(cbs->amqp_management);
00140         amqpalloc_free(cbs);
00141     }
00142 }
00143 
00144 int cbs_open(CBS_HANDLE cbs)
00145 {
00146     int result;
00147 
00148     if (cbs == NULL)
00149     {
00150         result = __LINE__;
00151     }
00152     else
00153     {
00154         if (amqpmanagement_open(cbs->amqp_management) != 0)
00155         {
00156             result = __LINE__;
00157         }
00158         else
00159         {
00160             result = 0;
00161         }
00162     }
00163 
00164     return result;
00165 }
00166 
00167 int cbs_close(CBS_HANDLE cbs)
00168 {
00169     int result;
00170 
00171     if (cbs == NULL)
00172     {
00173         result = __LINE__;
00174     }
00175     else
00176     {
00177         if (amqpmanagement_close(cbs->amqp_management) != 0)
00178         {
00179             result = __LINE__;
00180         }
00181         else
00182         {
00183             result = 0;
00184         }
00185     }
00186 
00187     return result;
00188 }
00189 
00190 int cbs_put_token(CBS_HANDLE cbs, const char* type, const char* audience, const char* token, ON_CBS_OPERATION_COMPLETE on_operation_complete, void* context)
00191 {
00192     int result;
00193 
00194     if ((cbs == NULL) ||
00195         (token == NULL))
00196     {
00197         result = __LINE__;
00198     }
00199     else
00200     {
00201         MESSAGE_HANDLE message = message_create();
00202         if (message == NULL)
00203         {
00204             result = __LINE__;
00205         }
00206         else
00207         {
00208             AMQP_VALUE token_value = amqpvalue_create_string(token);
00209             if (token_value == NULL)
00210             {
00211                 message_destroy(message);
00212                 result = __LINE__;
00213             }
00214             else
00215             {
00216                 if (message_set_body_amqp_value(message, token_value) != 0)
00217                 {
00218                     result = __LINE__;
00219                 }
00220                 else
00221                 {
00222                     AMQP_VALUE application_properties = amqpvalue_create_map();
00223                     if (application_properties == NULL)
00224                     {
00225                         result = __LINE__;
00226                     }
00227                     else
00228                     {
00229                         if (add_string_key_value_pair_to_map(application_properties, "name", audience) != 0)
00230                         {
00231                             result = __LINE__;
00232                         }
00233                         else
00234                         {
00235                             if (message_set_application_properties(message, application_properties) != 0)
00236                             {
00237                                 result = __LINE__;
00238                             }
00239                             else
00240                             {
00241                                 if (set_pending_operation_properties(message) != 0)
00242                                 {
00243                                     result = __LINE__;
00244                                 }
00245                                 else
00246                                 {
00247                                     if (amqpmanagement_start_operation(cbs->amqp_management, "put-token", type, NULL, message, (ON_OPERATION_COMPLETE)on_operation_complete, context) != 0)
00248                                     {
00249                                         result = __LINE__;
00250                                     }
00251                                     else
00252                                     {
00253                                         result = 0;
00254                                     }
00255                                 }
00256                             }
00257                         }
00258 
00259                         amqpvalue_destroy(application_properties);
00260                     }
00261 
00262                     amqpvalue_destroy(token_value);
00263                 }
00264             }
00265 
00266             message_destroy(message);
00267         }
00268     }
00269 
00270     return result;
00271 }
00272 
00273 int cbs_delete_token(CBS_HANDLE cbs, const char* type, const char* audience, ON_CBS_OPERATION_COMPLETE on_operation_complete, void* context)
00274 {
00275     int result;
00276 
00277     if (cbs == NULL)
00278     {
00279         result = __LINE__;
00280     }
00281     else
00282     {
00283         MESSAGE_HANDLE message = message_create();
00284         if (message == NULL)
00285         {
00286             result = __LINE__;
00287         }
00288         else
00289         {
00290             AMQP_VALUE application_properties = amqpvalue_create_map();
00291             if (application_properties == NULL)
00292             {
00293                 result = __LINE__;
00294             }
00295             else
00296             {
00297                 if (add_string_key_value_pair_to_map(application_properties, "name", audience) != 0)
00298                 {
00299                     result = __LINE__;
00300                 }
00301                 else
00302                 {
00303                     if (message_set_application_properties(message, application_properties) != 0)
00304                     {
00305                         result = __LINE__;
00306                     }
00307                     else
00308                     {
00309                         if (set_pending_operation_properties(message) != 0)
00310                         {
00311                             result = __LINE__;
00312                         }
00313                         else
00314                         {
00315                             if (amqpmanagement_start_operation(cbs->amqp_management, "delete-token", type, NULL, message, (ON_OPERATION_COMPLETE)on_operation_complete, context) != 0)
00316                             {
00317                                 result = __LINE__;
00318                             }
00319                             else
00320                             {
00321                                 result = 0;
00322                             }
00323                         }
00324                     }
00325                 }
00326 
00327                 amqpvalue_destroy(application_properties);
00328             }
00329 
00330             message_destroy(message);
00331         }
00332     }
00333     return result;
00334 }
00335 
00336 void cbs_set_trace(CBS_HANDLE cbs, bool traceOn)
00337 {
00338     if (cbs != NULL)
00339     {
00340         amqpmanagement_set_trace(cbs->amqp_management, traceOn);
00341     }
00342 }