Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Committer:
markrad
Date:
Thu Jan 05 00:20:03 2017 +0000
Revision:
58:f50b97b08851
Sample using MBED TLS

Who changed what in which revision?

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