A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Jul 28 09:52:29 2017 -0700
Revision:
30:0407b2db334c
Parent:
28:add19eb7defa
Child:
35:d0bed2404ee9
1.1.20

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:6ae2f7bca550 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:6ae2f7bca550 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:6ae2f7bca550 3
Azure.IoT Build 0:6ae2f7bca550 4 #include <stdlib.h>
Azure.IoT Build 0:6ae2f7bca550 5 #include <stdint.h>
AzureIoTClient 30:0407b2db334c 6 #include <inttypes.h>
Azure.IoT Build 0:6ae2f7bca550 7 #include <stddef.h>
Azure.IoT Build 0:6ae2f7bca550 8 #include <string.h>
Azure.IoT Build 0:6ae2f7bca550 9 #include <stdio.h>
AzureIoTClient 19:000ab4e6a2c1 10 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 21:f9c433d8e6ca 11 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:6ae2f7bca550 12 #include "azure_uamqp_c/amqpvalue_to_string.h"
Azure.IoT Build 0:6ae2f7bca550 13 #include "azure_uamqp_c/amqpvalue.h"
Azure.IoT Build 0:6ae2f7bca550 14
Azure.IoT Build 0:6ae2f7bca550 15 #if _WIN32
Azure.IoT Build 0:6ae2f7bca550 16 /* The MS runtime does not have snprintf */
Azure.IoT Build 0:6ae2f7bca550 17 #define snprintf _snprintf
Azure.IoT Build 0:6ae2f7bca550 18 #endif
Azure.IoT Build 0:6ae2f7bca550 19
Azure.IoT Build 0:6ae2f7bca550 20 static int string_concat(char** string, const char* to_concat)
Azure.IoT Build 0:6ae2f7bca550 21 {
AzureIoTClient 28:add19eb7defa 22 int result;
Azure.IoT Build 0:6ae2f7bca550 23
AzureIoTClient 28:add19eb7defa 24 if ((string == NULL) ||
AzureIoTClient 28:add19eb7defa 25 (to_concat == NULL))
AzureIoTClient 28:add19eb7defa 26 {
AzureIoTClient 28:add19eb7defa 27 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 28 }
AzureIoTClient 28:add19eb7defa 29 else
AzureIoTClient 28:add19eb7defa 30 {
AzureIoTClient 28:add19eb7defa 31 char* new_string;
AzureIoTClient 25:1101516ee67d 32
AzureIoTClient 28:add19eb7defa 33 size_t length = strlen(to_concat) + 1;
AzureIoTClient 28:add19eb7defa 34 size_t src_length;
Azure.IoT Build 0:6ae2f7bca550 35
AzureIoTClient 28:add19eb7defa 36 if (*string != NULL)
AzureIoTClient 28:add19eb7defa 37 {
AzureIoTClient 28:add19eb7defa 38 src_length = strlen(*string);
AzureIoTClient 28:add19eb7defa 39 }
AzureIoTClient 28:add19eb7defa 40 else
AzureIoTClient 28:add19eb7defa 41 {
AzureIoTClient 28:add19eb7defa 42 src_length = 0;
AzureIoTClient 28:add19eb7defa 43 }
Azure.IoT Build 0:6ae2f7bca550 44
AzureIoTClient 28:add19eb7defa 45 length += src_length;
Azure.IoT Build 0:6ae2f7bca550 46
AzureIoTClient 28:add19eb7defa 47 new_string = (char*)realloc(*string, length);
AzureIoTClient 28:add19eb7defa 48 if (new_string == NULL)
AzureIoTClient 28:add19eb7defa 49 {
AzureIoTClient 28:add19eb7defa 50 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 51 }
AzureIoTClient 28:add19eb7defa 52 else
AzureIoTClient 28:add19eb7defa 53 {
AzureIoTClient 28:add19eb7defa 54 *string = new_string;
AzureIoTClient 28:add19eb7defa 55 (void)strcpy(*string + src_length, to_concat);
AzureIoTClient 28:add19eb7defa 56 result = 0;
AzureIoTClient 28:add19eb7defa 57 }
AzureIoTClient 28:add19eb7defa 58 }
Azure.IoT Build 0:6ae2f7bca550 59
AzureIoTClient 28:add19eb7defa 60 return result;
Azure.IoT Build 0:6ae2f7bca550 61 }
Azure.IoT Build 0:6ae2f7bca550 62
Azure.IoT Build 0:6ae2f7bca550 63 char* amqpvalue_to_string(AMQP_VALUE amqp_value)
Azure.IoT Build 0:6ae2f7bca550 64 {
AzureIoTClient 28:add19eb7defa 65 char* result = NULL;
Azure.IoT Build 0:6ae2f7bca550 66
AzureIoTClient 28:add19eb7defa 67 if (amqp_value != NULL)
AzureIoTClient 28:add19eb7defa 68 {
AzureIoTClient 28:add19eb7defa 69 AMQP_TYPE amqp_type = amqpvalue_get_type(amqp_value);
AzureIoTClient 28:add19eb7defa 70 switch (amqp_type)
AzureIoTClient 28:add19eb7defa 71 {
AzureIoTClient 28:add19eb7defa 72 default:
AzureIoTClient 28:add19eb7defa 73 result = NULL;
AzureIoTClient 28:add19eb7defa 74 break;
Azure.IoT Build 0:6ae2f7bca550 75
AzureIoTClient 28:add19eb7defa 76 case AMQP_TYPE_NULL:
AzureIoTClient 28:add19eb7defa 77 if (string_concat(&result, "NULL") != 0)
AzureIoTClient 28:add19eb7defa 78 {
AzureIoTClient 28:add19eb7defa 79 free(result);
AzureIoTClient 28:add19eb7defa 80 result = NULL;
AzureIoTClient 28:add19eb7defa 81 }
AzureIoTClient 28:add19eb7defa 82 break;
AzureIoTClient 28:add19eb7defa 83 case AMQP_TYPE_BOOL:
AzureIoTClient 28:add19eb7defa 84 {
AzureIoTClient 28:add19eb7defa 85 bool value;
AzureIoTClient 28:add19eb7defa 86 if ((amqpvalue_get_boolean(amqp_value, &value) != 0) ||
AzureIoTClient 28:add19eb7defa 87 (string_concat(&result, (value == true) ? "true" : "false") != 0))
AzureIoTClient 28:add19eb7defa 88 {
AzureIoTClient 28:add19eb7defa 89 free(result);
AzureIoTClient 28:add19eb7defa 90 result = NULL;
AzureIoTClient 28:add19eb7defa 91 }
AzureIoTClient 28:add19eb7defa 92 break;
AzureIoTClient 28:add19eb7defa 93 }
AzureIoTClient 28:add19eb7defa 94 case AMQP_TYPE_UBYTE:
AzureIoTClient 28:add19eb7defa 95 {
AzureIoTClient 28:add19eb7defa 96 char str_value[4];
AzureIoTClient 28:add19eb7defa 97 uint8_t value;
AzureIoTClient 28:add19eb7defa 98 if (amqpvalue_get_ubyte(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 99 {
AzureIoTClient 28:add19eb7defa 100 free(result);
AzureIoTClient 28:add19eb7defa 101 result = NULL;
AzureIoTClient 28:add19eb7defa 102 }
AzureIoTClient 28:add19eb7defa 103 else
AzureIoTClient 28:add19eb7defa 104 {
AzureIoTClient 30:0407b2db334c 105 if ((sprintf(str_value, "%" PRIu8, value) < 0) ||
AzureIoTClient 28:add19eb7defa 106 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 107 {
AzureIoTClient 28:add19eb7defa 108 free(result);
AzureIoTClient 28:add19eb7defa 109 result = NULL;
AzureIoTClient 28:add19eb7defa 110 }
AzureIoTClient 28:add19eb7defa 111 }
AzureIoTClient 28:add19eb7defa 112 break;
AzureIoTClient 28:add19eb7defa 113 }
AzureIoTClient 28:add19eb7defa 114 case AMQP_TYPE_USHORT:
AzureIoTClient 28:add19eb7defa 115 {
AzureIoTClient 28:add19eb7defa 116 char str_value[6];
AzureIoTClient 28:add19eb7defa 117 uint16_t value;
AzureIoTClient 28:add19eb7defa 118 if (amqpvalue_get_ushort(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 119 {
AzureIoTClient 28:add19eb7defa 120 free(result);
AzureIoTClient 28:add19eb7defa 121 result = NULL;
AzureIoTClient 28:add19eb7defa 122 }
AzureIoTClient 28:add19eb7defa 123 else
AzureIoTClient 28:add19eb7defa 124 {
AzureIoTClient 30:0407b2db334c 125 if ((sprintf(str_value, "%" PRIu16, value) < 0) ||
AzureIoTClient 28:add19eb7defa 126 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 127 {
AzureIoTClient 28:add19eb7defa 128 free(result);
AzureIoTClient 28:add19eb7defa 129 result = NULL;
AzureIoTClient 28:add19eb7defa 130 }
AzureIoTClient 28:add19eb7defa 131 }
AzureIoTClient 28:add19eb7defa 132 break;
AzureIoTClient 28:add19eb7defa 133 }
AzureIoTClient 28:add19eb7defa 134 case AMQP_TYPE_UINT:
AzureIoTClient 28:add19eb7defa 135 {
AzureIoTClient 28:add19eb7defa 136 char str_value[11];
AzureIoTClient 28:add19eb7defa 137 uint32_t value;
AzureIoTClient 28:add19eb7defa 138 if (amqpvalue_get_uint(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 139 {
AzureIoTClient 28:add19eb7defa 140 free(result);
AzureIoTClient 28:add19eb7defa 141 result = NULL;
AzureIoTClient 28:add19eb7defa 142 }
AzureIoTClient 28:add19eb7defa 143 else
AzureIoTClient 28:add19eb7defa 144 {
AzureIoTClient 30:0407b2db334c 145 if ((sprintf(str_value, "%" PRIu32, value) < 0) ||
AzureIoTClient 28:add19eb7defa 146 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 147 {
AzureIoTClient 28:add19eb7defa 148 free(result);
AzureIoTClient 28:add19eb7defa 149 result = NULL;
AzureIoTClient 28:add19eb7defa 150 }
AzureIoTClient 28:add19eb7defa 151 }
AzureIoTClient 28:add19eb7defa 152 break;
AzureIoTClient 28:add19eb7defa 153 }
AzureIoTClient 28:add19eb7defa 154 case AMQP_TYPE_ULONG:
AzureIoTClient 28:add19eb7defa 155 {
AzureIoTClient 28:add19eb7defa 156 char str_value[21];
AzureIoTClient 28:add19eb7defa 157 uint64_t value;
AzureIoTClient 28:add19eb7defa 158 if (amqpvalue_get_ulong(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 159 {
AzureIoTClient 28:add19eb7defa 160 free(result);
AzureIoTClient 28:add19eb7defa 161 result = NULL;
AzureIoTClient 28:add19eb7defa 162 }
AzureIoTClient 28:add19eb7defa 163 else
AzureIoTClient 28:add19eb7defa 164 {
AzureIoTClient 30:0407b2db334c 165 if ((sprintf(str_value, "%" PRIu64, value) < 0) ||
AzureIoTClient 28:add19eb7defa 166 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 167 {
AzureIoTClient 28:add19eb7defa 168 free(result);
AzureIoTClient 28:add19eb7defa 169 result = NULL;
AzureIoTClient 28:add19eb7defa 170 }
AzureIoTClient 28:add19eb7defa 171 }
AzureIoTClient 28:add19eb7defa 172 break;
AzureIoTClient 28:add19eb7defa 173 }
AzureIoTClient 28:add19eb7defa 174 case AMQP_TYPE_BYTE:
AzureIoTClient 28:add19eb7defa 175 {
AzureIoTClient 28:add19eb7defa 176 char str_value[5];
AzureIoTClient 30:0407b2db334c 177 char value;
AzureIoTClient 30:0407b2db334c 178 if (amqpvalue_get_byte(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 179 {
AzureIoTClient 28:add19eb7defa 180 free(result);
AzureIoTClient 28:add19eb7defa 181 result = NULL;
AzureIoTClient 28:add19eb7defa 182 }
AzureIoTClient 28:add19eb7defa 183 else
AzureIoTClient 28:add19eb7defa 184 {
AzureIoTClient 30:0407b2db334c 185 if ((sprintf(str_value, "%" PRId8, value) < 0) ||
AzureIoTClient 28:add19eb7defa 186 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 187 {
AzureIoTClient 28:add19eb7defa 188 free(result);
AzureIoTClient 28:add19eb7defa 189 result = NULL;
AzureIoTClient 28:add19eb7defa 190 }
AzureIoTClient 28:add19eb7defa 191 }
AzureIoTClient 28:add19eb7defa 192 break;
AzureIoTClient 28:add19eb7defa 193 }
AzureIoTClient 28:add19eb7defa 194 case AMQP_TYPE_SHORT:
AzureIoTClient 28:add19eb7defa 195 {
AzureIoTClient 28:add19eb7defa 196 char str_value[7];
AzureIoTClient 30:0407b2db334c 197 int16_t value;
AzureIoTClient 30:0407b2db334c 198 if (amqpvalue_get_short(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 199 {
AzureIoTClient 28:add19eb7defa 200 free(result);
AzureIoTClient 28:add19eb7defa 201 result = NULL;
AzureIoTClient 28:add19eb7defa 202 }
AzureIoTClient 28:add19eb7defa 203 else
AzureIoTClient 28:add19eb7defa 204 {
AzureIoTClient 30:0407b2db334c 205 if ((sprintf(str_value, "%" PRId16, value) < 0) ||
AzureIoTClient 28:add19eb7defa 206 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 207 {
AzureIoTClient 28:add19eb7defa 208 free(result);
AzureIoTClient 28:add19eb7defa 209 result = NULL;
AzureIoTClient 28:add19eb7defa 210 }
AzureIoTClient 28:add19eb7defa 211 }
AzureIoTClient 28:add19eb7defa 212 break;
AzureIoTClient 28:add19eb7defa 213 }
AzureIoTClient 28:add19eb7defa 214 case AMQP_TYPE_INT:
AzureIoTClient 28:add19eb7defa 215 {
AzureIoTClient 28:add19eb7defa 216 char str_value[12];
AzureIoTClient 28:add19eb7defa 217 int32_t value;
AzureIoTClient 28:add19eb7defa 218 if (amqpvalue_get_int(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 219 {
AzureIoTClient 28:add19eb7defa 220 free(result);
AzureIoTClient 28:add19eb7defa 221 result = NULL;
AzureIoTClient 28:add19eb7defa 222 }
AzureIoTClient 28:add19eb7defa 223 else
AzureIoTClient 28:add19eb7defa 224 {
AzureIoTClient 30:0407b2db334c 225 if ((sprintf(str_value, "%" PRId32, value) < 0) ||
AzureIoTClient 28:add19eb7defa 226 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 227 {
AzureIoTClient 28:add19eb7defa 228 free(result);
AzureIoTClient 28:add19eb7defa 229 result = NULL;
AzureIoTClient 28:add19eb7defa 230 }
AzureIoTClient 28:add19eb7defa 231 }
AzureIoTClient 28:add19eb7defa 232 break;
AzureIoTClient 28:add19eb7defa 233 }
AzureIoTClient 28:add19eb7defa 234 case AMQP_TYPE_LONG:
AzureIoTClient 28:add19eb7defa 235 {
AzureIoTClient 28:add19eb7defa 236 char str_value[21];
AzureIoTClient 30:0407b2db334c 237 int64_t value;
AzureIoTClient 30:0407b2db334c 238 if (amqpvalue_get_long(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 239 {
AzureIoTClient 28:add19eb7defa 240 free(result);
AzureIoTClient 28:add19eb7defa 241 result = NULL;
AzureIoTClient 28:add19eb7defa 242 }
AzureIoTClient 28:add19eb7defa 243 else
AzureIoTClient 28:add19eb7defa 244 {
AzureIoTClient 30:0407b2db334c 245 if ((sprintf(str_value, "%" PRId64, value) < 0) ||
AzureIoTClient 28:add19eb7defa 246 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 247 {
AzureIoTClient 28:add19eb7defa 248 free(result);
AzureIoTClient 28:add19eb7defa 249 result = NULL;
AzureIoTClient 28:add19eb7defa 250 }
AzureIoTClient 28:add19eb7defa 251 }
AzureIoTClient 28:add19eb7defa 252 break;
AzureIoTClient 28:add19eb7defa 253 }
AzureIoTClient 28:add19eb7defa 254 case AMQP_TYPE_FLOAT:
AzureIoTClient 28:add19eb7defa 255 {
AzureIoTClient 28:add19eb7defa 256 float float_value;
AzureIoTClient 28:add19eb7defa 257 if (amqpvalue_get_float(amqp_value, &float_value) != 0)
AzureIoTClient 28:add19eb7defa 258 {
AzureIoTClient 28:add19eb7defa 259 free(result);
AzureIoTClient 28:add19eb7defa 260 result = NULL;
AzureIoTClient 28:add19eb7defa 261 }
AzureIoTClient 28:add19eb7defa 262 else
AzureIoTClient 28:add19eb7defa 263 {
AzureIoTClient 28:add19eb7defa 264 char str_value[25];
AzureIoTClient 28:add19eb7defa 265 if ((snprintf(str_value, sizeof(str_value), "%.02f", float_value) < 0) ||
AzureIoTClient 28:add19eb7defa 266 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 267 {
AzureIoTClient 28:add19eb7defa 268 free(result);
AzureIoTClient 28:add19eb7defa 269 result = NULL;
AzureIoTClient 28:add19eb7defa 270 }
AzureIoTClient 28:add19eb7defa 271 if (string_concat(&result, str_value) != 0)
AzureIoTClient 28:add19eb7defa 272 {
AzureIoTClient 28:add19eb7defa 273 free(result);
AzureIoTClient 28:add19eb7defa 274 result = NULL;
AzureIoTClient 28:add19eb7defa 275 }
AzureIoTClient 28:add19eb7defa 276 }
AzureIoTClient 28:add19eb7defa 277 break;
AzureIoTClient 28:add19eb7defa 278 }
AzureIoTClient 28:add19eb7defa 279 case AMQP_TYPE_DOUBLE:
AzureIoTClient 28:add19eb7defa 280 {
AzureIoTClient 28:add19eb7defa 281 double double_value;
AzureIoTClient 28:add19eb7defa 282 if (amqpvalue_get_double(amqp_value, &double_value) != 0)
AzureIoTClient 28:add19eb7defa 283 {
AzureIoTClient 28:add19eb7defa 284 free(result);
AzureIoTClient 28:add19eb7defa 285 result = NULL;
AzureIoTClient 28:add19eb7defa 286 }
AzureIoTClient 28:add19eb7defa 287 else
AzureIoTClient 28:add19eb7defa 288 {
AzureIoTClient 28:add19eb7defa 289 char str_value[25];
AzureIoTClient 28:add19eb7defa 290 if ((snprintf(str_value, sizeof(str_value), "%.02lf", double_value) < 0) ||
AzureIoTClient 28:add19eb7defa 291 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 292 {
AzureIoTClient 28:add19eb7defa 293 free(result);
AzureIoTClient 28:add19eb7defa 294 result = NULL;
AzureIoTClient 28:add19eb7defa 295 }
AzureIoTClient 28:add19eb7defa 296 if (string_concat(&result, str_value) != 0)
AzureIoTClient 28:add19eb7defa 297 {
AzureIoTClient 28:add19eb7defa 298 free(result);
AzureIoTClient 28:add19eb7defa 299 result = NULL;
AzureIoTClient 28:add19eb7defa 300 }
AzureIoTClient 28:add19eb7defa 301 }
AzureIoTClient 28:add19eb7defa 302 break;
AzureIoTClient 28:add19eb7defa 303 }
AzureIoTClient 28:add19eb7defa 304 case AMQP_TYPE_CHAR:
AzureIoTClient 28:add19eb7defa 305 {
AzureIoTClient 28:add19eb7defa 306 uint32_t char_code;
AzureIoTClient 28:add19eb7defa 307 if (amqpvalue_get_char(amqp_value, &char_code) != 0)
AzureIoTClient 28:add19eb7defa 308 {
AzureIoTClient 28:add19eb7defa 309 free(result);
AzureIoTClient 28:add19eb7defa 310 result = NULL;
AzureIoTClient 28:add19eb7defa 311 }
AzureIoTClient 28:add19eb7defa 312 else
AzureIoTClient 28:add19eb7defa 313 {
AzureIoTClient 28:add19eb7defa 314 char str_value[25];
AzureIoTClient 28:add19eb7defa 315 if ((snprintf(str_value, sizeof(str_value), "U%02X%02X%02X%02X", char_code >> 24, (char_code >> 16) & 0xFF, (char_code >> 8) & 0xFF, char_code & 0xFF) < 0) ||
AzureIoTClient 28:add19eb7defa 316 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 317 {
AzureIoTClient 28:add19eb7defa 318 free(result);
AzureIoTClient 28:add19eb7defa 319 result = NULL;
AzureIoTClient 28:add19eb7defa 320 }
AzureIoTClient 28:add19eb7defa 321 if (string_concat(&result, str_value) != 0)
AzureIoTClient 28:add19eb7defa 322 {
AzureIoTClient 28:add19eb7defa 323 free(result);
AzureIoTClient 28:add19eb7defa 324 result = NULL;
AzureIoTClient 28:add19eb7defa 325 }
AzureIoTClient 28:add19eb7defa 326 }
AzureIoTClient 28:add19eb7defa 327 break;
AzureIoTClient 28:add19eb7defa 328 }
AzureIoTClient 28:add19eb7defa 329 case AMQP_TYPE_TIMESTAMP:
AzureIoTClient 28:add19eb7defa 330 {
AzureIoTClient 28:add19eb7defa 331 char str_value[21];
AzureIoTClient 28:add19eb7defa 332 int64_t value;
AzureIoTClient 28:add19eb7defa 333 if (amqpvalue_get_timestamp(amqp_value, &value) != 0)
AzureIoTClient 28:add19eb7defa 334 {
AzureIoTClient 28:add19eb7defa 335 free(result);
AzureIoTClient 28:add19eb7defa 336 result = NULL;
AzureIoTClient 28:add19eb7defa 337 }
AzureIoTClient 28:add19eb7defa 338 else
AzureIoTClient 28:add19eb7defa 339 {
AzureIoTClient 28:add19eb7defa 340 long long int_value = value;
AzureIoTClient 28:add19eb7defa 341 if ((sprintf(str_value, "%lld", int_value) < 0) ||
AzureIoTClient 28:add19eb7defa 342 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 343 {
AzureIoTClient 28:add19eb7defa 344 free(result);
AzureIoTClient 28:add19eb7defa 345 result = NULL;
AzureIoTClient 28:add19eb7defa 346 }
AzureIoTClient 28:add19eb7defa 347 }
AzureIoTClient 28:add19eb7defa 348 break;
AzureIoTClient 28:add19eb7defa 349 }
AzureIoTClient 28:add19eb7defa 350 case AMQP_TYPE_UUID:
AzureIoTClient 28:add19eb7defa 351 break;
AzureIoTClient 28:add19eb7defa 352 case AMQP_TYPE_BINARY:
AzureIoTClient 28:add19eb7defa 353 {
AzureIoTClient 28:add19eb7defa 354 amqp_binary binary_value;
AzureIoTClient 28:add19eb7defa 355 if (amqpvalue_get_binary(amqp_value, &binary_value) != 0)
AzureIoTClient 28:add19eb7defa 356 {
AzureIoTClient 28:add19eb7defa 357 free(result);
AzureIoTClient 28:add19eb7defa 358 result = NULL;
AzureIoTClient 28:add19eb7defa 359 }
AzureIoTClient 28:add19eb7defa 360 else
AzureIoTClient 28:add19eb7defa 361 {
AzureIoTClient 28:add19eb7defa 362 if (string_concat(&result, "<") != 0)
AzureIoTClient 28:add19eb7defa 363 {
AzureIoTClient 28:add19eb7defa 364 free(result);
AzureIoTClient 28:add19eb7defa 365 result = NULL;
AzureIoTClient 28:add19eb7defa 366 }
AzureIoTClient 28:add19eb7defa 367 else
AzureIoTClient 28:add19eb7defa 368 {
AzureIoTClient 28:add19eb7defa 369 uint64_t i;
Azure.IoT Build 0:6ae2f7bca550 370
AzureIoTClient 28:add19eb7defa 371 for (i = 0; i < binary_value.length; i++)
AzureIoTClient 28:add19eb7defa 372 {
AzureIoTClient 28:add19eb7defa 373 char str_value[4];
AzureIoTClient 28:add19eb7defa 374 if ((snprintf(str_value, sizeof(str_value), "%s%02X", (i > 0) ? " " : "", ((unsigned char*)binary_value.bytes)[i]) < 0) ||
AzureIoTClient 28:add19eb7defa 375 (string_concat(&result, str_value) != 0))
AzureIoTClient 28:add19eb7defa 376 {
AzureIoTClient 28:add19eb7defa 377 break;
AzureIoTClient 28:add19eb7defa 378 }
AzureIoTClient 28:add19eb7defa 379 }
Azure.IoT Build 0:6ae2f7bca550 380
AzureIoTClient 28:add19eb7defa 381 if (i < binary_value.length)
AzureIoTClient 28:add19eb7defa 382 {
AzureIoTClient 28:add19eb7defa 383 free(result);
AzureIoTClient 28:add19eb7defa 384 result = NULL;
AzureIoTClient 28:add19eb7defa 385 }
AzureIoTClient 28:add19eb7defa 386 else if (string_concat(&result, ">") != 0)
AzureIoTClient 28:add19eb7defa 387 {
AzureIoTClient 28:add19eb7defa 388 free(result);
AzureIoTClient 28:add19eb7defa 389 result = NULL;
AzureIoTClient 28:add19eb7defa 390 }
AzureIoTClient 28:add19eb7defa 391 }
AzureIoTClient 28:add19eb7defa 392 }
AzureIoTClient 28:add19eb7defa 393 break;
AzureIoTClient 28:add19eb7defa 394 }
AzureIoTClient 28:add19eb7defa 395 case AMQP_TYPE_STRING:
AzureIoTClient 28:add19eb7defa 396 {
AzureIoTClient 28:add19eb7defa 397 const char* string_value;
AzureIoTClient 28:add19eb7defa 398 if (amqpvalue_get_string(amqp_value, &string_value) != 0)
AzureIoTClient 28:add19eb7defa 399 {
AzureIoTClient 28:add19eb7defa 400 free(result);
AzureIoTClient 28:add19eb7defa 401 result = NULL;
AzureIoTClient 28:add19eb7defa 402 }
AzureIoTClient 28:add19eb7defa 403 else
AzureIoTClient 28:add19eb7defa 404 {
AzureIoTClient 28:add19eb7defa 405 if (string_concat(&result, string_value) != 0)
AzureIoTClient 28:add19eb7defa 406 {
AzureIoTClient 28:add19eb7defa 407 free(result);
AzureIoTClient 28:add19eb7defa 408 result = NULL;
AzureIoTClient 28:add19eb7defa 409 }
AzureIoTClient 28:add19eb7defa 410 }
AzureIoTClient 28:add19eb7defa 411 break;
AzureIoTClient 28:add19eb7defa 412 }
AzureIoTClient 28:add19eb7defa 413 case AMQP_TYPE_SYMBOL:
AzureIoTClient 28:add19eb7defa 414 {
AzureIoTClient 28:add19eb7defa 415 const char* string_value;
AzureIoTClient 28:add19eb7defa 416 if (amqpvalue_get_symbol(amqp_value, &string_value) != 0)
AzureIoTClient 28:add19eb7defa 417 {
AzureIoTClient 28:add19eb7defa 418 free(result);
AzureIoTClient 28:add19eb7defa 419 result = NULL;
AzureIoTClient 28:add19eb7defa 420 }
AzureIoTClient 28:add19eb7defa 421 else
AzureIoTClient 28:add19eb7defa 422 {
AzureIoTClient 28:add19eb7defa 423 if (string_concat(&result, string_value) != 0)
AzureIoTClient 28:add19eb7defa 424 {
AzureIoTClient 28:add19eb7defa 425 free(result);
AzureIoTClient 28:add19eb7defa 426 result = NULL;
AzureIoTClient 28:add19eb7defa 427 }
AzureIoTClient 28:add19eb7defa 428 }
AzureIoTClient 28:add19eb7defa 429 break;
AzureIoTClient 28:add19eb7defa 430 }
AzureIoTClient 28:add19eb7defa 431 case AMQP_TYPE_LIST:
AzureIoTClient 28:add19eb7defa 432 {
AzureIoTClient 28:add19eb7defa 433 uint32_t count;
AzureIoTClient 28:add19eb7defa 434 if ((amqpvalue_get_list_item_count(amqp_value, &count) != 0) ||
AzureIoTClient 28:add19eb7defa 435 (string_concat(&result, "{") != 0))
AzureIoTClient 28:add19eb7defa 436 {
AzureIoTClient 28:add19eb7defa 437 free(result);
AzureIoTClient 28:add19eb7defa 438 result = NULL;
AzureIoTClient 28:add19eb7defa 439 }
AzureIoTClient 28:add19eb7defa 440 else
AzureIoTClient 28:add19eb7defa 441 {
AzureIoTClient 28:add19eb7defa 442 size_t i;
AzureIoTClient 28:add19eb7defa 443 for (i = 0; i < count; i++)
AzureIoTClient 28:add19eb7defa 444 {
AzureIoTClient 28:add19eb7defa 445 AMQP_VALUE item = amqpvalue_get_list_item(amqp_value, i);
AzureIoTClient 28:add19eb7defa 446 if (item == NULL)
AzureIoTClient 28:add19eb7defa 447 {
AzureIoTClient 28:add19eb7defa 448 break;
AzureIoTClient 28:add19eb7defa 449 }
AzureIoTClient 28:add19eb7defa 450 else
AzureIoTClient 28:add19eb7defa 451 {
AzureIoTClient 28:add19eb7defa 452 char* item_string = amqpvalue_to_string(item);
AzureIoTClient 28:add19eb7defa 453 if (item_string == NULL)
AzureIoTClient 28:add19eb7defa 454 {
AzureIoTClient 28:add19eb7defa 455 amqpvalue_destroy(item);
AzureIoTClient 28:add19eb7defa 456 break;
AzureIoTClient 28:add19eb7defa 457 }
AzureIoTClient 28:add19eb7defa 458 else
AzureIoTClient 28:add19eb7defa 459 {
AzureIoTClient 28:add19eb7defa 460 if ((i > 0) && (string_concat(&result, ",") != 0))
AzureIoTClient 28:add19eb7defa 461 {
AzureIoTClient 28:add19eb7defa 462 free(result);
AzureIoTClient 28:add19eb7defa 463 result = NULL;
AzureIoTClient 28:add19eb7defa 464 break;
AzureIoTClient 28:add19eb7defa 465 }
AzureIoTClient 28:add19eb7defa 466 else if (string_concat(&result, item_string) != 0)
AzureIoTClient 28:add19eb7defa 467 {
AzureIoTClient 28:add19eb7defa 468 free(result);
AzureIoTClient 28:add19eb7defa 469 result = NULL;
AzureIoTClient 28:add19eb7defa 470 break;
AzureIoTClient 28:add19eb7defa 471 }
Azure.IoT Build 0:6ae2f7bca550 472
AzureIoTClient 28:add19eb7defa 473 free(item_string);
AzureIoTClient 28:add19eb7defa 474 }
Azure.IoT Build 0:6ae2f7bca550 475
AzureIoTClient 28:add19eb7defa 476 amqpvalue_destroy(item);
AzureIoTClient 28:add19eb7defa 477 }
AzureIoTClient 28:add19eb7defa 478 }
Azure.IoT Build 0:6ae2f7bca550 479
AzureIoTClient 28:add19eb7defa 480 if ((i < count) ||
AzureIoTClient 28:add19eb7defa 481 (string_concat(&result, "}") != 0))
AzureIoTClient 28:add19eb7defa 482 {
AzureIoTClient 28:add19eb7defa 483 free(result);
AzureIoTClient 28:add19eb7defa 484 result = NULL;
AzureIoTClient 28:add19eb7defa 485 }
AzureIoTClient 28:add19eb7defa 486 }
AzureIoTClient 28:add19eb7defa 487 break;
AzureIoTClient 28:add19eb7defa 488 }
AzureIoTClient 28:add19eb7defa 489 case AMQP_TYPE_MAP:
AzureIoTClient 28:add19eb7defa 490 {
AzureIoTClient 28:add19eb7defa 491 uint32_t count;
AzureIoTClient 28:add19eb7defa 492 if ((amqpvalue_get_map_pair_count(amqp_value, &count) != 0) ||
AzureIoTClient 28:add19eb7defa 493 (string_concat(&result, "{") != 0))
AzureIoTClient 28:add19eb7defa 494 {
AzureIoTClient 28:add19eb7defa 495 free(result);
AzureIoTClient 28:add19eb7defa 496 result = NULL;
AzureIoTClient 28:add19eb7defa 497 }
AzureIoTClient 28:add19eb7defa 498 else
AzureIoTClient 28:add19eb7defa 499 {
AzureIoTClient 28:add19eb7defa 500 uint32_t i;
AzureIoTClient 28:add19eb7defa 501 for (i = 0; i < count; i++)
AzureIoTClient 28:add19eb7defa 502 {
AzureIoTClient 28:add19eb7defa 503 AMQP_VALUE key;
AzureIoTClient 28:add19eb7defa 504 AMQP_VALUE value;
AzureIoTClient 28:add19eb7defa 505 if (amqpvalue_get_map_key_value_pair(amqp_value, i, &key, &value) != 0)
AzureIoTClient 28:add19eb7defa 506 {
AzureIoTClient 28:add19eb7defa 507 break;
AzureIoTClient 28:add19eb7defa 508 }
AzureIoTClient 28:add19eb7defa 509 else
AzureIoTClient 28:add19eb7defa 510 {
AzureIoTClient 28:add19eb7defa 511 char* key_string = amqpvalue_to_string(key);
AzureIoTClient 28:add19eb7defa 512 if (key_string == NULL)
AzureIoTClient 28:add19eb7defa 513 {
AzureIoTClient 28:add19eb7defa 514 amqpvalue_destroy(key);
AzureIoTClient 28:add19eb7defa 515 amqpvalue_destroy(value);
AzureIoTClient 28:add19eb7defa 516 break;
AzureIoTClient 28:add19eb7defa 517 }
AzureIoTClient 28:add19eb7defa 518 else
AzureIoTClient 28:add19eb7defa 519 {
AzureIoTClient 28:add19eb7defa 520 char* value_string = amqpvalue_to_string(value);
AzureIoTClient 28:add19eb7defa 521 if (key_string == NULL)
AzureIoTClient 28:add19eb7defa 522 {
AzureIoTClient 28:add19eb7defa 523 free(key_string);
AzureIoTClient 28:add19eb7defa 524 amqpvalue_destroy(key);
AzureIoTClient 28:add19eb7defa 525 amqpvalue_destroy(value);
AzureIoTClient 28:add19eb7defa 526 break;
AzureIoTClient 28:add19eb7defa 527 }
AzureIoTClient 28:add19eb7defa 528 else
AzureIoTClient 28:add19eb7defa 529 {
AzureIoTClient 28:add19eb7defa 530 if (((i > 0) && (string_concat(&result, ",") != 0)) ||
AzureIoTClient 28:add19eb7defa 531 (string_concat(&result, "[") != 0) ||
AzureIoTClient 28:add19eb7defa 532 (string_concat(&result, key_string) != 0) ||
AzureIoTClient 28:add19eb7defa 533 (string_concat(&result, ":") != 0) ||
AzureIoTClient 28:add19eb7defa 534 (string_concat(&result, value_string) != 0) ||
AzureIoTClient 28:add19eb7defa 535 (string_concat(&result, "]") != 0))
AzureIoTClient 28:add19eb7defa 536 {
AzureIoTClient 28:add19eb7defa 537 free(key_string);
AzureIoTClient 28:add19eb7defa 538 free(value_string);
AzureIoTClient 28:add19eb7defa 539 amqpvalue_destroy(key);
AzureIoTClient 28:add19eb7defa 540 amqpvalue_destroy(value);
AzureIoTClient 28:add19eb7defa 541 break;
AzureIoTClient 28:add19eb7defa 542 }
Azure.IoT Build 0:6ae2f7bca550 543
AzureIoTClient 28:add19eb7defa 544 free(value_string);
AzureIoTClient 28:add19eb7defa 545 }
Azure.IoT Build 0:6ae2f7bca550 546
AzureIoTClient 28:add19eb7defa 547 free(key_string);
AzureIoTClient 28:add19eb7defa 548 }
Azure.IoT Build 0:6ae2f7bca550 549
AzureIoTClient 28:add19eb7defa 550 amqpvalue_destroy(key);
AzureIoTClient 28:add19eb7defa 551 amqpvalue_destroy(value);
AzureIoTClient 28:add19eb7defa 552 }
AzureIoTClient 28:add19eb7defa 553 }
Azure.IoT Build 0:6ae2f7bca550 554
AzureIoTClient 28:add19eb7defa 555 if ((i < count) ||
AzureIoTClient 28:add19eb7defa 556 (string_concat(&result, "}") != 0))
AzureIoTClient 28:add19eb7defa 557 {
AzureIoTClient 28:add19eb7defa 558 free(result);
AzureIoTClient 28:add19eb7defa 559 result = NULL;
AzureIoTClient 28:add19eb7defa 560 }
AzureIoTClient 28:add19eb7defa 561 }
AzureIoTClient 28:add19eb7defa 562 break;
AzureIoTClient 28:add19eb7defa 563 }
AzureIoTClient 28:add19eb7defa 564 case AMQP_TYPE_ARRAY:
AzureIoTClient 28:add19eb7defa 565 {
AzureIoTClient 28:add19eb7defa 566 uint32_t count;
AzureIoTClient 28:add19eb7defa 567 if ((amqpvalue_get_array_item_count(amqp_value, &count) != 0) ||
AzureIoTClient 28:add19eb7defa 568 (string_concat(&result, "{") != 0))
AzureIoTClient 28:add19eb7defa 569 {
AzureIoTClient 28:add19eb7defa 570 free(result);
AzureIoTClient 28:add19eb7defa 571 result = NULL;
AzureIoTClient 28:add19eb7defa 572 }
AzureIoTClient 28:add19eb7defa 573 else
AzureIoTClient 28:add19eb7defa 574 {
AzureIoTClient 28:add19eb7defa 575 uint32_t i;
AzureIoTClient 28:add19eb7defa 576 for (i = 0; i < count; i++)
AzureIoTClient 28:add19eb7defa 577 {
AzureIoTClient 28:add19eb7defa 578 AMQP_VALUE item = amqpvalue_get_array_item(amqp_value, i);
AzureIoTClient 28:add19eb7defa 579 if (item == NULL)
AzureIoTClient 28:add19eb7defa 580 {
AzureIoTClient 28:add19eb7defa 581 break;
AzureIoTClient 28:add19eb7defa 582 }
AzureIoTClient 28:add19eb7defa 583 else
AzureIoTClient 28:add19eb7defa 584 {
AzureIoTClient 28:add19eb7defa 585 char* item_string = amqpvalue_to_string(item);
AzureIoTClient 28:add19eb7defa 586 if (item_string == NULL)
AzureIoTClient 28:add19eb7defa 587 {
AzureIoTClient 28:add19eb7defa 588 amqpvalue_destroy(item);
AzureIoTClient 28:add19eb7defa 589 break;
AzureIoTClient 28:add19eb7defa 590 }
AzureIoTClient 28:add19eb7defa 591 else
AzureIoTClient 28:add19eb7defa 592 {
AzureIoTClient 28:add19eb7defa 593 if ((i > 0) && (string_concat(&result, ",") != 0))
AzureIoTClient 28:add19eb7defa 594 {
AzureIoTClient 28:add19eb7defa 595 free(result);
AzureIoTClient 28:add19eb7defa 596 result = NULL;
AzureIoTClient 28:add19eb7defa 597 break;
AzureIoTClient 28:add19eb7defa 598 }
AzureIoTClient 28:add19eb7defa 599 else if (string_concat(&result, item_string) != 0)
AzureIoTClient 28:add19eb7defa 600 {
AzureIoTClient 28:add19eb7defa 601 free(result);
AzureIoTClient 28:add19eb7defa 602 result = NULL;
AzureIoTClient 28:add19eb7defa 603 break;
AzureIoTClient 28:add19eb7defa 604 }
Azure.IoT Build 0:6ae2f7bca550 605
AzureIoTClient 28:add19eb7defa 606 free(item_string);
AzureIoTClient 28:add19eb7defa 607 }
Azure.IoT Build 0:6ae2f7bca550 608
AzureIoTClient 28:add19eb7defa 609 amqpvalue_destroy(item);
AzureIoTClient 28:add19eb7defa 610 }
AzureIoTClient 28:add19eb7defa 611 }
Azure.IoT Build 0:6ae2f7bca550 612
AzureIoTClient 28:add19eb7defa 613 if ((i < count) ||
AzureIoTClient 28:add19eb7defa 614 (string_concat(&result, "}") != 0))
AzureIoTClient 28:add19eb7defa 615 {
AzureIoTClient 28:add19eb7defa 616 free(result);
AzureIoTClient 28:add19eb7defa 617 result = NULL;
AzureIoTClient 28:add19eb7defa 618 }
AzureIoTClient 28:add19eb7defa 619 }
AzureIoTClient 28:add19eb7defa 620 break;
AzureIoTClient 28:add19eb7defa 621 }
AzureIoTClient 28:add19eb7defa 622 case AMQP_TYPE_COMPOSITE:
AzureIoTClient 28:add19eb7defa 623 case AMQP_TYPE_DESCRIBED:
AzureIoTClient 28:add19eb7defa 624 {
AzureIoTClient 28:add19eb7defa 625 AMQP_VALUE described_value = amqpvalue_get_inplace_described_value(amqp_value);
AzureIoTClient 28:add19eb7defa 626 if (described_value == NULL)
AzureIoTClient 28:add19eb7defa 627 {
AzureIoTClient 28:add19eb7defa 628 free(result);
AzureIoTClient 28:add19eb7defa 629 result = NULL;
AzureIoTClient 28:add19eb7defa 630 }
AzureIoTClient 28:add19eb7defa 631 else
AzureIoTClient 28:add19eb7defa 632 {
AzureIoTClient 28:add19eb7defa 633 if (string_concat(&result, "* ") != 0)
AzureIoTClient 28:add19eb7defa 634 {
AzureIoTClient 28:add19eb7defa 635 free(result);
AzureIoTClient 28:add19eb7defa 636 result = NULL;
AzureIoTClient 28:add19eb7defa 637 }
AzureIoTClient 28:add19eb7defa 638 else
AzureIoTClient 28:add19eb7defa 639 {
AzureIoTClient 28:add19eb7defa 640 char* described_value_string = amqpvalue_to_string(described_value);
AzureIoTClient 28:add19eb7defa 641 if (described_value_string == NULL)
AzureIoTClient 28:add19eb7defa 642 {
AzureIoTClient 28:add19eb7defa 643 free(result);
AzureIoTClient 28:add19eb7defa 644 result = NULL;
AzureIoTClient 28:add19eb7defa 645 }
AzureIoTClient 28:add19eb7defa 646 else
AzureIoTClient 28:add19eb7defa 647 {
AzureIoTClient 28:add19eb7defa 648 if (string_concat(&result, described_value_string) != 0)
AzureIoTClient 28:add19eb7defa 649 {
AzureIoTClient 28:add19eb7defa 650 free(result);
AzureIoTClient 28:add19eb7defa 651 result = NULL;
AzureIoTClient 28:add19eb7defa 652 }
Azure.IoT Build 0:6ae2f7bca550 653
AzureIoTClient 28:add19eb7defa 654 free(described_value_string);
AzureIoTClient 28:add19eb7defa 655 }
AzureIoTClient 28:add19eb7defa 656 }
AzureIoTClient 28:add19eb7defa 657 }
AzureIoTClient 28:add19eb7defa 658 break;
AzureIoTClient 28:add19eb7defa 659 }
AzureIoTClient 28:add19eb7defa 660 }
AzureIoTClient 28:add19eb7defa 661 }
Azure.IoT Build 0:6ae2f7bca550 662
AzureIoTClient 28:add19eb7defa 663 return result;
Azure.IoT Build 0:6ae2f7bca550 664 }