A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Apr 21 14:50:32 2017 -0700
Revision:
23:1111ee8bcba4
Parent:
21:f9c433d8e6ca
Child:
25:1101516ee67d
1.1.13

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>
Azure.IoT Build 0:6ae2f7bca550 6 #include <string.h>
Azure.IoT Build 0:6ae2f7bca550 7 #include <stdbool.h>
AzureIoTClient 19:000ab4e6a2c1 8 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 21:f9c433d8e6ca 9 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 6:641a9672db08 10 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:6ae2f7bca550 11 #include "azure_uamqp_c/amqp_types.h"
Azure.IoT Build 0:6ae2f7bca550 12 #include "azure_uamqp_c/amqpvalue.h"
Azure.IoT Build 0:6ae2f7bca550 13
Azure.IoT Build 0:6ae2f7bca550 14 /* Requirements satisfied by the current implementation without any code:
Azure.IoT Build 0:6ae2f7bca550 15 Codes_SRS_AMQPVALUE_01_270: [<encoding code="0x56" category="fixed" width="1" label="boolean with the octet 0x00 being false and octet 0x01 being true"/>]
Azure.IoT Build 0:6ae2f7bca550 16 Codes_SRS_AMQPVALUE_01_099: [Represents an approximate point in time using the Unix time t [IEEE1003] encoding of UTC, but with a precision of milliseconds.]
Azure.IoT Build 0:6ae2f7bca550 17 */
Azure.IoT Build 0:6ae2f7bca550 18
Azure.IoT Build 0:6ae2f7bca550 19 typedef struct AMQP_LIST_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 20 {
Azure.IoT Build 0:6ae2f7bca550 21 AMQP_VALUE* items;
Azure.IoT Build 0:6ae2f7bca550 22 uint32_t count;
Azure.IoT Build 0:6ae2f7bca550 23 } AMQP_LIST_VALUE;
Azure.IoT Build 0:6ae2f7bca550 24
Azure.IoT Build 0:6ae2f7bca550 25 typedef struct AMQP_ARRAY_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 26 {
Azure.IoT Build 0:6ae2f7bca550 27 AMQP_VALUE* items;
Azure.IoT Build 0:6ae2f7bca550 28 uint32_t count;
Azure.IoT Build 0:6ae2f7bca550 29 } AMQP_ARRAY_VALUE;
Azure.IoT Build 0:6ae2f7bca550 30
Azure.IoT Build 0:6ae2f7bca550 31 typedef struct AMQP_MAP_KEY_VALUE_PAIR_TAG
Azure.IoT Build 0:6ae2f7bca550 32 {
Azure.IoT Build 0:6ae2f7bca550 33 AMQP_VALUE key;
Azure.IoT Build 0:6ae2f7bca550 34 AMQP_VALUE value;
Azure.IoT Build 0:6ae2f7bca550 35 } AMQP_MAP_KEY_VALUE_PAIR;
Azure.IoT Build 0:6ae2f7bca550 36
Azure.IoT Build 0:6ae2f7bca550 37 typedef struct AMQP_MAP_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 38 {
Azure.IoT Build 0:6ae2f7bca550 39 AMQP_MAP_KEY_VALUE_PAIR* pairs;
Azure.IoT Build 0:6ae2f7bca550 40 uint32_t pair_count;
Azure.IoT Build 0:6ae2f7bca550 41 } AMQP_MAP_VALUE;
Azure.IoT Build 0:6ae2f7bca550 42
Azure.IoT Build 0:6ae2f7bca550 43 typedef struct AMQP_STRING_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 44 {
Azure.IoT Build 0:6ae2f7bca550 45 char* chars;
Azure.IoT Build 0:6ae2f7bca550 46 } AMQP_STRING_VALUE;
Azure.IoT Build 0:6ae2f7bca550 47
Azure.IoT Build 0:6ae2f7bca550 48 typedef struct AMQP_SYMBOL_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 49 {
Azure.IoT Build 0:6ae2f7bca550 50 char* chars;
Azure.IoT Build 0:6ae2f7bca550 51 } AMQP_SYMBOL_VALUE;
Azure.IoT Build 0:6ae2f7bca550 52
Azure.IoT Build 0:6ae2f7bca550 53 typedef struct AMQP_BINARY_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 54 {
Azure.IoT Build 0:6ae2f7bca550 55 unsigned char* bytes;
Azure.IoT Build 0:6ae2f7bca550 56 uint32_t length;
Azure.IoT Build 0:6ae2f7bca550 57 } AMQP_BINARY_VALUE;
Azure.IoT Build 0:6ae2f7bca550 58
Azure.IoT Build 0:6ae2f7bca550 59 typedef struct DESCRIBED_VALUE_TAG
Azure.IoT Build 0:6ae2f7bca550 60 {
Azure.IoT Build 0:6ae2f7bca550 61 AMQP_VALUE descriptor;
Azure.IoT Build 0:6ae2f7bca550 62 AMQP_VALUE value;
Azure.IoT Build 0:6ae2f7bca550 63 } DESCRIBED_VALUE;
Azure.IoT Build 0:6ae2f7bca550 64
Azure.IoT Build 0:6ae2f7bca550 65 typedef union AMQP_VALUE_UNION_TAG
Azure.IoT Build 0:6ae2f7bca550 66 {
Azure.IoT Build 0:6ae2f7bca550 67 DESCRIBED_VALUE described_value;
Azure.IoT Build 0:6ae2f7bca550 68 unsigned char ubyte_value;
Azure.IoT Build 0:6ae2f7bca550 69 uint16_t ushort_value;
Azure.IoT Build 0:6ae2f7bca550 70 uint32_t uint_value;
Azure.IoT Build 0:6ae2f7bca550 71 uint64_t ulong_value;
Azure.IoT Build 0:6ae2f7bca550 72 char byte_value;
Azure.IoT Build 0:6ae2f7bca550 73 int16_t short_value;
Azure.IoT Build 0:6ae2f7bca550 74 int32_t int_value;
Azure.IoT Build 0:6ae2f7bca550 75 int64_t long_value;
Azure.IoT Build 0:6ae2f7bca550 76 bool bool_value;
Azure.IoT Build 0:6ae2f7bca550 77 float float_value;
Azure.IoT Build 0:6ae2f7bca550 78 double double_value;
Azure.IoT Build 0:6ae2f7bca550 79 uint32_t char_value;
Azure.IoT Build 0:6ae2f7bca550 80 int64_t timestamp_value;
Azure.IoT Build 0:6ae2f7bca550 81 uuid uuid_value;
Azure.IoT Build 0:6ae2f7bca550 82 AMQP_STRING_VALUE string_value;
Azure.IoT Build 0:6ae2f7bca550 83 amqp_binary binary_value;
Azure.IoT Build 0:6ae2f7bca550 84 AMQP_LIST_VALUE list_value;
Azure.IoT Build 0:6ae2f7bca550 85 AMQP_MAP_VALUE map_value;
Azure.IoT Build 0:6ae2f7bca550 86 AMQP_ARRAY_VALUE array_value;
Azure.IoT Build 0:6ae2f7bca550 87 AMQP_SYMBOL_VALUE symbol_value;
Azure.IoT Build 0:6ae2f7bca550 88 } AMQP_VALUE_UNION;
Azure.IoT Build 0:6ae2f7bca550 89
Azure.IoT Build 0:6ae2f7bca550 90 typedef enum DECODE_LIST_STEP_TAG
Azure.IoT Build 0:6ae2f7bca550 91 {
Azure.IoT Build 0:6ae2f7bca550 92 DECODE_LIST_STEP_SIZE,
Azure.IoT Build 0:6ae2f7bca550 93 DECODE_LIST_STEP_COUNT,
Azure.IoT Build 0:6ae2f7bca550 94 DECODE_LIST_STEP_ITEMS
Azure.IoT Build 0:6ae2f7bca550 95 } DECODE_LIST_STEP;
Azure.IoT Build 0:6ae2f7bca550 96
Azure.IoT Build 0:6ae2f7bca550 97 typedef enum DECODE_ARRAY_STEP_TAG
Azure.IoT Build 0:6ae2f7bca550 98 {
Azure.IoT Build 0:6ae2f7bca550 99 DECODE_ARRAY_STEP_SIZE,
Azure.IoT Build 0:6ae2f7bca550 100 DECODE_ARRAY_STEP_COUNT,
Azure.IoT Build 0:6ae2f7bca550 101 DECODE_ARRAY_STEP_ITEMS
Azure.IoT Build 0:6ae2f7bca550 102 } DECODE_ARRAY_STEP;
Azure.IoT Build 0:6ae2f7bca550 103
Azure.IoT Build 0:6ae2f7bca550 104 typedef enum DECODE_DESCRIBED_VALUE_STEP_TAG
Azure.IoT Build 0:6ae2f7bca550 105 {
Azure.IoT Build 0:6ae2f7bca550 106 DECODE_DESCRIBED_VALUE_STEP_DESCRIPTOR,
Azure.IoT Build 0:6ae2f7bca550 107 DECODE_DESCRIBED_VALUE_STEP_VALUE
Azure.IoT Build 0:6ae2f7bca550 108 } DECODE_DESCRIBED_VALUE_STEP;
Azure.IoT Build 0:6ae2f7bca550 109
Azure.IoT Build 0:6ae2f7bca550 110 typedef enum DECODE_MAP_STEP_TAG
Azure.IoT Build 0:6ae2f7bca550 111 {
Azure.IoT Build 0:6ae2f7bca550 112 DECODE_MAP_STEP_SIZE,
Azure.IoT Build 0:6ae2f7bca550 113 DECODE_MAP_STEP_COUNT,
Azure.IoT Build 0:6ae2f7bca550 114 DECODE_MAP_STEP_PAIRS
Azure.IoT Build 0:6ae2f7bca550 115 } DECODE_MAP_STEP;
Azure.IoT Build 0:6ae2f7bca550 116
Azure.IoT Build 0:6ae2f7bca550 117 typedef struct DECODE_LIST_VALUE_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 118 {
Azure.IoT Build 0:6ae2f7bca550 119 DECODE_LIST_STEP list_value_state;
Azure.IoT Build 0:6ae2f7bca550 120 uint32_t item;
Azure.IoT Build 0:6ae2f7bca550 121 } DECODE_LIST_VALUE_STATE;
Azure.IoT Build 0:6ae2f7bca550 122
Azure.IoT Build 0:6ae2f7bca550 123 typedef struct DECODE_ARRAY_VALUE_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 124 {
Azure.IoT Build 0:6ae2f7bca550 125 DECODE_ARRAY_STEP array_value_state;
Azure.IoT Build 0:6ae2f7bca550 126 uint32_t item;
Azure.IoT Build 0:6ae2f7bca550 127 unsigned char constructor_byte;
Azure.IoT Build 0:6ae2f7bca550 128 } DECODE_ARRAY_VALUE_STATE;
Azure.IoT Build 0:6ae2f7bca550 129
Azure.IoT Build 0:6ae2f7bca550 130 typedef struct DECODE_DESCRIBED_VALUE_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 131 {
Azure.IoT Build 0:6ae2f7bca550 132 DECODE_DESCRIBED_VALUE_STEP described_value_state;
Azure.IoT Build 0:6ae2f7bca550 133 } DECODE_DESCRIBED_VALUE_STATE;
Azure.IoT Build 0:6ae2f7bca550 134
Azure.IoT Build 0:6ae2f7bca550 135 typedef struct DECODE_STRING_VALUE_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 136 {
Azure.IoT Build 0:6ae2f7bca550 137 uint32_t length;
Azure.IoT Build 0:6ae2f7bca550 138 } DECODE_STRING_VALUE_STATE;
Azure.IoT Build 0:6ae2f7bca550 139
Azure.IoT Build 0:6ae2f7bca550 140 typedef struct DECODE_SYMBOL_VALUE_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 141 {
Azure.IoT Build 0:6ae2f7bca550 142 uint32_t length;
Azure.IoT Build 0:6ae2f7bca550 143 } DECODE_SYMBOL_VALUE_STATE;
Azure.IoT Build 0:6ae2f7bca550 144
Azure.IoT Build 0:6ae2f7bca550 145 typedef struct DECODE_MAP_VALUE_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 146 {
Azure.IoT Build 0:6ae2f7bca550 147 DECODE_MAP_STEP map_value_state;
Azure.IoT Build 0:6ae2f7bca550 148 uint32_t item;
Azure.IoT Build 0:6ae2f7bca550 149 } DECODE_MAP_VALUE_STATE;
Azure.IoT Build 0:6ae2f7bca550 150
Azure.IoT Build 0:6ae2f7bca550 151 typedef union DECODE_VALUE_STATE_UNION_TAG
Azure.IoT Build 0:6ae2f7bca550 152 {
Azure.IoT Build 0:6ae2f7bca550 153 DECODE_LIST_VALUE_STATE list_value_state;
Azure.IoT Build 0:6ae2f7bca550 154 DECODE_ARRAY_VALUE_STATE array_value_state;
Azure.IoT Build 0:6ae2f7bca550 155 DECODE_DESCRIBED_VALUE_STATE described_value_state;
Azure.IoT Build 0:6ae2f7bca550 156 DECODE_STRING_VALUE_STATE string_value_state;
Azure.IoT Build 0:6ae2f7bca550 157 DECODE_SYMBOL_VALUE_STATE symbol_value_state;
Azure.IoT Build 0:6ae2f7bca550 158 DECODE_MAP_VALUE_STATE map_value_state;
Azure.IoT Build 0:6ae2f7bca550 159 } DECODE_VALUE_STATE_UNION;
Azure.IoT Build 0:6ae2f7bca550 160
Azure.IoT Build 0:6ae2f7bca550 161 typedef struct AMQP_VALUE_DATA_TAG
Azure.IoT Build 0:6ae2f7bca550 162 {
Azure.IoT Build 0:6ae2f7bca550 163 AMQP_TYPE type;
Azure.IoT Build 0:6ae2f7bca550 164 AMQP_VALUE_UNION value;
Azure.IoT Build 0:6ae2f7bca550 165 } AMQP_VALUE_DATA;
Azure.IoT Build 0:6ae2f7bca550 166
Azure.IoT Build 0:6ae2f7bca550 167 typedef enum DECODER_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 168 {
Azure.IoT Build 0:6ae2f7bca550 169 DECODER_STATE_CONSTRUCTOR,
Azure.IoT Build 0:6ae2f7bca550 170 DECODER_STATE_TYPE_DATA,
Azure.IoT Build 0:6ae2f7bca550 171 DECODER_STATE_DONE,
Azure.IoT Build 0:6ae2f7bca550 172 DECODER_STATE_ERROR
Azure.IoT Build 0:6ae2f7bca550 173 } DECODER_STATE;
Azure.IoT Build 0:6ae2f7bca550 174
AzureIoTClient 23:1111ee8bcba4 175 typedef struct INTERNAL_DECODER_DATA_TAG* INTERNAL_DECODER_HANDLE;
AzureIoTClient 23:1111ee8bcba4 176
Azure.IoT Build 0:6ae2f7bca550 177 typedef struct INTERNAL_DECODER_DATA_TAG
Azure.IoT Build 0:6ae2f7bca550 178 {
Azure.IoT Build 0:6ae2f7bca550 179 ON_VALUE_DECODED on_value_decoded;
Azure.IoT Build 0:6ae2f7bca550 180 void* on_value_decoded_context;
Azure.IoT Build 0:6ae2f7bca550 181 size_t bytes_decoded;
Azure.IoT Build 0:6ae2f7bca550 182 DECODER_STATE decoder_state;
Azure.IoT Build 0:6ae2f7bca550 183 uint8_t constructor_byte;
Azure.IoT Build 0:6ae2f7bca550 184 AMQP_VALUE_DATA* decode_to_value;
AzureIoTClient 23:1111ee8bcba4 185 INTERNAL_DECODER_HANDLE inner_decoder;
Azure.IoT Build 0:6ae2f7bca550 186 DECODE_VALUE_STATE_UNION decode_value_state;
Azure.IoT Build 0:6ae2f7bca550 187 } INTERNAL_DECODER_DATA;
Azure.IoT Build 0:6ae2f7bca550 188
AzureIoTClient 7:9e9ab3b0efef 189 typedef struct AMQPVALUE_DECODER_HANDLE_DATA_TAG
Azure.IoT Build 0:6ae2f7bca550 190 {
Azure.IoT Build 0:6ae2f7bca550 191 INTERNAL_DECODER_DATA* internal_decoder;
Azure.IoT Build 0:6ae2f7bca550 192 AMQP_VALUE_DATA* decode_to_value;
AzureIoTClient 7:9e9ab3b0efef 193 } AMQPVALUE_DECODER_HANDLE_DATA;
Azure.IoT Build 0:6ae2f7bca550 194
Azure.IoT Build 0:6ae2f7bca550 195 /* Codes_SRS_AMQPVALUE_01_003: [1.6.1 null Indicates an empty value.] */
Azure.IoT Build 0:6ae2f7bca550 196 AMQP_VALUE amqpvalue_create_null(void)
Azure.IoT Build 0:6ae2f7bca550 197 {
AzureIoTClient 21:f9c433d8e6ca 198 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 199 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 200 {
AzureIoTClient 23:1111ee8bcba4 201 /* Codes_SRS_AMQPVALUE_01_002: [If allocating the AMQP_VALUE fails then amqpvalue_create_null shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 202 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 203 }
AzureIoTClient 23:1111ee8bcba4 204 else
AzureIoTClient 23:1111ee8bcba4 205 {
Azure.IoT Build 0:6ae2f7bca550 206 /* Codes_SRS_AMQPVALUE_01_001: [amqpvalue_create_null shall return a handle to an AMQP_VALUE that stores a null value.] */
Azure.IoT Build 0:6ae2f7bca550 207 result->type = AMQP_TYPE_NULL;
Azure.IoT Build 0:6ae2f7bca550 208 }
AzureIoTClient 23:1111ee8bcba4 209
Azure.IoT Build 0:6ae2f7bca550 210 return result;
Azure.IoT Build 0:6ae2f7bca550 211 }
Azure.IoT Build 0:6ae2f7bca550 212
Azure.IoT Build 0:6ae2f7bca550 213 /* Codes_SRS_AMQPVALUE_01_004: [1.6.2 boolean Represents a true or false value.] */
Azure.IoT Build 0:6ae2f7bca550 214 AMQP_VALUE amqpvalue_create_boolean(bool value)
Azure.IoT Build 0:6ae2f7bca550 215 {
AzureIoTClient 21:f9c433d8e6ca 216 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 217 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 218 {
AzureIoTClient 23:1111ee8bcba4 219 /* Codes_SRS_AMQPVALUE_01_007: [If allocating the AMQP_VALUE fails then amqpvalue_create_boolean shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 220 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 221 }
AzureIoTClient 23:1111ee8bcba4 222 else
Azure.IoT Build 0:6ae2f7bca550 223 {
Azure.IoT Build 0:6ae2f7bca550 224 /* Codes_SRS_AMQPVALUE_01_006: [amqpvalue_create_boolean shall return a handle to an AMQP_VALUE that stores a boolean value.] */
Azure.IoT Build 0:6ae2f7bca550 225 result->type = AMQP_TYPE_BOOL;
Azure.IoT Build 0:6ae2f7bca550 226 result->value.bool_value = value;
Azure.IoT Build 0:6ae2f7bca550 227 }
Azure.IoT Build 0:6ae2f7bca550 228
Azure.IoT Build 0:6ae2f7bca550 229 return result;
Azure.IoT Build 0:6ae2f7bca550 230 }
Azure.IoT Build 0:6ae2f7bca550 231
Azure.IoT Build 0:6ae2f7bca550 232 int amqpvalue_get_boolean(AMQP_VALUE value, bool* bool_value)
Azure.IoT Build 0:6ae2f7bca550 233 {
Azure.IoT Build 0:6ae2f7bca550 234 int result;
Azure.IoT Build 0:6ae2f7bca550 235
Azure.IoT Build 0:6ae2f7bca550 236 /* Codes_SRS_AMQPVALUE_01_009: [If any of the arguments is NULL then amqpvalue_get_boolean shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 237 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 238 (bool_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 239 {
AzureIoTClient 23:1111ee8bcba4 240 LogError("Bad arguments: value = %p, bool_value = %p",
AzureIoTClient 23:1111ee8bcba4 241 value, bool_value);
AzureIoTClient 23:1111ee8bcba4 242 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 243 }
Azure.IoT Build 0:6ae2f7bca550 244 else
Azure.IoT Build 0:6ae2f7bca550 245 {
Azure.IoT Build 0:6ae2f7bca550 246 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 247 /* Codes_SRS_AMQPVALUE_01_011: [If the type of the value is not Boolean, then amqpvalue_get_boolean shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 248 if (value_data->type != AMQP_TYPE_BOOL)
Azure.IoT Build 0:6ae2f7bca550 249 {
AzureIoTClient 23:1111ee8bcba4 250 LogError("Value is not of type bool");
AzureIoTClient 23:1111ee8bcba4 251 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 252 }
Azure.IoT Build 0:6ae2f7bca550 253 else
Azure.IoT Build 0:6ae2f7bca550 254 {
Azure.IoT Build 0:6ae2f7bca550 255 /* Codes_SRS_AMQPVALUE_01_008: [amqpvalue_get_boolean shall fill in the bool_value argument the Boolean value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 256 *bool_value = value_data->value.bool_value;
Azure.IoT Build 0:6ae2f7bca550 257
Azure.IoT Build 0:6ae2f7bca550 258 /* Codes_SRS_AMQPVALUE_01_010: [On success amqpvalue_get_boolean shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 259 result = 0;
Azure.IoT Build 0:6ae2f7bca550 260 }
Azure.IoT Build 0:6ae2f7bca550 261 }
Azure.IoT Build 0:6ae2f7bca550 262
Azure.IoT Build 0:6ae2f7bca550 263 return result;
Azure.IoT Build 0:6ae2f7bca550 264 }
Azure.IoT Build 0:6ae2f7bca550 265
Azure.IoT Build 0:6ae2f7bca550 266 /* Codes_SRS_AMQPVALUE_01_005: [1.6.3 ubyte Integer in the range 0 to 28 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 267 AMQP_VALUE amqpvalue_create_ubyte(unsigned char value)
Azure.IoT Build 0:6ae2f7bca550 268 {
AzureIoTClient 21:f9c433d8e6ca 269 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 270 if (result != NULL)
Azure.IoT Build 0:6ae2f7bca550 271 {
Azure.IoT Build 0:6ae2f7bca550 272 /* Codes_SRS_AMQPVALUE_01_032: [amqpvalue_create_ubyte shall return a handle to an AMQP_VALUE that stores a unsigned char value.] */
Azure.IoT Build 0:6ae2f7bca550 273 result->type = AMQP_TYPE_UBYTE;
Azure.IoT Build 0:6ae2f7bca550 274 result->value.ubyte_value = value;
Azure.IoT Build 0:6ae2f7bca550 275 }
Azure.IoT Build 0:6ae2f7bca550 276
Azure.IoT Build 0:6ae2f7bca550 277 return result;
Azure.IoT Build 0:6ae2f7bca550 278 }
Azure.IoT Build 0:6ae2f7bca550 279
Azure.IoT Build 0:6ae2f7bca550 280 int amqpvalue_get_ubyte(AMQP_VALUE value, unsigned char* ubyte_value)
Azure.IoT Build 0:6ae2f7bca550 281 {
Azure.IoT Build 0:6ae2f7bca550 282 int result;
Azure.IoT Build 0:6ae2f7bca550 283
Azure.IoT Build 0:6ae2f7bca550 284 /* Codes_SRS_AMQPVALUE_01_036: [If any of the arguments is NULL then amqpvalue_get_ubyte shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 285 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 286 (ubyte_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 287 {
AzureIoTClient 23:1111ee8bcba4 288 LogError("Bad arguments: value = %p, ubyte_value = %p",
AzureIoTClient 23:1111ee8bcba4 289 value, ubyte_value);
AzureIoTClient 23:1111ee8bcba4 290 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 291 }
Azure.IoT Build 0:6ae2f7bca550 292 else
Azure.IoT Build 0:6ae2f7bca550 293 {
Azure.IoT Build 0:6ae2f7bca550 294 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 295 /* Codes_SRS_AMQPVALUE_01_037: [If the type of the value is not ubyte (was not created with amqpvalue_create_ubyte), then amqpvalue_get_ubyte shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 296 if (value_data->type != AMQP_TYPE_UBYTE)
Azure.IoT Build 0:6ae2f7bca550 297 {
AzureIoTClient 23:1111ee8bcba4 298 LogError("Value is not of type UBYTE");
AzureIoTClient 23:1111ee8bcba4 299 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 300 }
Azure.IoT Build 0:6ae2f7bca550 301 else
Azure.IoT Build 0:6ae2f7bca550 302 {
Azure.IoT Build 0:6ae2f7bca550 303 /* Codes_SRS_AMQPVALUE_01_034: [amqpvalue_get_ubyte shall fill in the ubyte_value argument the unsigned char value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 304 *ubyte_value = value_data->value.ubyte_value;
Azure.IoT Build 0:6ae2f7bca550 305
Azure.IoT Build 0:6ae2f7bca550 306 /* Codes_SRS_AMQPVALUE_01_035: [On success amqpvalue_get_ubyte shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 307 result = 0;
Azure.IoT Build 0:6ae2f7bca550 308 }
Azure.IoT Build 0:6ae2f7bca550 309 }
Azure.IoT Build 0:6ae2f7bca550 310
Azure.IoT Build 0:6ae2f7bca550 311 return result;
Azure.IoT Build 0:6ae2f7bca550 312 }
Azure.IoT Build 0:6ae2f7bca550 313
Azure.IoT Build 0:6ae2f7bca550 314 /* Codes_SRS_AMQPVALUE_01_012: [1.6.4 ushort Integer in the range 0 to 216 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 315 AMQP_VALUE amqpvalue_create_ushort(uint16_t value)
Azure.IoT Build 0:6ae2f7bca550 316 {
AzureIoTClient 21:f9c433d8e6ca 317 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 318 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 319 {
AzureIoTClient 23:1111ee8bcba4 320 /* Codes_SRS_AMQPVALUE_01_039: [If allocating the AMQP_VALUE fails then amqpvalue_create_ushort shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 321 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 322 }
AzureIoTClient 23:1111ee8bcba4 323 else
AzureIoTClient 23:1111ee8bcba4 324 {
Azure.IoT Build 0:6ae2f7bca550 325 /* Codes_SRS_AMQPVALUE_01_038: [amqpvalue_create_ushort shall return a handle to an AMQP_VALUE that stores an uint16_t value.] */
Azure.IoT Build 0:6ae2f7bca550 326 result->type = AMQP_TYPE_USHORT;
Azure.IoT Build 0:6ae2f7bca550 327 result->value.ushort_value = value;
Azure.IoT Build 0:6ae2f7bca550 328 }
AzureIoTClient 23:1111ee8bcba4 329
Azure.IoT Build 0:6ae2f7bca550 330 return result;
Azure.IoT Build 0:6ae2f7bca550 331 }
Azure.IoT Build 0:6ae2f7bca550 332
Azure.IoT Build 0:6ae2f7bca550 333 int amqpvalue_get_ushort(AMQP_VALUE value, uint16_t* ushort_value)
Azure.IoT Build 0:6ae2f7bca550 334 {
Azure.IoT Build 0:6ae2f7bca550 335 int result;
Azure.IoT Build 0:6ae2f7bca550 336
Azure.IoT Build 0:6ae2f7bca550 337 /* Codes_SRS_AMQPVALUE_01_042: [If any of the arguments is NULL then amqpvalue_get_ushort shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 338 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 339 (ushort_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 340 {
AzureIoTClient 23:1111ee8bcba4 341 LogError("Bad arguments: value = %p, ushort_value = %p",
AzureIoTClient 23:1111ee8bcba4 342 value, ushort_value);
AzureIoTClient 23:1111ee8bcba4 343 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 344 }
Azure.IoT Build 0:6ae2f7bca550 345 else
Azure.IoT Build 0:6ae2f7bca550 346 {
Azure.IoT Build 0:6ae2f7bca550 347 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 348 /* Codes_SRS_AMQPVALUE_01_043: [If the type of the value is not ushort (was not created with amqpvalue_create_ushort), then amqpvalue_get_ushort shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 349 if (value_data->type != AMQP_TYPE_USHORT)
Azure.IoT Build 0:6ae2f7bca550 350 {
AzureIoTClient 23:1111ee8bcba4 351 LogError("Value is not of type USHORT");
AzureIoTClient 23:1111ee8bcba4 352 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 353 }
Azure.IoT Build 0:6ae2f7bca550 354 else
Azure.IoT Build 0:6ae2f7bca550 355 {
Azure.IoT Build 0:6ae2f7bca550 356 /* Codes_SRS_AMQPVALUE_01_040: [amqpvalue_get_ushort shall fill in the ushort_value argument the uint16_t value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 357 *ushort_value = value_data->value.ushort_value;
Azure.IoT Build 0:6ae2f7bca550 358
Azure.IoT Build 0:6ae2f7bca550 359 /* Codes_SRS_AMQPVALUE_01_041: [On success amqpvalue_get_ushort shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 360 result = 0;
Azure.IoT Build 0:6ae2f7bca550 361 }
Azure.IoT Build 0:6ae2f7bca550 362 }
Azure.IoT Build 0:6ae2f7bca550 363
Azure.IoT Build 0:6ae2f7bca550 364 return result;
Azure.IoT Build 0:6ae2f7bca550 365 }
Azure.IoT Build 0:6ae2f7bca550 366
Azure.IoT Build 0:6ae2f7bca550 367 /* Codes_SRS_AMQPVALUE_01_013: [1.6.5 uint Integer in the range 0 to 232 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 368 AMQP_VALUE amqpvalue_create_uint(uint32_t value)
Azure.IoT Build 0:6ae2f7bca550 369 {
AzureIoTClient 21:f9c433d8e6ca 370 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 371 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 372 {
AzureIoTClient 23:1111ee8bcba4 373 /* Codes_SRS_AMQPVALUE_01_045: [If allocating the AMQP_VALUE fails then amqpvalue_create_uint shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 374 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 375 }
AzureIoTClient 23:1111ee8bcba4 376 else
Azure.IoT Build 0:6ae2f7bca550 377 {
Azure.IoT Build 0:6ae2f7bca550 378 /* Codes_SRS_AMQPVALUE_01_044: [amqpvalue_create_uint shall return a handle to an AMQP_VALUE that stores an uint32_t value.] */
Azure.IoT Build 0:6ae2f7bca550 379 result->type = AMQP_TYPE_UINT;
Azure.IoT Build 0:6ae2f7bca550 380 result->value.uint_value = value;
Azure.IoT Build 0:6ae2f7bca550 381 }
AzureIoTClient 23:1111ee8bcba4 382
Azure.IoT Build 0:6ae2f7bca550 383 return result;
Azure.IoT Build 0:6ae2f7bca550 384 }
Azure.IoT Build 0:6ae2f7bca550 385
Azure.IoT Build 0:6ae2f7bca550 386 int amqpvalue_get_uint(AMQP_VALUE value, uint32_t* uint_value)
Azure.IoT Build 0:6ae2f7bca550 387 {
Azure.IoT Build 0:6ae2f7bca550 388 int result;
Azure.IoT Build 0:6ae2f7bca550 389
Azure.IoT Build 0:6ae2f7bca550 390 /* Codes_SRS_AMQPVALUE_01_079: [If any of the arguments is NULL then amqpvalue_get_uint shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 391 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 392 (uint_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 393 {
AzureIoTClient 23:1111ee8bcba4 394 LogError("Bad arguments: value = %p, uint_value = %p",
AzureIoTClient 23:1111ee8bcba4 395 value, uint_value);
AzureIoTClient 23:1111ee8bcba4 396 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 397 }
Azure.IoT Build 0:6ae2f7bca550 398 else
Azure.IoT Build 0:6ae2f7bca550 399 {
Azure.IoT Build 0:6ae2f7bca550 400 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 401 /* Codes_SRS_AMQPVALUE_01_048: [If the type of the value is not uint (was not created with amqpvalue_create_uint), then amqpvalue_get_uint shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 402 if (value_data->type != AMQP_TYPE_UINT)
Azure.IoT Build 0:6ae2f7bca550 403 {
AzureIoTClient 23:1111ee8bcba4 404 LogError("Value is not of type UINT");
AzureIoTClient 23:1111ee8bcba4 405 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 406 }
Azure.IoT Build 0:6ae2f7bca550 407 else
Azure.IoT Build 0:6ae2f7bca550 408 {
Azure.IoT Build 0:6ae2f7bca550 409 /* Codes_SRS_AMQPVALUE_01_046: [amqpvalue_get_uint shall fill in the uint_value argument the uint32_t value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 410 *uint_value = value_data->value.uint_value;
Azure.IoT Build 0:6ae2f7bca550 411
Azure.IoT Build 0:6ae2f7bca550 412 /* Codes_SRS_AMQPVALUE_01_047: [On success amqpvalue_get_uint shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 413 result = 0;
Azure.IoT Build 0:6ae2f7bca550 414 }
Azure.IoT Build 0:6ae2f7bca550 415 }
Azure.IoT Build 0:6ae2f7bca550 416
Azure.IoT Build 0:6ae2f7bca550 417 return result;
Azure.IoT Build 0:6ae2f7bca550 418 }
Azure.IoT Build 0:6ae2f7bca550 419
Azure.IoT Build 0:6ae2f7bca550 420 /* Codes_SRS_AMQPVALUE_01_014: [1.6.6 ulong Integer in the range 0 to 264 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 421 AMQP_VALUE amqpvalue_create_ulong(uint64_t value)
Azure.IoT Build 0:6ae2f7bca550 422 {
AzureIoTClient 21:f9c433d8e6ca 423 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 424 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 425 {
AzureIoTClient 23:1111ee8bcba4 426 /* Codes_SRS_AMQPVALUE_01_050: [If allocating the AMQP_VALUE fails then amqpvalue_create_ulong shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 427 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 428 }
AzureIoTClient 23:1111ee8bcba4 429 else
AzureIoTClient 23:1111ee8bcba4 430 {
Azure.IoT Build 0:6ae2f7bca550 431 /* Codes_SRS_AMQPVALUE_01_049: [amqpvalue_create_ulong shall return a handle to an AMQP_VALUE that stores an uint64_t value.] */
Azure.IoT Build 0:6ae2f7bca550 432 result->type = AMQP_TYPE_ULONG;
Azure.IoT Build 0:6ae2f7bca550 433 result->value.ulong_value = value;
Azure.IoT Build 0:6ae2f7bca550 434 }
AzureIoTClient 23:1111ee8bcba4 435
Azure.IoT Build 0:6ae2f7bca550 436 return result;
Azure.IoT Build 0:6ae2f7bca550 437 }
Azure.IoT Build 0:6ae2f7bca550 438
Azure.IoT Build 0:6ae2f7bca550 439 int amqpvalue_get_ulong(AMQP_VALUE value, uint64_t* ulong_value)
Azure.IoT Build 0:6ae2f7bca550 440 {
Azure.IoT Build 0:6ae2f7bca550 441 int result;
Azure.IoT Build 0:6ae2f7bca550 442
Azure.IoT Build 0:6ae2f7bca550 443 /* Codes_SRS_AMQPVALUE_01_053: [If any of the arguments is NULL then amqpvalue_get_ulong shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 444 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 445 (ulong_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 446 {
AzureIoTClient 23:1111ee8bcba4 447 LogError("Bad arguments: value = %p, ulong_value = %p",
AzureIoTClient 23:1111ee8bcba4 448 value, ulong_value);
AzureIoTClient 23:1111ee8bcba4 449 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 450 }
Azure.IoT Build 0:6ae2f7bca550 451 else
Azure.IoT Build 0:6ae2f7bca550 452 {
Azure.IoT Build 0:6ae2f7bca550 453 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 454 /* Codes_SRS_AMQPVALUE_01_054: [If the type of the value is not ulong (was not created with amqpvalue_create_ulong), then amqpvalue_get_ulong shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 455 if (value_data->type != AMQP_TYPE_ULONG)
Azure.IoT Build 0:6ae2f7bca550 456 {
AzureIoTClient 23:1111ee8bcba4 457 LogError("Value is not of type ULONG");
AzureIoTClient 23:1111ee8bcba4 458 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 459 }
Azure.IoT Build 0:6ae2f7bca550 460 else
Azure.IoT Build 0:6ae2f7bca550 461 {
Azure.IoT Build 0:6ae2f7bca550 462 /* Codes_SRS_AMQPVALUE_01_051: [amqpvalue_get_ulong shall fill in the ulong_value argument the ulong64_t value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 463 *ulong_value = value_data->value.ulong_value;
Azure.IoT Build 0:6ae2f7bca550 464
Azure.IoT Build 0:6ae2f7bca550 465 /* Codes_SRS_AMQPVALUE_01_052: [On success amqpvalue_get_ulong shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 466 result = 0;
Azure.IoT Build 0:6ae2f7bca550 467 }
Azure.IoT Build 0:6ae2f7bca550 468 }
Azure.IoT Build 0:6ae2f7bca550 469
Azure.IoT Build 0:6ae2f7bca550 470 return result;
Azure.IoT Build 0:6ae2f7bca550 471 }
Azure.IoT Build 0:6ae2f7bca550 472
Azure.IoT Build 0:6ae2f7bca550 473 /* Codes_SRS_AMQPVALUE_01_015: [1.6.7 byte Integer in the range -(27) to 27 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 474 AMQP_VALUE amqpvalue_create_byte(char value)
Azure.IoT Build 0:6ae2f7bca550 475 {
AzureIoTClient 21:f9c433d8e6ca 476 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 477 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 478 {
AzureIoTClient 23:1111ee8bcba4 479 /* Codes_SRS_AMQPVALUE_01_056: [If allocating the AMQP_VALUE fails then amqpvalue_create_byte shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 480 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 481 }
AzureIoTClient 23:1111ee8bcba4 482 else
Azure.IoT Build 0:6ae2f7bca550 483 {
Azure.IoT Build 0:6ae2f7bca550 484 /* Codes_SRS_AMQPVALUE_01_055: [amqpvalue_create_byte shall return a handle to an AMQP_VALUE that stores a char value.] */
Azure.IoT Build 0:6ae2f7bca550 485 result->type = AMQP_TYPE_BYTE;
Azure.IoT Build 0:6ae2f7bca550 486 result->value.byte_value = value;
Azure.IoT Build 0:6ae2f7bca550 487 }
AzureIoTClient 23:1111ee8bcba4 488
Azure.IoT Build 0:6ae2f7bca550 489 return result;
Azure.IoT Build 0:6ae2f7bca550 490 }
Azure.IoT Build 0:6ae2f7bca550 491
Azure.IoT Build 0:6ae2f7bca550 492 int amqpvalue_get_byte(AMQP_VALUE value, char* byte_value)
Azure.IoT Build 0:6ae2f7bca550 493 {
Azure.IoT Build 0:6ae2f7bca550 494 int result;
Azure.IoT Build 0:6ae2f7bca550 495
Azure.IoT Build 0:6ae2f7bca550 496 /* Codes_SRS_AMQPVALUE_01_059: [If any of the arguments is NULL then amqpvalue_get_byte shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 497 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 498 (byte_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 499 {
AzureIoTClient 23:1111ee8bcba4 500 LogError("Bad arguments: value = %p, byte_value = %p",
AzureIoTClient 23:1111ee8bcba4 501 value, byte_value);
AzureIoTClient 23:1111ee8bcba4 502 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 503 }
Azure.IoT Build 0:6ae2f7bca550 504 else
Azure.IoT Build 0:6ae2f7bca550 505 {
Azure.IoT Build 0:6ae2f7bca550 506 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 507 /* Codes_SRS_AMQPVALUE_01_060: [If the type of the value is not byte (was not created with amqpvalue_create_byte), then amqpvalue_get_byte shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 508 if (value_data->type != AMQP_TYPE_BYTE)
Azure.IoT Build 0:6ae2f7bca550 509 {
AzureIoTClient 23:1111ee8bcba4 510 LogError("Value is not of type BYTE");
AzureIoTClient 23:1111ee8bcba4 511 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 512 }
Azure.IoT Build 0:6ae2f7bca550 513 else
Azure.IoT Build 0:6ae2f7bca550 514 {
Azure.IoT Build 0:6ae2f7bca550 515 /* Codes_SRS_AMQPVALUE_01_057: [amqpvalue_get_byte shall fill in the byte_value argument the char value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 516 *byte_value = value_data->value.byte_value;
Azure.IoT Build 0:6ae2f7bca550 517
Azure.IoT Build 0:6ae2f7bca550 518 /* Codes_SRS_AMQPVALUE_01_058: [On success amqpvalue_get_byte shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 519 result = 0;
Azure.IoT Build 0:6ae2f7bca550 520 }
Azure.IoT Build 0:6ae2f7bca550 521 }
Azure.IoT Build 0:6ae2f7bca550 522
Azure.IoT Build 0:6ae2f7bca550 523 return result;
Azure.IoT Build 0:6ae2f7bca550 524 }
Azure.IoT Build 0:6ae2f7bca550 525
Azure.IoT Build 0:6ae2f7bca550 526 /* Codes_SRS_AMQPVALUE_01_016: [1.6.8 short Integer in the range -(215) to 215 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 527 AMQP_VALUE amqpvalue_create_short(int16_t value)
Azure.IoT Build 0:6ae2f7bca550 528 {
AzureIoTClient 21:f9c433d8e6ca 529 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 530 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 531 {
AzureIoTClient 23:1111ee8bcba4 532 /* Codes_SRS_AMQPVALUE_01_062: [If allocating the AMQP_VALUE fails then amqpvalue_create_short shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 533 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 534 }
AzureIoTClient 23:1111ee8bcba4 535 else
AzureIoTClient 23:1111ee8bcba4 536 {
Azure.IoT Build 0:6ae2f7bca550 537 /* Codes_SRS_AMQPVALUE_01_061: [amqpvalue_create_short shall return a handle to an AMQP_VALUE that stores an int16_t value.] */
Azure.IoT Build 0:6ae2f7bca550 538 result->type = AMQP_TYPE_SHORT;
Azure.IoT Build 0:6ae2f7bca550 539 result->value.short_value = value;
Azure.IoT Build 0:6ae2f7bca550 540 }
Azure.IoT Build 0:6ae2f7bca550 541 return result;
Azure.IoT Build 0:6ae2f7bca550 542 }
Azure.IoT Build 0:6ae2f7bca550 543
Azure.IoT Build 0:6ae2f7bca550 544 int amqpvalue_get_short(AMQP_VALUE value, int16_t* short_value)
Azure.IoT Build 0:6ae2f7bca550 545 {
Azure.IoT Build 0:6ae2f7bca550 546 int result;
Azure.IoT Build 0:6ae2f7bca550 547
Azure.IoT Build 0:6ae2f7bca550 548 /* Codes_SRS_AMQPVALUE_01_065: [If any of the arguments is NULL then amqpvalue_get_short shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 549 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 550 (short_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 551 {
AzureIoTClient 23:1111ee8bcba4 552 LogError("Bad arguments: value = %p, short_value = %p",
AzureIoTClient 23:1111ee8bcba4 553 value, short_value);
AzureIoTClient 23:1111ee8bcba4 554 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 555 }
Azure.IoT Build 0:6ae2f7bca550 556 else
Azure.IoT Build 0:6ae2f7bca550 557 {
Azure.IoT Build 0:6ae2f7bca550 558 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 559 /* Codes_SRS_AMQPVALUE_01_066: [If the type of the value is not short (was not created with amqpvalue_create_short), then amqpvalue_get_short shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 560 if (value_data->type != AMQP_TYPE_SHORT)
Azure.IoT Build 0:6ae2f7bca550 561 {
AzureIoTClient 23:1111ee8bcba4 562 LogError("Value is not of type SHORT");
AzureIoTClient 23:1111ee8bcba4 563 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 564 }
Azure.IoT Build 0:6ae2f7bca550 565 else
Azure.IoT Build 0:6ae2f7bca550 566 {
Azure.IoT Build 0:6ae2f7bca550 567 /* Codes_SRS_AMQPVALUE_01_063: [amqpvalue_get_short shall fill in the short_value argument the int16_t value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 568 *short_value = value_data->value.short_value;
Azure.IoT Build 0:6ae2f7bca550 569
Azure.IoT Build 0:6ae2f7bca550 570 /* Codes_SRS_AMQPVALUE_01_064: [On success amqpvalue_get_short shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 571 result = 0;
Azure.IoT Build 0:6ae2f7bca550 572 }
Azure.IoT Build 0:6ae2f7bca550 573 }
Azure.IoT Build 0:6ae2f7bca550 574
Azure.IoT Build 0:6ae2f7bca550 575 return result;
Azure.IoT Build 0:6ae2f7bca550 576 }
Azure.IoT Build 0:6ae2f7bca550 577
Azure.IoT Build 0:6ae2f7bca550 578 /* Codes_SRS_AMQPVALUE_01_017: [1.6.9 int Integer in the range -(231) to 231 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 579 AMQP_VALUE amqpvalue_create_int(int32_t value)
Azure.IoT Build 0:6ae2f7bca550 580 {
AzureIoTClient 21:f9c433d8e6ca 581 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 582 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 583 {
AzureIoTClient 23:1111ee8bcba4 584 /* Codes_SRS_AMQPVALUE_01_068: [If allocating the AMQP_VALUE fails then amqpvalue_create_int shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 585 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 586 }
AzureIoTClient 23:1111ee8bcba4 587 else
AzureIoTClient 23:1111ee8bcba4 588 {
Azure.IoT Build 0:6ae2f7bca550 589 /* Codes_SRS_AMQPVALUE_01_067: [amqpvalue_create_int shall return a handle to an AMQP_VALUE that stores an int32_t value.] */
Azure.IoT Build 0:6ae2f7bca550 590 result->type = AMQP_TYPE_INT;
Azure.IoT Build 0:6ae2f7bca550 591 result->value.int_value = value;
Azure.IoT Build 0:6ae2f7bca550 592 }
AzureIoTClient 23:1111ee8bcba4 593
Azure.IoT Build 0:6ae2f7bca550 594 return result;
Azure.IoT Build 0:6ae2f7bca550 595 }
Azure.IoT Build 0:6ae2f7bca550 596
Azure.IoT Build 0:6ae2f7bca550 597 int amqpvalue_get_int(AMQP_VALUE value, int32_t* int_value)
Azure.IoT Build 0:6ae2f7bca550 598 {
Azure.IoT Build 0:6ae2f7bca550 599 int result;
Azure.IoT Build 0:6ae2f7bca550 600
Azure.IoT Build 0:6ae2f7bca550 601 /* Codes_SRS_AMQPVALUE_01_071: [If any of the arguments is NULL then amqpvalue_get_int shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 602 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 603 (int_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 604 {
AzureIoTClient 23:1111ee8bcba4 605 LogError("Bad arguments: value = %p, int_value = %p",
AzureIoTClient 23:1111ee8bcba4 606 value, int_value);
AzureIoTClient 23:1111ee8bcba4 607 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 608 }
Azure.IoT Build 0:6ae2f7bca550 609 else
Azure.IoT Build 0:6ae2f7bca550 610 {
Azure.IoT Build 0:6ae2f7bca550 611 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 612 /* Codes_SRS_AMQPVALUE_01_072: [If the type of the value is not int (was not created with amqpvalue_create_int), then amqpvalue_get_int shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 613 if (value_data->type != AMQP_TYPE_INT)
Azure.IoT Build 0:6ae2f7bca550 614 {
AzureIoTClient 23:1111ee8bcba4 615 LogError("Value is not of type INT");
AzureIoTClient 23:1111ee8bcba4 616 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 617 }
Azure.IoT Build 0:6ae2f7bca550 618 else
Azure.IoT Build 0:6ae2f7bca550 619 {
Azure.IoT Build 0:6ae2f7bca550 620 /* Codes_SRS_AMQPVALUE_01_069: [amqpvalue_get_int shall fill in the int_value argument the int32_t value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 621 *int_value = value_data->value.int_value;
Azure.IoT Build 0:6ae2f7bca550 622
Azure.IoT Build 0:6ae2f7bca550 623 /* Codes_SRS_AMQPVALUE_01_070: [On success amqpvalue_get_int shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 624 result = 0;
Azure.IoT Build 0:6ae2f7bca550 625 }
Azure.IoT Build 0:6ae2f7bca550 626 }
Azure.IoT Build 0:6ae2f7bca550 627
Azure.IoT Build 0:6ae2f7bca550 628 return result;
Azure.IoT Build 0:6ae2f7bca550 629 }
Azure.IoT Build 0:6ae2f7bca550 630
Azure.IoT Build 0:6ae2f7bca550 631 /* Codes_SRS_AMQPVALUE_01_018: [1.6.10 long Integer in the range -(263) to 263 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 632 AMQP_VALUE amqpvalue_create_long(int64_t value)
Azure.IoT Build 0:6ae2f7bca550 633 {
AzureIoTClient 21:f9c433d8e6ca 634 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 635 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 636 {
AzureIoTClient 23:1111ee8bcba4 637 /* Codes_SRS_AMQPVALUE_01_074: [If allocating the AMQP_VALUE fails then amqpvalue_create_long shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 638 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 639 }
AzureIoTClient 23:1111ee8bcba4 640 else
AzureIoTClient 23:1111ee8bcba4 641 {
Azure.IoT Build 0:6ae2f7bca550 642 /* Codes_SRS_AMQPVALUE_01_073: [amqpvalue_create_long shall return a handle to an AMQP_VALUE that stores an int64_t value.] */
Azure.IoT Build 0:6ae2f7bca550 643 result->type = AMQP_TYPE_LONG;
Azure.IoT Build 0:6ae2f7bca550 644 result->value.long_value = value;
Azure.IoT Build 0:6ae2f7bca550 645 }
AzureIoTClient 23:1111ee8bcba4 646
Azure.IoT Build 0:6ae2f7bca550 647 return result;
Azure.IoT Build 0:6ae2f7bca550 648 }
Azure.IoT Build 0:6ae2f7bca550 649
Azure.IoT Build 0:6ae2f7bca550 650 int amqpvalue_get_long(AMQP_VALUE value, int64_t* long_value)
Azure.IoT Build 0:6ae2f7bca550 651 {
Azure.IoT Build 0:6ae2f7bca550 652 int result;
Azure.IoT Build 0:6ae2f7bca550 653
Azure.IoT Build 0:6ae2f7bca550 654 /* Codes_SRS_AMQPVALUE_01_077: [If any of the arguments is NULL then amqpvalue_get_long shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 655 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 656 (long_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 657 {
AzureIoTClient 23:1111ee8bcba4 658 LogError("Bad arguments: value = %p, long_value = %p",
AzureIoTClient 23:1111ee8bcba4 659 value, long_value);
AzureIoTClient 23:1111ee8bcba4 660 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 661 }
Azure.IoT Build 0:6ae2f7bca550 662 else
Azure.IoT Build 0:6ae2f7bca550 663 {
Azure.IoT Build 0:6ae2f7bca550 664 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 665 /* Codes_SRS_AMQPVALUE_01_078: [If the type of the value is not long (was not created with amqpvalue_create_long), then amqpvalue_get_long shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 666 if (value_data->type != AMQP_TYPE_LONG)
Azure.IoT Build 0:6ae2f7bca550 667 {
AzureIoTClient 23:1111ee8bcba4 668 LogError("Value is not of type LONG");
AzureIoTClient 23:1111ee8bcba4 669 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 670 }
Azure.IoT Build 0:6ae2f7bca550 671 else
Azure.IoT Build 0:6ae2f7bca550 672 {
Azure.IoT Build 0:6ae2f7bca550 673 /* Codes_SRS_AMQPVALUE_01_075: [amqpvalue_get_long shall fill in the long_value argument the int64_t value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 674 *long_value = value_data->value.long_value;
Azure.IoT Build 0:6ae2f7bca550 675
Azure.IoT Build 0:6ae2f7bca550 676 /* Codes_SRS_AMQPVALUE_01_076: [On success amqpvalue_get_long shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 677 result = 0;
Azure.IoT Build 0:6ae2f7bca550 678 }
Azure.IoT Build 0:6ae2f7bca550 679 }
Azure.IoT Build 0:6ae2f7bca550 680
Azure.IoT Build 0:6ae2f7bca550 681 return result;
Azure.IoT Build 0:6ae2f7bca550 682 }
Azure.IoT Build 0:6ae2f7bca550 683
Azure.IoT Build 0:6ae2f7bca550 684 /* Codes_SRS_AMQPVALUE_01_019: [1.6.11 float 32-bit floating point number (IEEE 754-2008 binary32).] */
Azure.IoT Build 0:6ae2f7bca550 685 AMQP_VALUE amqpvalue_create_float(float value)
Azure.IoT Build 0:6ae2f7bca550 686 {
AzureIoTClient 21:f9c433d8e6ca 687 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 688 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 689 {
AzureIoTClient 23:1111ee8bcba4 690 /* Codes_SRS_AMQPVALUE_01_081: [If allocating the AMQP_VALUE fails then amqpvalue_create_float shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 691 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 692 }
AzureIoTClient 23:1111ee8bcba4 693 else
AzureIoTClient 23:1111ee8bcba4 694 {
Azure.IoT Build 0:6ae2f7bca550 695 /* Codes_SRS_AMQPVALUE_01_080: [amqpvalue_create_float shall return a handle to an AMQP_VALUE that stores a float value.] */
Azure.IoT Build 0:6ae2f7bca550 696 result->type = AMQP_TYPE_FLOAT;
Azure.IoT Build 0:6ae2f7bca550 697 result->value.float_value = value;
Azure.IoT Build 0:6ae2f7bca550 698 }
AzureIoTClient 23:1111ee8bcba4 699
Azure.IoT Build 0:6ae2f7bca550 700 return result;
Azure.IoT Build 0:6ae2f7bca550 701 }
Azure.IoT Build 0:6ae2f7bca550 702
Azure.IoT Build 0:6ae2f7bca550 703 int amqpvalue_get_float(AMQP_VALUE value, float* float_value)
Azure.IoT Build 0:6ae2f7bca550 704 {
Azure.IoT Build 0:6ae2f7bca550 705 int result;
Azure.IoT Build 0:6ae2f7bca550 706
Azure.IoT Build 0:6ae2f7bca550 707 /* Codes_SRS_AMQPVALUE_01_084: [If any of the arguments is NULL then amqpvalue_get_float shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 708 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 709 (float_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 710 {
AzureIoTClient 23:1111ee8bcba4 711 LogError("Bad arguments: value = %p, float_value = %p",
AzureIoTClient 23:1111ee8bcba4 712 value, float_value);
AzureIoTClient 23:1111ee8bcba4 713 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 714 }
Azure.IoT Build 0:6ae2f7bca550 715 else
Azure.IoT Build 0:6ae2f7bca550 716 {
Azure.IoT Build 0:6ae2f7bca550 717 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 718 /* Codes_SRS_AMQPVALUE_01_085: [If the type of the value is not float (was not created with amqpvalue_create_float), then amqpvalue_get_float shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 719 if (value_data->type != AMQP_TYPE_FLOAT)
Azure.IoT Build 0:6ae2f7bca550 720 {
AzureIoTClient 23:1111ee8bcba4 721 LogError("Value is not of type FLOAT");
AzureIoTClient 23:1111ee8bcba4 722 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 723 }
Azure.IoT Build 0:6ae2f7bca550 724 else
Azure.IoT Build 0:6ae2f7bca550 725 {
Azure.IoT Build 0:6ae2f7bca550 726 /* Codes_SRS_AMQPVALUE_01_082: [amqpvalue_get_float shall fill in the float_value argument the float value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 727 *float_value = value_data->value.float_value;
Azure.IoT Build 0:6ae2f7bca550 728
Azure.IoT Build 0:6ae2f7bca550 729 /* Codes_SRS_AMQPVALUE_01_083: [On success amqpvalue_get_float shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 730 result = 0;
Azure.IoT Build 0:6ae2f7bca550 731 }
Azure.IoT Build 0:6ae2f7bca550 732 }
Azure.IoT Build 0:6ae2f7bca550 733
Azure.IoT Build 0:6ae2f7bca550 734 return result;
Azure.IoT Build 0:6ae2f7bca550 735 }
Azure.IoT Build 0:6ae2f7bca550 736
Azure.IoT Build 0:6ae2f7bca550 737 /* Codes_SRS_AMQPVALUE_01_020: [1.6.12 double 64-bit floating point number (IEEE 754-2008 binary64).] */
Azure.IoT Build 0:6ae2f7bca550 738 AMQP_VALUE amqpvalue_create_double(double value)
Azure.IoT Build 0:6ae2f7bca550 739 {
AzureIoTClient 21:f9c433d8e6ca 740 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 741 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 742 {
AzureIoTClient 23:1111ee8bcba4 743 /* Codes_SRS_AMQPVALUE_01_087: [If allocating the AMQP_VALUE fails then amqpvalue_create_double shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 744 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 745 }
AzureIoTClient 23:1111ee8bcba4 746 else
AzureIoTClient 23:1111ee8bcba4 747 {
Azure.IoT Build 0:6ae2f7bca550 748 /* Codes_SRS_AMQPVALUE_01_086: [amqpvalue_create_double shall return a handle to an AMQP_VALUE that stores a double value.] */
Azure.IoT Build 0:6ae2f7bca550 749 result->type = AMQP_TYPE_DOUBLE;
Azure.IoT Build 0:6ae2f7bca550 750 result->value.double_value = value;
Azure.IoT Build 0:6ae2f7bca550 751 }
AzureIoTClient 23:1111ee8bcba4 752
Azure.IoT Build 0:6ae2f7bca550 753 return result;
Azure.IoT Build 0:6ae2f7bca550 754 }
Azure.IoT Build 0:6ae2f7bca550 755
Azure.IoT Build 0:6ae2f7bca550 756 int amqpvalue_get_double(AMQP_VALUE value, double* double_value)
Azure.IoT Build 0:6ae2f7bca550 757 {
Azure.IoT Build 0:6ae2f7bca550 758 int result;
Azure.IoT Build 0:6ae2f7bca550 759
Azure.IoT Build 0:6ae2f7bca550 760 /* Codes_SRS_AMQPVALUE_01_090: [If any of the arguments is NULL then amqpvalue_get_double shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 761 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 762 (double_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 763 {
AzureIoTClient 23:1111ee8bcba4 764 LogError("Bad arguments: value = %p, double_value = %p",
AzureIoTClient 23:1111ee8bcba4 765 value, double_value);
AzureIoTClient 23:1111ee8bcba4 766 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 767 }
Azure.IoT Build 0:6ae2f7bca550 768 else
Azure.IoT Build 0:6ae2f7bca550 769 {
Azure.IoT Build 0:6ae2f7bca550 770 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 771 /* Codes_SRS_AMQPVALUE_01_091: [If the type of the value is not double (was not created with amqpvalue_create_double), then amqpvalue_get_double shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 772 if (value_data->type != AMQP_TYPE_DOUBLE)
Azure.IoT Build 0:6ae2f7bca550 773 {
AzureIoTClient 23:1111ee8bcba4 774 LogError("Value is not of type DOUBLE");
AzureIoTClient 23:1111ee8bcba4 775 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 776 }
Azure.IoT Build 0:6ae2f7bca550 777 else
Azure.IoT Build 0:6ae2f7bca550 778 {
Azure.IoT Build 0:6ae2f7bca550 779 /* Codes_SRS_AMQPVALUE_01_088: [amqpvalue_get_double shall fill in the double_value argument the double value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 780 *double_value = value_data->value.double_value;
Azure.IoT Build 0:6ae2f7bca550 781
Azure.IoT Build 0:6ae2f7bca550 782 /* Codes_SRS_AMQPVALUE_01_089: [On success amqpvalue_get_double shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 783 result = 0;
Azure.IoT Build 0:6ae2f7bca550 784 }
Azure.IoT Build 0:6ae2f7bca550 785 }
Azure.IoT Build 0:6ae2f7bca550 786
Azure.IoT Build 0:6ae2f7bca550 787 return result;
Azure.IoT Build 0:6ae2f7bca550 788 }
Azure.IoT Build 0:6ae2f7bca550 789
Azure.IoT Build 0:6ae2f7bca550 790 /* Codes_SRS_AMQPVALUE_01_024: [1.6.16 char A single Unicode character.] */
Azure.IoT Build 0:6ae2f7bca550 791 AMQP_VALUE amqpvalue_create_char(uint32_t value)
Azure.IoT Build 0:6ae2f7bca550 792 {
Azure.IoT Build 0:6ae2f7bca550 793 AMQP_VALUE_DATA* result;
Azure.IoT Build 0:6ae2f7bca550 794
Azure.IoT Build 0:6ae2f7bca550 795 /* Codes_SRS_AMQPVALUE_01_098: [If the code point value is outside of the allowed range [0, 0x10FFFF] then amqpvalue_create_char shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 796 if (value > 0x10FFFF)
Azure.IoT Build 0:6ae2f7bca550 797 {
AzureIoTClient 23:1111ee8bcba4 798 LogError("Invalid value for a Unicode char");
Azure.IoT Build 0:6ae2f7bca550 799 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 800 }
Azure.IoT Build 0:6ae2f7bca550 801 else
Azure.IoT Build 0:6ae2f7bca550 802 {
AzureIoTClient 21:f9c433d8e6ca 803 result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 804 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 805 {
AzureIoTClient 23:1111ee8bcba4 806 /* Codes_SRS_AMQPVALUE_01_093: [If allocating the AMQP_VALUE fails then amqpvalue_create_char shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 807 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 808 }
AzureIoTClient 23:1111ee8bcba4 809 else
AzureIoTClient 23:1111ee8bcba4 810 {
Azure.IoT Build 0:6ae2f7bca550 811 /* Codes_SRS_AMQPVALUE_01_092: [amqpvalue_create_char shall return a handle to an AMQP_VALUE that stores a single UTF-32 character value.] */
Azure.IoT Build 0:6ae2f7bca550 812 result->type = AMQP_TYPE_CHAR;
Azure.IoT Build 0:6ae2f7bca550 813 result->value.char_value = value;
Azure.IoT Build 0:6ae2f7bca550 814 }
Azure.IoT Build 0:6ae2f7bca550 815 }
Azure.IoT Build 0:6ae2f7bca550 816
Azure.IoT Build 0:6ae2f7bca550 817 return result;
Azure.IoT Build 0:6ae2f7bca550 818 }
Azure.IoT Build 0:6ae2f7bca550 819
Azure.IoT Build 0:6ae2f7bca550 820 int amqpvalue_get_char(AMQP_VALUE value, uint32_t* char_value)
Azure.IoT Build 0:6ae2f7bca550 821 {
Azure.IoT Build 0:6ae2f7bca550 822 int result;
Azure.IoT Build 0:6ae2f7bca550 823
Azure.IoT Build 0:6ae2f7bca550 824 /* Codes_SRS_AMQPVALUE_01_096: [If any of the arguments is NULL then amqpvalue_get_char shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 825 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 826 (char_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 827 {
AzureIoTClient 23:1111ee8bcba4 828 LogError("Bad arguments: value = %p, double_value = %p",
AzureIoTClient 23:1111ee8bcba4 829 value, char_value);
AzureIoTClient 23:1111ee8bcba4 830 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 831 }
Azure.IoT Build 0:6ae2f7bca550 832 else
Azure.IoT Build 0:6ae2f7bca550 833 {
Azure.IoT Build 0:6ae2f7bca550 834 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 835 /* Codes_SRS_AMQPVALUE_01_097: [If the type of the value is not char (was not created with amqpvalue_create_char), then amqpvalue_get_char shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 836 if (value_data->type != AMQP_TYPE_CHAR)
Azure.IoT Build 0:6ae2f7bca550 837 {
AzureIoTClient 23:1111ee8bcba4 838 LogError("Value is not of type CHAR");
AzureIoTClient 23:1111ee8bcba4 839 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 840 }
Azure.IoT Build 0:6ae2f7bca550 841 else
Azure.IoT Build 0:6ae2f7bca550 842 {
Azure.IoT Build 0:6ae2f7bca550 843 /* Codes_SRS_AMQPVALUE_01_094: [amqpvalue_get_char shall fill in the char_value argument the UTF32 char value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 844 *char_value = value_data->value.char_value;
Azure.IoT Build 0:6ae2f7bca550 845
Azure.IoT Build 0:6ae2f7bca550 846 /* Codes_SRS_AMQPVALUE_01_095: [On success amqpvalue_get_char shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 847 result = 0;
Azure.IoT Build 0:6ae2f7bca550 848 }
Azure.IoT Build 0:6ae2f7bca550 849 }
Azure.IoT Build 0:6ae2f7bca550 850
Azure.IoT Build 0:6ae2f7bca550 851 return result;
Azure.IoT Build 0:6ae2f7bca550 852 }
Azure.IoT Build 0:6ae2f7bca550 853
Azure.IoT Build 0:6ae2f7bca550 854 /* Codes_SRS_AMQPVALUE_01_025: [1.6.17 timestamp An absolute point in time.] */
Azure.IoT Build 0:6ae2f7bca550 855 AMQP_VALUE amqpvalue_create_timestamp(int64_t value)
Azure.IoT Build 0:6ae2f7bca550 856 {
AzureIoTClient 21:f9c433d8e6ca 857 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 858 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 859 {
AzureIoTClient 23:1111ee8bcba4 860 /* Codes_SRS_AMQPVALUE_01_108: [If allocating the AMQP_VALUE fails then amqpvalue_create_timestamp shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 861 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 862 }
AzureIoTClient 23:1111ee8bcba4 863 else
AzureIoTClient 23:1111ee8bcba4 864 {
Azure.IoT Build 0:6ae2f7bca550 865 /* Codes_SRS_AMQPVALUE_01_107: [amqpvalue_create_timestamp shall return a handle to an AMQP_VALUE that stores an uint64_t value that represents a millisecond precision Unix time.] */
Azure.IoT Build 0:6ae2f7bca550 866 result->type = AMQP_TYPE_TIMESTAMP;
Azure.IoT Build 0:6ae2f7bca550 867 result->value.timestamp_value = value;
Azure.IoT Build 0:6ae2f7bca550 868 }
AzureIoTClient 23:1111ee8bcba4 869
Azure.IoT Build 0:6ae2f7bca550 870 return result;
Azure.IoT Build 0:6ae2f7bca550 871 }
Azure.IoT Build 0:6ae2f7bca550 872
Azure.IoT Build 0:6ae2f7bca550 873 int amqpvalue_get_timestamp(AMQP_VALUE value, int64_t* timestamp_value)
Azure.IoT Build 0:6ae2f7bca550 874 {
Azure.IoT Build 0:6ae2f7bca550 875 int result;
Azure.IoT Build 0:6ae2f7bca550 876
Azure.IoT Build 0:6ae2f7bca550 877 /* Codes_SRS_AMQPVALUE_01_111: [If any of the arguments is NULL then amqpvalue_get_timestamp shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 878 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 879 (timestamp_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 880 {
AzureIoTClient 23:1111ee8bcba4 881 LogError("Bad arguments: value = %p, timestamp_value = %p",
AzureIoTClient 23:1111ee8bcba4 882 value, timestamp_value);
AzureIoTClient 23:1111ee8bcba4 883 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 884 }
Azure.IoT Build 0:6ae2f7bca550 885 else
Azure.IoT Build 0:6ae2f7bca550 886 {
Azure.IoT Build 0:6ae2f7bca550 887 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 888 /* Codes_SRS_AMQPVALUE_01_112: [If the type of the value is not timestamp (was not created with amqpvalue_create_timestamp), then amqpvalue_get_timestamp shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 889 if (value_data->type != AMQP_TYPE_TIMESTAMP)
Azure.IoT Build 0:6ae2f7bca550 890 {
AzureIoTClient 23:1111ee8bcba4 891 LogError("Value is not of type TIMESTAMP");
AzureIoTClient 23:1111ee8bcba4 892 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 893 }
Azure.IoT Build 0:6ae2f7bca550 894 else
Azure.IoT Build 0:6ae2f7bca550 895 {
Azure.IoT Build 0:6ae2f7bca550 896 /* Codes_SRS_AMQPVALUE_01_109: [amqpvalue_get_timestamp shall fill in the timestamp_value argument the timestamp value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 897 *timestamp_value = value_data->value.timestamp_value;
Azure.IoT Build 0:6ae2f7bca550 898
Azure.IoT Build 0:6ae2f7bca550 899 /* Codes_SRS_AMQPVALUE_01_110: [On success amqpvalue_get_timestamp shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 900 result = 0;
Azure.IoT Build 0:6ae2f7bca550 901 }
Azure.IoT Build 0:6ae2f7bca550 902 }
Azure.IoT Build 0:6ae2f7bca550 903
Azure.IoT Build 0:6ae2f7bca550 904 return result;
Azure.IoT Build 0:6ae2f7bca550 905 }
Azure.IoT Build 0:6ae2f7bca550 906
Azure.IoT Build 0:6ae2f7bca550 907 /* Codes_SRS_AMQPVALUE_01_026: [1.6.18 uuid A universally unique identifier as defined by RFC-4122 section 4.1.2 .] */
Azure.IoT Build 0:6ae2f7bca550 908 AMQP_VALUE amqpvalue_create_uuid(uuid value)
Azure.IoT Build 0:6ae2f7bca550 909 {
AzureIoTClient 21:f9c433d8e6ca 910 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 911 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 912 {
AzureIoTClient 23:1111ee8bcba4 913 /* Codes_SRS_AMQPVALUE_01_114: [If allocating the AMQP_VALUE fails then amqpvalue_create_uuid shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 914 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 915 }
AzureIoTClient 23:1111ee8bcba4 916 else
AzureIoTClient 23:1111ee8bcba4 917 {
Azure.IoT Build 0:6ae2f7bca550 918 /* Codes_SRS_AMQPVALUE_01_113: [amqpvalue_create_uuid shall return a handle to an AMQP_VALUE that stores an uuid value that represents a unique identifier per RFC-4122 section 4.1.2.] */
Azure.IoT Build 0:6ae2f7bca550 919 result->type = AMQP_TYPE_UUID;
Azure.IoT Build 0:6ae2f7bca550 920 (void)memcpy(&result->value.uuid_value, value, 16);
Azure.IoT Build 0:6ae2f7bca550 921 }
AzureIoTClient 23:1111ee8bcba4 922
Azure.IoT Build 0:6ae2f7bca550 923 return result;
Azure.IoT Build 0:6ae2f7bca550 924 }
Azure.IoT Build 0:6ae2f7bca550 925
Azure.IoT Build 0:6ae2f7bca550 926 int amqpvalue_get_uuid(AMQP_VALUE value, uuid* uuid_value)
Azure.IoT Build 0:6ae2f7bca550 927 {
Azure.IoT Build 0:6ae2f7bca550 928 int result;
Azure.IoT Build 0:6ae2f7bca550 929
Azure.IoT Build 0:6ae2f7bca550 930 /* Codes_SRS_AMQPVALUE_01_117: [If any of the arguments is NULL then amqpvalue_get_uuid shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 931 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 932 (uuid_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 933 {
AzureIoTClient 23:1111ee8bcba4 934 LogError("Bad arguments: value = %p, uuid_value = %p",
AzureIoTClient 23:1111ee8bcba4 935 value, uuid_value);
AzureIoTClient 23:1111ee8bcba4 936 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 937 }
Azure.IoT Build 0:6ae2f7bca550 938 else
Azure.IoT Build 0:6ae2f7bca550 939 {
Azure.IoT Build 0:6ae2f7bca550 940 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 941 /* Codes_SRS_AMQPVALUE_01_118: [If the type of the value is not uuid (was not created with amqpvalue_create_uuid), then amqpvalue_get_uuid shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 942 if (value_data->type != AMQP_TYPE_UUID)
Azure.IoT Build 0:6ae2f7bca550 943 {
AzureIoTClient 23:1111ee8bcba4 944 LogError("Value is not of type UUID");
AzureIoTClient 23:1111ee8bcba4 945 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 946 }
Azure.IoT Build 0:6ae2f7bca550 947 else
Azure.IoT Build 0:6ae2f7bca550 948 {
Azure.IoT Build 0:6ae2f7bca550 949 /* Codes_SRS_AMQPVALUE_01_115: [amqpvalue_get_uuid shall fill in the uuid_value argument the uuid value stored by the AMQP value indicated by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 950 (void)memcpy(*uuid_value, value_data->value.uuid_value, 16);
Azure.IoT Build 0:6ae2f7bca550 951
Azure.IoT Build 0:6ae2f7bca550 952 /* Codes_SRS_AMQPVALUE_01_116: [On success amqpvalue_get_uuid shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 953 result = 0;
Azure.IoT Build 0:6ae2f7bca550 954 }
Azure.IoT Build 0:6ae2f7bca550 955 }
Azure.IoT Build 0:6ae2f7bca550 956
Azure.IoT Build 0:6ae2f7bca550 957 return result;
Azure.IoT Build 0:6ae2f7bca550 958 }
Azure.IoT Build 0:6ae2f7bca550 959
Azure.IoT Build 0:6ae2f7bca550 960 /* Codes_SRS_AMQPVALUE_01_027: [1.6.19 binary A sequence of octets.] */
Azure.IoT Build 0:6ae2f7bca550 961 AMQP_VALUE amqpvalue_create_binary(amqp_binary value)
Azure.IoT Build 0:6ae2f7bca550 962 {
Azure.IoT Build 0:6ae2f7bca550 963 AMQP_VALUE_DATA* result;
Azure.IoT Build 0:6ae2f7bca550 964 if ((value.bytes == NULL) &&
Azure.IoT Build 0:6ae2f7bca550 965 (value.length > 0))
Azure.IoT Build 0:6ae2f7bca550 966 {
Azure.IoT Build 0:6ae2f7bca550 967 /* Codes_SRS_AMQPVALUE_01_129: [If value.data is NULL and value.length is positive then amqpvalue_create_binary shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 968 LogError("NULL bytes with non-zero length");
Azure.IoT Build 0:6ae2f7bca550 969 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 970 }
Azure.IoT Build 0:6ae2f7bca550 971 else
Azure.IoT Build 0:6ae2f7bca550 972 {
AzureIoTClient 21:f9c433d8e6ca 973 result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 974 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 975 {
AzureIoTClient 23:1111ee8bcba4 976 /* Codes_SRS_AMQPVALUE_01_128: [If allocating the AMQP_VALUE fails then amqpvalue_create_binary shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 977 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 978 }
AzureIoTClient 23:1111ee8bcba4 979 else
AzureIoTClient 23:1111ee8bcba4 980 {
Azure.IoT Build 0:6ae2f7bca550 981 /* Codes_SRS_AMQPVALUE_01_127: [amqpvalue_create_binary shall return a handle to an AMQP_VALUE that stores a sequence of bytes.] */
Azure.IoT Build 0:6ae2f7bca550 982 result->type = AMQP_TYPE_BINARY;
Azure.IoT Build 0:6ae2f7bca550 983 if (value.length > 0)
Azure.IoT Build 0:6ae2f7bca550 984 {
AzureIoTClient 21:f9c433d8e6ca 985 result->value.binary_value.bytes = malloc(value.length);
Azure.IoT Build 0:6ae2f7bca550 986 }
Azure.IoT Build 0:6ae2f7bca550 987 else
Azure.IoT Build 0:6ae2f7bca550 988 {
Azure.IoT Build 0:6ae2f7bca550 989 result->value.binary_value.bytes = NULL;
Azure.IoT Build 0:6ae2f7bca550 990 }
Azure.IoT Build 0:6ae2f7bca550 991
Azure.IoT Build 0:6ae2f7bca550 992 result->value.binary_value.length = value.length;
Azure.IoT Build 0:6ae2f7bca550 993
Azure.IoT Build 0:6ae2f7bca550 994 if ((result->value.binary_value.bytes == NULL) && (value.length > 0))
Azure.IoT Build 0:6ae2f7bca550 995 {
Azure.IoT Build 0:6ae2f7bca550 996 /* Codes_SRS_AMQPVALUE_01_128: [If allocating the AMQP_VALUE fails then amqpvalue_create_binary shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 997 LogError("Could not allocate memory for binary payload of AMQP value");
AzureIoTClient 23:1111ee8bcba4 998 free(result);
Azure.IoT Build 0:6ae2f7bca550 999 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1000 }
Azure.IoT Build 0:6ae2f7bca550 1001 else
Azure.IoT Build 0:6ae2f7bca550 1002 {
Azure.IoT Build 0:6ae2f7bca550 1003 if (value.length > 0)
Azure.IoT Build 0:6ae2f7bca550 1004 {
Azure.IoT Build 0:6ae2f7bca550 1005 (void)memcpy((void*)result->value.binary_value.bytes, value.bytes, value.length);
Azure.IoT Build 0:6ae2f7bca550 1006 }
Azure.IoT Build 0:6ae2f7bca550 1007 }
Azure.IoT Build 0:6ae2f7bca550 1008 }
Azure.IoT Build 0:6ae2f7bca550 1009 }
AzureIoTClient 23:1111ee8bcba4 1010
Azure.IoT Build 0:6ae2f7bca550 1011 return result;
Azure.IoT Build 0:6ae2f7bca550 1012 }
Azure.IoT Build 0:6ae2f7bca550 1013
Azure.IoT Build 0:6ae2f7bca550 1014 int amqpvalue_get_binary(AMQP_VALUE value, amqp_binary* binary_value)
Azure.IoT Build 0:6ae2f7bca550 1015 {
Azure.IoT Build 0:6ae2f7bca550 1016 int result;
Azure.IoT Build 0:6ae2f7bca550 1017
Azure.IoT Build 0:6ae2f7bca550 1018 /* Codes_SRS_AMQPVALUE_01_132: [If any of the arguments is NULL then amqpvalue_get_binary shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 1019 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1020 (binary_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1021 {
AzureIoTClient 23:1111ee8bcba4 1022 LogError("Bad arguments: value = %p, binary_value = %p",
AzureIoTClient 23:1111ee8bcba4 1023 value, binary_value);
AzureIoTClient 23:1111ee8bcba4 1024 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1025 }
Azure.IoT Build 0:6ae2f7bca550 1026 else
Azure.IoT Build 0:6ae2f7bca550 1027 {
Azure.IoT Build 0:6ae2f7bca550 1028 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1029 /* Codes_SRS_AMQPVALUE_01_133: [If the type of the value is not binary (was not created with amqpvalue_create_binary), then amqpvalue_get_binary shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 1030 if (value_data->type != AMQP_TYPE_BINARY)
Azure.IoT Build 0:6ae2f7bca550 1031 {
AzureIoTClient 23:1111ee8bcba4 1032 LogError("Value is not of type BINARY");
AzureIoTClient 23:1111ee8bcba4 1033 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1034 }
Azure.IoT Build 0:6ae2f7bca550 1035 else
Azure.IoT Build 0:6ae2f7bca550 1036 {
Azure.IoT Build 0:6ae2f7bca550 1037 /* Codes_SRS_AMQPVALUE_01_131: [amqpvalue_get_binary shall yield a pointer to the sequence of bytes held by the AMQP_VALUE in binary_value.data and fill in the binary_value.length argument the number of bytes held in the binary value.] */
Azure.IoT Build 0:6ae2f7bca550 1038 binary_value->length = value_data->value.binary_value.length;
Azure.IoT Build 0:6ae2f7bca550 1039 binary_value->bytes = value_data->value.binary_value.bytes;
Azure.IoT Build 0:6ae2f7bca550 1040
Azure.IoT Build 0:6ae2f7bca550 1041 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1042 }
Azure.IoT Build 0:6ae2f7bca550 1043 }
Azure.IoT Build 0:6ae2f7bca550 1044
Azure.IoT Build 0:6ae2f7bca550 1045 return result;
Azure.IoT Build 0:6ae2f7bca550 1046 }
Azure.IoT Build 0:6ae2f7bca550 1047
Azure.IoT Build 0:6ae2f7bca550 1048 /* Codes_SRS_AMQPVALUE_01_135: [amqpvalue_create_string shall return a handle to an AMQP_VALUE that stores a sequence of Unicode characters.] */
Azure.IoT Build 0:6ae2f7bca550 1049 /* Codes_SRS_AMQPVALUE_01_028: [1.6.20 string A sequence of Unicode characters.] */
Azure.IoT Build 0:6ae2f7bca550 1050 AMQP_VALUE amqpvalue_create_string(const char* value)
Azure.IoT Build 0:6ae2f7bca550 1051 {
Azure.IoT Build 0:6ae2f7bca550 1052 AMQP_VALUE_DATA* result;
Azure.IoT Build 0:6ae2f7bca550 1053 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1054 {
AzureIoTClient 23:1111ee8bcba4 1055 LogError("NULL argument value");
AzureIoTClient 23:1111ee8bcba4 1056 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1057 }
Azure.IoT Build 0:6ae2f7bca550 1058 else
Azure.IoT Build 0:6ae2f7bca550 1059 {
Azure.IoT Build 0:6ae2f7bca550 1060 size_t length = strlen(value);
Azure.IoT Build 0:6ae2f7bca550 1061
AzureIoTClient 21:f9c433d8e6ca 1062 result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 1063 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 1064 {
AzureIoTClient 23:1111ee8bcba4 1065 /* Codes_SRS_AMQPVALUE_01_136: [If allocating the AMQP_VALUE fails then amqpvalue_create_string shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1066 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 1067 }
AzureIoTClient 23:1111ee8bcba4 1068 else
AzureIoTClient 23:1111ee8bcba4 1069 {
Azure.IoT Build 0:6ae2f7bca550 1070 result->type = AMQP_TYPE_STRING;
AzureIoTClient 23:1111ee8bcba4 1071 result->value.string_value.chars = (char*)malloc(length + 1);
Azure.IoT Build 0:6ae2f7bca550 1072 if (result->value.string_value.chars == NULL)
Azure.IoT Build 0:6ae2f7bca550 1073 {
Azure.IoT Build 0:6ae2f7bca550 1074 /* Codes_SRS_AMQPVALUE_01_136: [If allocating the AMQP_VALUE fails then amqpvalue_create_string shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1075 LogError("Could not allocate memory for string AMQP value");
AzureIoTClient 23:1111ee8bcba4 1076 free(result);
Azure.IoT Build 0:6ae2f7bca550 1077 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1078 }
Azure.IoT Build 0:6ae2f7bca550 1079 else
Azure.IoT Build 0:6ae2f7bca550 1080 {
AzureIoTClient 23:1111ee8bcba4 1081 (void)memcpy(result->value.string_value.chars, value, length + 1);
Azure.IoT Build 0:6ae2f7bca550 1082 }
Azure.IoT Build 0:6ae2f7bca550 1083 }
Azure.IoT Build 0:6ae2f7bca550 1084 }
Azure.IoT Build 0:6ae2f7bca550 1085
Azure.IoT Build 0:6ae2f7bca550 1086 return result;
Azure.IoT Build 0:6ae2f7bca550 1087 }
Azure.IoT Build 0:6ae2f7bca550 1088
Azure.IoT Build 0:6ae2f7bca550 1089 int amqpvalue_get_string(AMQP_VALUE value, const char** string_value)
Azure.IoT Build 0:6ae2f7bca550 1090 {
Azure.IoT Build 0:6ae2f7bca550 1091 int result;
Azure.IoT Build 0:6ae2f7bca550 1092
Azure.IoT Build 0:6ae2f7bca550 1093 /* Codes_SRS_AMQPVALUE_01_139: [If any of the arguments is NULL then amqpvalue_get_string shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1094 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1095 (string_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1096 {
AzureIoTClient 23:1111ee8bcba4 1097 LogError("Bad arguments: value = %p, string_value = %p",
AzureIoTClient 23:1111ee8bcba4 1098 value, string_value);
AzureIoTClient 23:1111ee8bcba4 1099 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1100 }
Azure.IoT Build 0:6ae2f7bca550 1101 else
Azure.IoT Build 0:6ae2f7bca550 1102 {
Azure.IoT Build 0:6ae2f7bca550 1103 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1104
Azure.IoT Build 0:6ae2f7bca550 1105 /* Codes_SRS_AMQPVALUE_01_140: [If the type of the value is not string (was not created with amqpvalue_create_string), then amqpvalue_get_string shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1106 if (value_data->type != AMQP_TYPE_STRING)
Azure.IoT Build 0:6ae2f7bca550 1107 {
AzureIoTClient 23:1111ee8bcba4 1108 LogError("Value is not of type STRING");
AzureIoTClient 23:1111ee8bcba4 1109 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1110 }
Azure.IoT Build 0:6ae2f7bca550 1111 else
Azure.IoT Build 0:6ae2f7bca550 1112 {
Azure.IoT Build 0:6ae2f7bca550 1113 /* Codes_SRS_AMQPVALUE_01_138: [amqpvalue_get_string shall yield a pointer to the sequence of bytes held by the AMQP_VALUE in string_value.] */
Azure.IoT Build 0:6ae2f7bca550 1114 *string_value = value_data->value.string_value.chars;
Azure.IoT Build 0:6ae2f7bca550 1115
Azure.IoT Build 0:6ae2f7bca550 1116 /* Codes_SRS_AMQPVALUE_01_141: [On success, amqpvalue_get_string shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1117 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1118 }
Azure.IoT Build 0:6ae2f7bca550 1119 }
Azure.IoT Build 0:6ae2f7bca550 1120
Azure.IoT Build 0:6ae2f7bca550 1121 return result;
Azure.IoT Build 0:6ae2f7bca550 1122 }
Azure.IoT Build 0:6ae2f7bca550 1123
Azure.IoT Build 0:6ae2f7bca550 1124 /* Codes_SRS_AMQPVALUE_01_029: [1.6.21 symbol Symbolic values from a constrained domain.] */
Azure.IoT Build 0:6ae2f7bca550 1125 AMQP_VALUE amqpvalue_create_symbol(const char* value)
Azure.IoT Build 0:6ae2f7bca550 1126 {
Azure.IoT Build 0:6ae2f7bca550 1127 AMQP_VALUE_DATA* result;
Azure.IoT Build 0:6ae2f7bca550 1128 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1129 {
Azure.IoT Build 0:6ae2f7bca550 1130 /* Codes_SRS_AMQPVALUE_01_400: [If value is NULL, amqpvalue_create_symbol shall fail and return NULL.] */
AzureIoTClient 6:641a9672db08 1131 LogError("NULL argument");
Azure.IoT Build 0:6ae2f7bca550 1132 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1133 }
Azure.IoT Build 0:6ae2f7bca550 1134 else
Azure.IoT Build 0:6ae2f7bca550 1135 {
AzureIoTClient 6:641a9672db08 1136 size_t length = strlen(value);
AzureIoTClient 6:641a9672db08 1137 if (length > UINT32_MAX)
AzureIoTClient 6:641a9672db08 1138 {
AzureIoTClient 6:641a9672db08 1139 /* Codes_SRS_AMQPVALUE_01_401: [ If the string pointed to by value is longer than 2^32-1 then amqpvalue_create_symbol shall return NULL. ]*/
AzureIoTClient 6:641a9672db08 1140 LogError("string too long to be represented as a symbol");
AzureIoTClient 6:641a9672db08 1141 result = NULL;
AzureIoTClient 6:641a9672db08 1142 }
AzureIoTClient 6:641a9672db08 1143 else
AzureIoTClient 6:641a9672db08 1144 {
AzureIoTClient 6:641a9672db08 1145 /* Codes_SRS_AMQPVALUE_01_143: [If allocating the AMQP_VALUE fails then amqpvalue_create_symbol shall return NULL.] */
AzureIoTClient 21:f9c433d8e6ca 1146 result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 6:641a9672db08 1147 if (result == NULL)
AzureIoTClient 6:641a9672db08 1148 {
AzureIoTClient 6:641a9672db08 1149 LogError("Cannot allocate memory for AMQP value");
AzureIoTClient 6:641a9672db08 1150 result = NULL;
AzureIoTClient 6:641a9672db08 1151 }
AzureIoTClient 6:641a9672db08 1152 else
AzureIoTClient 6:641a9672db08 1153 {
AzureIoTClient 6:641a9672db08 1154 /* Codes_SRS_AMQPVALUE_01_142: [amqpvalue_create_symbol shall return a handle to an AMQP_VALUE that stores a symbol (ASCII string) value.] */
AzureIoTClient 6:641a9672db08 1155 result->type = AMQP_TYPE_SYMBOL;
AzureIoTClient 21:f9c433d8e6ca 1156 result->value.symbol_value.chars = (char*)malloc(length + 1);
AzureIoTClient 6:641a9672db08 1157 if (result->value.symbol_value.chars == NULL)
AzureIoTClient 6:641a9672db08 1158 {
AzureIoTClient 6:641a9672db08 1159 LogError("Cannot allocate memory for symbol string");
AzureIoTClient 21:f9c433d8e6ca 1160 free(result);
AzureIoTClient 6:641a9672db08 1161 result = NULL;
AzureIoTClient 6:641a9672db08 1162 }
AzureIoTClient 6:641a9672db08 1163 else
AzureIoTClient 6:641a9672db08 1164 {
AzureIoTClient 6:641a9672db08 1165 (void)memcpy(result->value.symbol_value.chars, value, length + 1);
AzureIoTClient 6:641a9672db08 1166 }
AzureIoTClient 6:641a9672db08 1167 }
Azure.IoT Build 0:6ae2f7bca550 1168 }
Azure.IoT Build 0:6ae2f7bca550 1169 }
Azure.IoT Build 0:6ae2f7bca550 1170
Azure.IoT Build 0:6ae2f7bca550 1171 return result;
Azure.IoT Build 0:6ae2f7bca550 1172 }
Azure.IoT Build 0:6ae2f7bca550 1173
Azure.IoT Build 0:6ae2f7bca550 1174 int amqpvalue_get_symbol(AMQP_VALUE value, const char** symbol_value)
Azure.IoT Build 0:6ae2f7bca550 1175 {
Azure.IoT Build 0:6ae2f7bca550 1176 int result;
Azure.IoT Build 0:6ae2f7bca550 1177
Azure.IoT Build 0:6ae2f7bca550 1178 /* Codes_SRS_AMQPVALUE_01_147: [If any of the arguments is NULL then amqpvalue_get_symbol shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1179 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1180 (symbol_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1181 {
AzureIoTClient 23:1111ee8bcba4 1182 LogError("Bad arguments: value = %p, symbol_value = %p",
AzureIoTClient 23:1111ee8bcba4 1183 value, symbol_value);
AzureIoTClient 23:1111ee8bcba4 1184 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1185 }
Azure.IoT Build 0:6ae2f7bca550 1186 else
Azure.IoT Build 0:6ae2f7bca550 1187 {
Azure.IoT Build 0:6ae2f7bca550 1188 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1189
Azure.IoT Build 0:6ae2f7bca550 1190 /* Codes_SRS_AMQPVALUE_01_148: [If the type of the value is not symbol (was not created with amqpvalue_create_symbol), then amqpvalue_get_symbol shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1191 if (value_data->type != AMQP_TYPE_SYMBOL)
Azure.IoT Build 0:6ae2f7bca550 1192 {
AzureIoTClient 23:1111ee8bcba4 1193 LogError("Value is not of type SYMBOL");
AzureIoTClient 23:1111ee8bcba4 1194 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1195 }
Azure.IoT Build 0:6ae2f7bca550 1196 else
Azure.IoT Build 0:6ae2f7bca550 1197 {
Azure.IoT Build 0:6ae2f7bca550 1198 /* Codes_SRS_AMQPVALUE_01_145: [amqpvalue_get_symbol shall fill in the symbol_value the symbol value string held by the AMQP_VALUE.] */
Azure.IoT Build 0:6ae2f7bca550 1199 *symbol_value = value_data->value.symbol_value.chars;
Azure.IoT Build 0:6ae2f7bca550 1200
Azure.IoT Build 0:6ae2f7bca550 1201 /* Codes_SRS_AMQPVALUE_01_146: [On success, amqpvalue_get_symbol shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1202 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1203 }
Azure.IoT Build 0:6ae2f7bca550 1204 }
Azure.IoT Build 0:6ae2f7bca550 1205
Azure.IoT Build 0:6ae2f7bca550 1206 return result;
Azure.IoT Build 0:6ae2f7bca550 1207 }
Azure.IoT Build 0:6ae2f7bca550 1208
Azure.IoT Build 0:6ae2f7bca550 1209 /* Codes_SRS_AMQPVALUE_01_030: [1.6.22 list A sequence of polymorphic values.] */
Azure.IoT Build 0:6ae2f7bca550 1210 AMQP_VALUE amqpvalue_create_list(void)
Azure.IoT Build 0:6ae2f7bca550 1211 {
AzureIoTClient 21:f9c433d8e6ca 1212 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 1213 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 1214 {
AzureIoTClient 23:1111ee8bcba4 1215 /* Codes_SRS_AMQPVALUE_01_150: [If allocating the AMQP_VALUE fails then amqpvalue_create_list shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1216 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 1217 }
AzureIoTClient 23:1111ee8bcba4 1218 else
AzureIoTClient 23:1111ee8bcba4 1219 {
Azure.IoT Build 0:6ae2f7bca550 1220 /* Codes_SRS_AMQPVALUE_01_149: [amqpvalue_create_list shall return a handle to an AMQP_VALUE that stores a list.] */
Azure.IoT Build 0:6ae2f7bca550 1221 result->type = AMQP_TYPE_LIST;
Azure.IoT Build 0:6ae2f7bca550 1222
Azure.IoT Build 0:6ae2f7bca550 1223 /* Codes_SRS_AMQPVALUE_01_151: [The list shall have an initial size of zero.] */
Azure.IoT Build 0:6ae2f7bca550 1224 result->value.list_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 1225 result->value.list_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 1226 }
Azure.IoT Build 0:6ae2f7bca550 1227
Azure.IoT Build 0:6ae2f7bca550 1228 return result;
Azure.IoT Build 0:6ae2f7bca550 1229 }
Azure.IoT Build 0:6ae2f7bca550 1230
Azure.IoT Build 0:6ae2f7bca550 1231 int amqpvalue_set_list_item_count(AMQP_VALUE value, uint32_t list_size)
Azure.IoT Build 0:6ae2f7bca550 1232 {
Azure.IoT Build 0:6ae2f7bca550 1233 int result;
Azure.IoT Build 0:6ae2f7bca550 1234
Azure.IoT Build 0:6ae2f7bca550 1235 /* Codes_SRS_AMQPVALUE_01_155: [If the value argument is NULL, amqpvalue_set_list_item_count shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1236 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1237 {
AzureIoTClient 23:1111ee8bcba4 1238 LogError("NULL list value");
AzureIoTClient 23:1111ee8bcba4 1239 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1240 }
Azure.IoT Build 0:6ae2f7bca550 1241 else
Azure.IoT Build 0:6ae2f7bca550 1242 {
Azure.IoT Build 0:6ae2f7bca550 1243 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1244 if (value_data->type != AMQP_TYPE_LIST)
Azure.IoT Build 0:6ae2f7bca550 1245 {
Azure.IoT Build 0:6ae2f7bca550 1246 /* Codes_SRS_AMQPVALUE_01_156: [If the value is not of type list, then amqpvalue_set_list_item_count shall return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1247 LogError("Value is not of type LIST");
AzureIoTClient 23:1111ee8bcba4 1248 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1249 }
Azure.IoT Build 0:6ae2f7bca550 1250 else
Azure.IoT Build 0:6ae2f7bca550 1251 {
Azure.IoT Build 0:6ae2f7bca550 1252 if (value_data->value.list_value.count < list_size)
Azure.IoT Build 0:6ae2f7bca550 1253 {
Azure.IoT Build 0:6ae2f7bca550 1254 AMQP_VALUE* new_list;
Azure.IoT Build 0:6ae2f7bca550 1255
Azure.IoT Build 0:6ae2f7bca550 1256 /* Codes_SRS_AMQPVALUE_01_152: [amqpvalue_set_list_item_count shall resize an AMQP list.] */
AzureIoTClient 21:f9c433d8e6ca 1257 new_list = (AMQP_VALUE*)realloc(value_data->value.list_value.items, list_size * sizeof(AMQP_VALUE));
Azure.IoT Build 0:6ae2f7bca550 1258 if (new_list == NULL)
Azure.IoT Build 0:6ae2f7bca550 1259 {
Azure.IoT Build 0:6ae2f7bca550 1260 /* Codes_SRS_AMQPVALUE_01_154: [If allocating memory for the list according to the new size fails, then amqpvalue_set_list_item_count shall return a non-zero value, while preserving the existing list contents.] */
AzureIoTClient 23:1111ee8bcba4 1261 LogError("Could not reallocate list memory");
AzureIoTClient 23:1111ee8bcba4 1262 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1263 }
Azure.IoT Build 0:6ae2f7bca550 1264 else
Azure.IoT Build 0:6ae2f7bca550 1265 {
Azure.IoT Build 0:6ae2f7bca550 1266 value_data->value.list_value.items = new_list;
Azure.IoT Build 0:6ae2f7bca550 1267
Azure.IoT Build 0:6ae2f7bca550 1268 /* Codes_SRS_AMQPVALUE_01_162: [When a list is grown a null AMQP_VALUE shall be inserted as new list items to fill the list up to the new size.] */
Azure.IoT Build 0:6ae2f7bca550 1269 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 1270
Azure.IoT Build 0:6ae2f7bca550 1271 /* Codes_SRS_AMQPVALUE_01_162: [When a list is grown a null AMQP_VALUE shall be inserted as new list items to fill the list up to the new size.] */
Azure.IoT Build 0:6ae2f7bca550 1272 for (i = value_data->value.list_value.count; i < list_size; i++)
Azure.IoT Build 0:6ae2f7bca550 1273 {
Azure.IoT Build 0:6ae2f7bca550 1274 new_list[i] = amqpvalue_create_null();
Azure.IoT Build 0:6ae2f7bca550 1275 if (new_list[i] == NULL)
Azure.IoT Build 0:6ae2f7bca550 1276 {
AzureIoTClient 23:1111ee8bcba4 1277 LogError("Could not create NULL AMQP value to be inserted in list");
AzureIoTClient 23:1111ee8bcba4 1278 break;
Azure.IoT Build 0:6ae2f7bca550 1279 }
Azure.IoT Build 0:6ae2f7bca550 1280 }
Azure.IoT Build 0:6ae2f7bca550 1281
Azure.IoT Build 0:6ae2f7bca550 1282 if (i < list_size)
Azure.IoT Build 0:6ae2f7bca550 1283 {
Azure.IoT Build 0:6ae2f7bca550 1284 /* Codes_SRS_AMQPVALUE_01_154: [If allocating memory for the list according to the new size fails, then amqpvalue_set_list_item_count shall return a non-zero value, while preserving the existing list contents.] */
Azure.IoT Build 0:6ae2f7bca550 1285 uint32_t j;
Azure.IoT Build 0:6ae2f7bca550 1286 for (j = value_data->value.list_value.count; j < i; j++)
Azure.IoT Build 0:6ae2f7bca550 1287 {
Azure.IoT Build 0:6ae2f7bca550 1288 amqpvalue_destroy(new_list[j]);
Azure.IoT Build 0:6ae2f7bca550 1289 }
Azure.IoT Build 0:6ae2f7bca550 1290
AzureIoTClient 19:000ab4e6a2c1 1291 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1292 }
Azure.IoT Build 0:6ae2f7bca550 1293 else
Azure.IoT Build 0:6ae2f7bca550 1294 {
Azure.IoT Build 0:6ae2f7bca550 1295 value_data->value.list_value.count = list_size;
Azure.IoT Build 0:6ae2f7bca550 1296
Azure.IoT Build 0:6ae2f7bca550 1297 /* Codes_SRS_AMQPVALUE_01_153: [On success amqpvalue_set_list_item_count shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1298 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1299 }
Azure.IoT Build 0:6ae2f7bca550 1300 }
Azure.IoT Build 0:6ae2f7bca550 1301 }
Azure.IoT Build 0:6ae2f7bca550 1302 else if (value_data->value.list_value.count > list_size)
Azure.IoT Build 0:6ae2f7bca550 1303 {
Azure.IoT Build 0:6ae2f7bca550 1304 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 1305
Azure.IoT Build 0:6ae2f7bca550 1306 /* Codes_SRS_AMQPVALUE_01_161: [When the list is shrunk, the extra items shall be freed by using amqp_value_destroy.] */
Azure.IoT Build 0:6ae2f7bca550 1307 for (i = list_size; i < value_data->value.list_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 1308 {
Azure.IoT Build 0:6ae2f7bca550 1309 amqpvalue_destroy(value_data->value.list_value.items[i]);
Azure.IoT Build 0:6ae2f7bca550 1310 }
Azure.IoT Build 0:6ae2f7bca550 1311
Azure.IoT Build 0:6ae2f7bca550 1312 value_data->value.list_value.count = list_size;
Azure.IoT Build 0:6ae2f7bca550 1313
Azure.IoT Build 0:6ae2f7bca550 1314 /* Codes_SRS_AMQPVALUE_01_153: [On success amqpvalue_set_list_item_count shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1315 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1316 }
Azure.IoT Build 0:6ae2f7bca550 1317 else
Azure.IoT Build 0:6ae2f7bca550 1318 {
Azure.IoT Build 0:6ae2f7bca550 1319 /* Codes_SRS_AMQPVALUE_01_153: [On success amqpvalue_set_list_item_count shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1320 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1321 }
Azure.IoT Build 0:6ae2f7bca550 1322 }
Azure.IoT Build 0:6ae2f7bca550 1323 }
Azure.IoT Build 0:6ae2f7bca550 1324
Azure.IoT Build 0:6ae2f7bca550 1325 return result;
Azure.IoT Build 0:6ae2f7bca550 1326 }
Azure.IoT Build 0:6ae2f7bca550 1327
Azure.IoT Build 0:6ae2f7bca550 1328 int amqpvalue_get_list_item_count(AMQP_VALUE value, uint32_t* size)
Azure.IoT Build 0:6ae2f7bca550 1329 {
Azure.IoT Build 0:6ae2f7bca550 1330 int result;
Azure.IoT Build 0:6ae2f7bca550 1331
Azure.IoT Build 0:6ae2f7bca550 1332 /* Codes_SRS_AMQPVALUE_01_159: [If any of the arguments are NULL, amqpvalue_get_list_item_count shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1333 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1334 (size == NULL))
Azure.IoT Build 0:6ae2f7bca550 1335 {
AzureIoTClient 23:1111ee8bcba4 1336 LogError("Bad arguments: value = %p, size = %p",
AzureIoTClient 23:1111ee8bcba4 1337 value, size);
AzureIoTClient 23:1111ee8bcba4 1338 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1339 }
Azure.IoT Build 0:6ae2f7bca550 1340 else
Azure.IoT Build 0:6ae2f7bca550 1341 {
Azure.IoT Build 0:6ae2f7bca550 1342 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1343
Azure.IoT Build 0:6ae2f7bca550 1344 /* Codes_SRS_AMQPVALUE_01_160: [If the AMQP_VALUE is not a list then amqpvalue_get_list_item_count shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1345 if (value_data->type != AMQP_TYPE_LIST)
Azure.IoT Build 0:6ae2f7bca550 1346 {
AzureIoTClient 23:1111ee8bcba4 1347 LogError("Value is not of type LIST");
AzureIoTClient 23:1111ee8bcba4 1348 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1349 }
Azure.IoT Build 0:6ae2f7bca550 1350 else
Azure.IoT Build 0:6ae2f7bca550 1351 {
Azure.IoT Build 0:6ae2f7bca550 1352 /* Codes_SRS_AMQPVALUE_01_157: [amqpvalue_get_list_item_count shall fill in the size argument the number of items held by the AMQP list.] */
Azure.IoT Build 0:6ae2f7bca550 1353 *size = value_data->value.list_value.count;
Azure.IoT Build 0:6ae2f7bca550 1354
Azure.IoT Build 0:6ae2f7bca550 1355 /* Codes_SRS_AMQPVALUE_01_158: [On success amqpvalue_get_list_item_count shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1356 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1357 }
Azure.IoT Build 0:6ae2f7bca550 1358 }
Azure.IoT Build 0:6ae2f7bca550 1359
Azure.IoT Build 0:6ae2f7bca550 1360 return result;
Azure.IoT Build 0:6ae2f7bca550 1361 }
Azure.IoT Build 0:6ae2f7bca550 1362
Azure.IoT Build 0:6ae2f7bca550 1363 int amqpvalue_set_list_item(AMQP_VALUE value, uint32_t index, AMQP_VALUE list_item_value)
Azure.IoT Build 0:6ae2f7bca550 1364 {
Azure.IoT Build 0:6ae2f7bca550 1365 int result;
Azure.IoT Build 0:6ae2f7bca550 1366
Azure.IoT Build 0:6ae2f7bca550 1367 /* Codes_SRS_AMQPVALUE_01_165: [If value or list_item_value is NULL, amqpvalue_set_list_item shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1368 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1369 {
AzureIoTClient 23:1111ee8bcba4 1370 LogError("NULL list value");
AzureIoTClient 23:1111ee8bcba4 1371 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1372 }
Azure.IoT Build 0:6ae2f7bca550 1373 else
Azure.IoT Build 0:6ae2f7bca550 1374 {
Azure.IoT Build 0:6ae2f7bca550 1375 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1376 if (value_data->type != AMQP_TYPE_LIST)
Azure.IoT Build 0:6ae2f7bca550 1377 {
AzureIoTClient 23:1111ee8bcba4 1378 LogError("Value is not of type LIST");
AzureIoTClient 23:1111ee8bcba4 1379 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1380 }
Azure.IoT Build 0:6ae2f7bca550 1381 else
Azure.IoT Build 0:6ae2f7bca550 1382 {
Azure.IoT Build 0:6ae2f7bca550 1383 /* Codes_SRS_AMQPVALUE_01_168: [The item stored at the index-th position in the list shall be a clone of list_item_value.] */
Azure.IoT Build 0:6ae2f7bca550 1384 AMQP_VALUE cloned_item = amqpvalue_clone(list_item_value);
Azure.IoT Build 0:6ae2f7bca550 1385 if (cloned_item == NULL)
Azure.IoT Build 0:6ae2f7bca550 1386 {
Azure.IoT Build 0:6ae2f7bca550 1387 /* Codes_SRS_AMQPVALUE_01_170: [When amqpvalue_set_list_item fails due to not being able to clone the item or grow the list, the list shall not be altered.] */
Azure.IoT Build 0:6ae2f7bca550 1388 /* Codes_SRS_AMQPVALUE_01_169: [If cloning the item fails, amqpvalue_set_list_item shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1389 LogError("Could not clone list item");
AzureIoTClient 23:1111ee8bcba4 1390 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1391 }
Azure.IoT Build 0:6ae2f7bca550 1392 else
Azure.IoT Build 0:6ae2f7bca550 1393 {
Azure.IoT Build 0:6ae2f7bca550 1394 if (index >= value_data->value.list_value.count)
Azure.IoT Build 0:6ae2f7bca550 1395 {
AzureIoTClient 21:f9c433d8e6ca 1396 AMQP_VALUE* new_list = (AMQP_VALUE*)realloc(value_data->value.list_value.items, (index + 1) * sizeof(AMQP_VALUE));
Azure.IoT Build 0:6ae2f7bca550 1397 if (new_list == NULL)
Azure.IoT Build 0:6ae2f7bca550 1398 {
Azure.IoT Build 0:6ae2f7bca550 1399 /* Codes_SRS_AMQPVALUE_01_170: [When amqpvalue_set_list_item fails due to not being able to clone the item or grow the list, the list shall not be altered.] */
AzureIoTClient 23:1111ee8bcba4 1400 LogError("Could not reallocate list storage");
AzureIoTClient 23:1111ee8bcba4 1401 amqpvalue_destroy(cloned_item);
AzureIoTClient 19:000ab4e6a2c1 1402 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1403 }
Azure.IoT Build 0:6ae2f7bca550 1404 else
Azure.IoT Build 0:6ae2f7bca550 1405 {
Azure.IoT Build 0:6ae2f7bca550 1406 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 1407
Azure.IoT Build 0:6ae2f7bca550 1408 value_data->value.list_value.items = new_list;
Azure.IoT Build 0:6ae2f7bca550 1409
Azure.IoT Build 0:6ae2f7bca550 1410 for (i = value_data->value.list_value.count; i < index; i++)
Azure.IoT Build 0:6ae2f7bca550 1411 {
Azure.IoT Build 0:6ae2f7bca550 1412 new_list[i] = amqpvalue_create_null();
Azure.IoT Build 0:6ae2f7bca550 1413 if (new_list[i] == NULL)
Azure.IoT Build 0:6ae2f7bca550 1414 {
AzureIoTClient 23:1111ee8bcba4 1415 LogError("Could not allocate NULL value for list entries");
AzureIoTClient 23:1111ee8bcba4 1416 break;
Azure.IoT Build 0:6ae2f7bca550 1417 }
Azure.IoT Build 0:6ae2f7bca550 1418 }
Azure.IoT Build 0:6ae2f7bca550 1419
Azure.IoT Build 0:6ae2f7bca550 1420 if (i < index)
Azure.IoT Build 0:6ae2f7bca550 1421 {
Azure.IoT Build 0:6ae2f7bca550 1422 /* Codes_SRS_AMQPVALUE_01_170: [When amqpvalue_set_list_item fails due to not being able to clone the item or grow the list, the list shall not be altered.] */
Azure.IoT Build 0:6ae2f7bca550 1423 uint32_t j;
Azure.IoT Build 0:6ae2f7bca550 1424
Azure.IoT Build 0:6ae2f7bca550 1425 for (j = value_data->value.list_value.count; j < i; j++)
Azure.IoT Build 0:6ae2f7bca550 1426 {
Azure.IoT Build 0:6ae2f7bca550 1427 amqpvalue_destroy(new_list[j]);
Azure.IoT Build 0:6ae2f7bca550 1428 }
Azure.IoT Build 0:6ae2f7bca550 1429
Azure.IoT Build 0:6ae2f7bca550 1430 amqpvalue_destroy(cloned_item);
Azure.IoT Build 0:6ae2f7bca550 1431
Azure.IoT Build 0:6ae2f7bca550 1432 /* Codes_SRS_AMQPVALUE_01_172: [If growing the list fails, then amqpvalue_set_list_item shall fail and return a non-zero value.] */
AzureIoTClient 19:000ab4e6a2c1 1433 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1434 }
Azure.IoT Build 0:6ae2f7bca550 1435 else
Azure.IoT Build 0:6ae2f7bca550 1436 {
Azure.IoT Build 0:6ae2f7bca550 1437 value_data->value.list_value.count = index + 1;
Azure.IoT Build 0:6ae2f7bca550 1438 value_data->value.list_value.items[index] = cloned_item;
Azure.IoT Build 0:6ae2f7bca550 1439
Azure.IoT Build 0:6ae2f7bca550 1440 /* Codes_SRS_AMQPVALUE_01_164: [On success amqpvalue_set_list_item shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1441 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1442 }
Azure.IoT Build 0:6ae2f7bca550 1443 }
Azure.IoT Build 0:6ae2f7bca550 1444 }
Azure.IoT Build 0:6ae2f7bca550 1445 else
Azure.IoT Build 0:6ae2f7bca550 1446 {
Azure.IoT Build 0:6ae2f7bca550 1447 /* Codes_SRS_AMQPVALUE_01_167: [Any previous value stored at the position index in the list shall be freed by using amqpvalue_destroy.] */
Azure.IoT Build 0:6ae2f7bca550 1448 amqpvalue_destroy(value_data->value.list_value.items[index]);
Azure.IoT Build 0:6ae2f7bca550 1449
Azure.IoT Build 0:6ae2f7bca550 1450 /* Codes_SRS_AMQPVALUE_01_163: [amqpvalue_set_list_item shall replace the item at the 0 based index-th position in the list identified by the value argument with the AMQP_VALUE specified by list_item_value.] */
Azure.IoT Build 0:6ae2f7bca550 1451 value_data->value.list_value.items[index] = cloned_item;
Azure.IoT Build 0:6ae2f7bca550 1452
Azure.IoT Build 0:6ae2f7bca550 1453 /* Codes_SRS_AMQPVALUE_01_164: [On success amqpvalue_set_list_item shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1454 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1455 }
Azure.IoT Build 0:6ae2f7bca550 1456 }
Azure.IoT Build 0:6ae2f7bca550 1457 }
Azure.IoT Build 0:6ae2f7bca550 1458 }
Azure.IoT Build 0:6ae2f7bca550 1459
Azure.IoT Build 0:6ae2f7bca550 1460 return result;
Azure.IoT Build 0:6ae2f7bca550 1461 }
Azure.IoT Build 0:6ae2f7bca550 1462
Azure.IoT Build 0:6ae2f7bca550 1463 AMQP_VALUE amqpvalue_get_list_item(AMQP_VALUE value, size_t index)
Azure.IoT Build 0:6ae2f7bca550 1464 {
Azure.IoT Build 0:6ae2f7bca550 1465 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 1466
Azure.IoT Build 0:6ae2f7bca550 1467 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1468 {
Azure.IoT Build 0:6ae2f7bca550 1469 /* Codes_SRS_AMQPVALUE_01_174: [If the value argument is NULL, amqpvalue_get_list_item shall fail and return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1470 LogError("NULL list value");
AzureIoTClient 23:1111ee8bcba4 1471 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1472 }
Azure.IoT Build 0:6ae2f7bca550 1473 else
Azure.IoT Build 0:6ae2f7bca550 1474 {
Azure.IoT Build 0:6ae2f7bca550 1475 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1476
Azure.IoT Build 0:6ae2f7bca550 1477 /* Codes_SRS_AMQPVALUE_01_177: [If value is not a list then amqpvalue_get_list_item shall fail and return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1478 if (value_data->type != AMQP_TYPE_LIST)
AzureIoTClient 23:1111ee8bcba4 1479 {
AzureIoTClient 23:1111ee8bcba4 1480 LogError("Value is not of type LIST");
AzureIoTClient 23:1111ee8bcba4 1481 result = NULL;
AzureIoTClient 23:1111ee8bcba4 1482 }
AzureIoTClient 23:1111ee8bcba4 1483 /* Codes_SRS_AMQPVALUE_01_175: [If index is greater or equal to the number of items in the list then amqpvalue_get_list_item shall fail and return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1484 else if (value_data->value.list_value.count <= index)
Azure.IoT Build 0:6ae2f7bca550 1485 {
AzureIoTClient 23:1111ee8bcba4 1486 LogError("Bad index value %u", (unsigned int)index);
AzureIoTClient 23:1111ee8bcba4 1487 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1488 }
Azure.IoT Build 0:6ae2f7bca550 1489 else
Azure.IoT Build 0:6ae2f7bca550 1490 {
Azure.IoT Build 0:6ae2f7bca550 1491 /* Codes_SRS_AMQPVALUE_01_173: [amqpvalue_get_list_item shall return a copy of the AMQP_VALUE stored at the 0 based position index in the list identified by value.] */
Azure.IoT Build 0:6ae2f7bca550 1492 /* Codes_SRS_AMQPVALUE_01_176: [If cloning the item at position index fails, then amqpvalue_get_list_item shall fail and return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 1493 result = amqpvalue_clone(value_data->value.list_value.items[index]);
Azure.IoT Build 0:6ae2f7bca550 1494 }
Azure.IoT Build 0:6ae2f7bca550 1495 }
Azure.IoT Build 0:6ae2f7bca550 1496
Azure.IoT Build 0:6ae2f7bca550 1497 return result;
Azure.IoT Build 0:6ae2f7bca550 1498 }
Azure.IoT Build 0:6ae2f7bca550 1499
Azure.IoT Build 0:6ae2f7bca550 1500 /* Codes_SRS_AMQPVALUE_01_178: [amqpvalue_create_map shall create an AMQP value that holds a map and return a handle to it.] */
Azure.IoT Build 0:6ae2f7bca550 1501 /* Codes_SRS_AMQPVALUE_01_031: [1.6.23 map A polymorphic mapping from distinct keys to values.] */
Azure.IoT Build 0:6ae2f7bca550 1502 AMQP_VALUE amqpvalue_create_map(void)
Azure.IoT Build 0:6ae2f7bca550 1503 {
AzureIoTClient 21:f9c433d8e6ca 1504 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 1505
AzureIoTClient 23:1111ee8bcba4 1506 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 1507 {
AzureIoTClient 23:1111ee8bcba4 1508 /* Codes_SRS_AMQPVALUE_01_179: [If allocating memory for the map fails, then amqpvalue_create_map shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 1509 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 1510 }
AzureIoTClient 23:1111ee8bcba4 1511 else
AzureIoTClient 23:1111ee8bcba4 1512 {
Azure.IoT Build 0:6ae2f7bca550 1513 result->type = AMQP_TYPE_MAP;
Azure.IoT Build 0:6ae2f7bca550 1514
Azure.IoT Build 0:6ae2f7bca550 1515 /* Codes_SRS_AMQPVALUE_01_180: [The number of key/value pairs in the newly created map shall be zero.] */
Azure.IoT Build 0:6ae2f7bca550 1516 result->value.map_value.pairs = NULL;
Azure.IoT Build 0:6ae2f7bca550 1517 result->value.map_value.pair_count = 0;
Azure.IoT Build 0:6ae2f7bca550 1518 }
Azure.IoT Build 0:6ae2f7bca550 1519
Azure.IoT Build 0:6ae2f7bca550 1520 return result;
Azure.IoT Build 0:6ae2f7bca550 1521 }
Azure.IoT Build 0:6ae2f7bca550 1522
Azure.IoT Build 0:6ae2f7bca550 1523 int amqpvalue_set_map_value(AMQP_VALUE map, AMQP_VALUE key, AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 1524 {
Azure.IoT Build 0:6ae2f7bca550 1525 int result;
Azure.IoT Build 0:6ae2f7bca550 1526
Azure.IoT Build 0:6ae2f7bca550 1527 /* Codes_SRS_AMQPVALUE_01_183: [If any of the arguments are NULL, amqpvalue_set_map_value shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1528 if ((map == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1529 (key == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1530 (value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1531 {
AzureIoTClient 23:1111ee8bcba4 1532 LogError("Bad arguments: map = %p, key = %p, value = %p",
AzureIoTClient 23:1111ee8bcba4 1533 map, key, value);
AzureIoTClient 23:1111ee8bcba4 1534 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1535 }
Azure.IoT Build 0:6ae2f7bca550 1536 else
Azure.IoT Build 0:6ae2f7bca550 1537 {
Azure.IoT Build 0:6ae2f7bca550 1538 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)map;
Azure.IoT Build 0:6ae2f7bca550 1539
Azure.IoT Build 0:6ae2f7bca550 1540 /* Codes_SRS_AMQPVALUE_01_196: [If the map argument is not an AMQP value created with the amqpvalue_create_map function than amqpvalue_set_map_value shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1541 if (value_data->type != AMQP_TYPE_MAP)
Azure.IoT Build 0:6ae2f7bca550 1542 {
AzureIoTClient 23:1111ee8bcba4 1543 LogError("Value is not of type MAP");
AzureIoTClient 23:1111ee8bcba4 1544 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1545 }
Azure.IoT Build 0:6ae2f7bca550 1546 else
Azure.IoT Build 0:6ae2f7bca550 1547 {
Azure.IoT Build 0:6ae2f7bca550 1548 AMQP_VALUE cloned_value;
Azure.IoT Build 0:6ae2f7bca550 1549
Azure.IoT Build 0:6ae2f7bca550 1550 /* Codes_SRS_AMQPVALUE_01_185: [When storing the key or value, their contents shall be cloned.] */
Azure.IoT Build 0:6ae2f7bca550 1551 cloned_value = amqpvalue_clone(value);
Azure.IoT Build 0:6ae2f7bca550 1552 if (cloned_value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1553 {
Azure.IoT Build 0:6ae2f7bca550 1554 /* Codes_SRS_AMQPVALUE_01_188: [If cloning the value fails, amqpvalue_set_map_value shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1555 LogError("Could not clone value to set in the map");
AzureIoTClient 23:1111ee8bcba4 1556 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1557 }
Azure.IoT Build 0:6ae2f7bca550 1558 else
Azure.IoT Build 0:6ae2f7bca550 1559 {
Azure.IoT Build 0:6ae2f7bca550 1560 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 1561 AMQP_VALUE cloned_key;
Azure.IoT Build 0:6ae2f7bca550 1562
Azure.IoT Build 0:6ae2f7bca550 1563 for (i = 0; i < value_data->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 1564 {
Azure.IoT Build 0:6ae2f7bca550 1565 if (amqpvalue_are_equal(value_data->value.map_value.pairs[i].key, key))
Azure.IoT Build 0:6ae2f7bca550 1566 {
AzureIoTClient 23:1111ee8bcba4 1567 LogError("Could not allocate NULL value for map entries");
AzureIoTClient 23:1111ee8bcba4 1568 break;
Azure.IoT Build 0:6ae2f7bca550 1569 }
Azure.IoT Build 0:6ae2f7bca550 1570 }
Azure.IoT Build 0:6ae2f7bca550 1571
Azure.IoT Build 0:6ae2f7bca550 1572 if (i < value_data->value.map_value.pair_count)
Azure.IoT Build 0:6ae2f7bca550 1573 {
Azure.IoT Build 0:6ae2f7bca550 1574 /* Codes_SRS_AMQPVALUE_01_184: [If the key already exists in the map, its value shall be replaced with the value provided by the value argument.] */
Azure.IoT Build 0:6ae2f7bca550 1575 /* Codes_SRS_AMQPVALUE_01_125: [A map in which there exist two identical key values is invalid.] */
Azure.IoT Build 0:6ae2f7bca550 1576 amqpvalue_destroy(value_data->value.map_value.pairs[i].value);
Azure.IoT Build 0:6ae2f7bca550 1577 value_data->value.map_value.pairs[i].value = cloned_value;
Azure.IoT Build 0:6ae2f7bca550 1578
Azure.IoT Build 0:6ae2f7bca550 1579 /* Codes_SRS_AMQPVALUE_01_182: [On success amqpvalue_set_map_value shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1580 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1581 }
Azure.IoT Build 0:6ae2f7bca550 1582 else
Azure.IoT Build 0:6ae2f7bca550 1583 {
Azure.IoT Build 0:6ae2f7bca550 1584 /* Codes_SRS_AMQPVALUE_01_185: [When storing the key or value, their contents shall be cloned.] */
Azure.IoT Build 0:6ae2f7bca550 1585 cloned_key = amqpvalue_clone(key);
Azure.IoT Build 0:6ae2f7bca550 1586 if (cloned_key == NULL)
Azure.IoT Build 0:6ae2f7bca550 1587 {
Azure.IoT Build 0:6ae2f7bca550 1588 /* Codes_SRS_AMQPVALUE_01_187: [If cloning the key fails, amqpvalue_set_map_value shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1589 amqpvalue_destroy(cloned_value);
AzureIoTClient 23:1111ee8bcba4 1590 LogError("Could not clone key for map");
AzureIoTClient 23:1111ee8bcba4 1591 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1592 }
Azure.IoT Build 0:6ae2f7bca550 1593 else
Azure.IoT Build 0:6ae2f7bca550 1594 {
AzureIoTClient 21:f9c433d8e6ca 1595 AMQP_MAP_KEY_VALUE_PAIR* new_pairs = (AMQP_MAP_KEY_VALUE_PAIR*)realloc(value_data->value.map_value.pairs, (value_data->value.map_value.pair_count + 1) * sizeof(AMQP_MAP_KEY_VALUE_PAIR));
Azure.IoT Build 0:6ae2f7bca550 1596 if (new_pairs == NULL)
Azure.IoT Build 0:6ae2f7bca550 1597 {
Azure.IoT Build 0:6ae2f7bca550 1598 /* Codes_SRS_AMQPVALUE_01_186: [If allocating memory to hold a new key/value pair fails, amqpvalue_set_map_value shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1599 amqpvalue_destroy(cloned_key);
Azure.IoT Build 0:6ae2f7bca550 1600 amqpvalue_destroy(cloned_value);
AzureIoTClient 23:1111ee8bcba4 1601 LogError("Could not reallocate memory for map");
AzureIoTClient 23:1111ee8bcba4 1602 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1603 }
Azure.IoT Build 0:6ae2f7bca550 1604 else
Azure.IoT Build 0:6ae2f7bca550 1605 {
Azure.IoT Build 0:6ae2f7bca550 1606 value_data->value.map_value.pairs = new_pairs;
Azure.IoT Build 0:6ae2f7bca550 1607
Azure.IoT Build 0:6ae2f7bca550 1608 /* Codes_SRS_AMQPVALUE_01_181: [amqpvalue_set_map_value shall set the value in the map identified by the map argument for a key/value pair identified by the key argument.] */
Azure.IoT Build 0:6ae2f7bca550 1609 value_data->value.map_value.pairs[value_data->value.map_value.pair_count].key = cloned_key;
Azure.IoT Build 0:6ae2f7bca550 1610 value_data->value.map_value.pairs[value_data->value.map_value.pair_count].value = cloned_value;
Azure.IoT Build 0:6ae2f7bca550 1611 value_data->value.map_value.pair_count++;
Azure.IoT Build 0:6ae2f7bca550 1612
Azure.IoT Build 0:6ae2f7bca550 1613 /* Codes_SRS_AMQPVALUE_01_182: [On success amqpvalue_set_map_value shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1614 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1615 }
Azure.IoT Build 0:6ae2f7bca550 1616 }
Azure.IoT Build 0:6ae2f7bca550 1617 }
Azure.IoT Build 0:6ae2f7bca550 1618 }
Azure.IoT Build 0:6ae2f7bca550 1619 }
Azure.IoT Build 0:6ae2f7bca550 1620 }
Azure.IoT Build 0:6ae2f7bca550 1621
Azure.IoT Build 0:6ae2f7bca550 1622 return result;
Azure.IoT Build 0:6ae2f7bca550 1623 }
Azure.IoT Build 0:6ae2f7bca550 1624
Azure.IoT Build 0:6ae2f7bca550 1625 AMQP_VALUE amqpvalue_get_map_value(AMQP_VALUE map, AMQP_VALUE key)
Azure.IoT Build 0:6ae2f7bca550 1626 {
Azure.IoT Build 0:6ae2f7bca550 1627 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 1628
Azure.IoT Build 0:6ae2f7bca550 1629 /* Codes_SRS_AMQPVALUE_01_190: [If any argument is NULL, amqpvalue_get_map_value shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 1630 if ((map == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1631 (key == NULL))
Azure.IoT Build 0:6ae2f7bca550 1632 {
AzureIoTClient 23:1111ee8bcba4 1633 LogError("Bad arguments: map = %p, key = %p",
AzureIoTClient 23:1111ee8bcba4 1634 map, key);
AzureIoTClient 23:1111ee8bcba4 1635 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1636 }
Azure.IoT Build 0:6ae2f7bca550 1637 else
Azure.IoT Build 0:6ae2f7bca550 1638 {
Azure.IoT Build 0:6ae2f7bca550 1639 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)map;
Azure.IoT Build 0:6ae2f7bca550 1640
Azure.IoT Build 0:6ae2f7bca550 1641 /* Codes_SRS_AMQPVALUE_01_197: [If the map argument is not an AMQP value created with the amqpvalue_create_map function than amqpvalue_get_map_value shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 1642 if (value_data->type != AMQP_TYPE_MAP)
Azure.IoT Build 0:6ae2f7bca550 1643 {
AzureIoTClient 23:1111ee8bcba4 1644 LogError("Value is not of type MAP");
AzureIoTClient 23:1111ee8bcba4 1645 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1646 }
Azure.IoT Build 0:6ae2f7bca550 1647 else
Azure.IoT Build 0:6ae2f7bca550 1648 {
Azure.IoT Build 0:6ae2f7bca550 1649 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 1650
Azure.IoT Build 0:6ae2f7bca550 1651 for (i = 0; i < value_data->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 1652 {
Azure.IoT Build 0:6ae2f7bca550 1653 if (amqpvalue_are_equal(value_data->value.map_value.pairs[i].key, key))
Azure.IoT Build 0:6ae2f7bca550 1654 {
AzureIoTClient 23:1111ee8bcba4 1655 break;
Azure.IoT Build 0:6ae2f7bca550 1656 }
Azure.IoT Build 0:6ae2f7bca550 1657 }
Azure.IoT Build 0:6ae2f7bca550 1658
Azure.IoT Build 0:6ae2f7bca550 1659 if (i == value_data->value.map_value.pair_count)
Azure.IoT Build 0:6ae2f7bca550 1660 {
Azure.IoT Build 0:6ae2f7bca550 1661 /* Codes_SRS_AMQPVALUE_01_191: [If the key cannot be found, amqpvalue_get_map_value shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 1662 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1663 }
Azure.IoT Build 0:6ae2f7bca550 1664 else
Azure.IoT Build 0:6ae2f7bca550 1665 {
Azure.IoT Build 0:6ae2f7bca550 1666 /* Codes_SRS_AMQPVALUE_01_189: [amqpvalue_get_map_value shall return the value whose key is identified by the key argument.] */
Azure.IoT Build 0:6ae2f7bca550 1667 /* Codes_SRS_AMQPVALUE_01_192: [The returned value shall be a clone of the actual value stored in the map.] */
Azure.IoT Build 0:6ae2f7bca550 1668 result = amqpvalue_clone(value_data->value.map_value.pairs[i].value);
Azure.IoT Build 0:6ae2f7bca550 1669 }
Azure.IoT Build 0:6ae2f7bca550 1670 }
Azure.IoT Build 0:6ae2f7bca550 1671 }
Azure.IoT Build 0:6ae2f7bca550 1672
Azure.IoT Build 0:6ae2f7bca550 1673 return result;
Azure.IoT Build 0:6ae2f7bca550 1674 }
Azure.IoT Build 0:6ae2f7bca550 1675
Azure.IoT Build 0:6ae2f7bca550 1676 int amqpvalue_get_map_pair_count(AMQP_VALUE map, uint32_t* pair_count)
Azure.IoT Build 0:6ae2f7bca550 1677 {
Azure.IoT Build 0:6ae2f7bca550 1678 int result;
Azure.IoT Build 0:6ae2f7bca550 1679
Azure.IoT Build 0:6ae2f7bca550 1680 /* Codes_SRS_AMQPVALUE_01_195: [If any of the arguments is NULL, amqpvalue_get_map_pair_count shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1681 if ((map == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1682 (pair_count == NULL))
Azure.IoT Build 0:6ae2f7bca550 1683 {
AzureIoTClient 23:1111ee8bcba4 1684 LogError("Bad arguments: map = %p, pair_count = %p",
AzureIoTClient 23:1111ee8bcba4 1685 map, pair_count);
AzureIoTClient 23:1111ee8bcba4 1686 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1687 }
Azure.IoT Build 0:6ae2f7bca550 1688 else
Azure.IoT Build 0:6ae2f7bca550 1689 {
Azure.IoT Build 0:6ae2f7bca550 1690 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)map;
Azure.IoT Build 0:6ae2f7bca550 1691
Azure.IoT Build 0:6ae2f7bca550 1692 if (value_data->type != AMQP_TYPE_MAP)
Azure.IoT Build 0:6ae2f7bca550 1693 {
Azure.IoT Build 0:6ae2f7bca550 1694 /* Codes_SRS_AMQPVALUE_01_198: [If the map argument is not an AMQP value created with the amqpvalue_create_map function then amqpvalue_get_map_pair_count shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1695 LogError("Value is not of type MAP");
AzureIoTClient 23:1111ee8bcba4 1696 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1697 }
Azure.IoT Build 0:6ae2f7bca550 1698 else
Azure.IoT Build 0:6ae2f7bca550 1699 {
Azure.IoT Build 0:6ae2f7bca550 1700 /* Codes_SRS_AMQPVALUE_01_193: [amqpvalue_get_map_pair_count shall fill in the number of key/value pairs in the map in the pair_count argument.] */
Azure.IoT Build 0:6ae2f7bca550 1701 *pair_count = value_data->value.map_value.pair_count;
Azure.IoT Build 0:6ae2f7bca550 1702
Azure.IoT Build 0:6ae2f7bca550 1703 /* Codes_SRS_AMQPVALUE_01_194: [On success amqpvalue_get_map_pair_count shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1704 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1705 }
Azure.IoT Build 0:6ae2f7bca550 1706 }
Azure.IoT Build 0:6ae2f7bca550 1707
Azure.IoT Build 0:6ae2f7bca550 1708 return result;
Azure.IoT Build 0:6ae2f7bca550 1709 }
Azure.IoT Build 0:6ae2f7bca550 1710
Azure.IoT Build 0:6ae2f7bca550 1711 int amqpvalue_get_map_key_value_pair(AMQP_VALUE map, uint32_t index, AMQP_VALUE* key, AMQP_VALUE* value)
Azure.IoT Build 0:6ae2f7bca550 1712 {
Azure.IoT Build 0:6ae2f7bca550 1713 int result;
Azure.IoT Build 0:6ae2f7bca550 1714
Azure.IoT Build 0:6ae2f7bca550 1715 /* Codes_SRS_AMQPVALUE_01_201: [If any of the map, key or value arguments is NULL, amqpvalue_get_map_key_value_pair shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1716 if ((map == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1717 (key == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1718 (value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1719 {
AzureIoTClient 23:1111ee8bcba4 1720 LogError("Bad arguments: map = %p, key = %p, value = %p",
AzureIoTClient 23:1111ee8bcba4 1721 map, key, value);
AzureIoTClient 23:1111ee8bcba4 1722 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1723 }
Azure.IoT Build 0:6ae2f7bca550 1724 else
Azure.IoT Build 0:6ae2f7bca550 1725 {
Azure.IoT Build 0:6ae2f7bca550 1726 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)map;
Azure.IoT Build 0:6ae2f7bca550 1727
Azure.IoT Build 0:6ae2f7bca550 1728 if (value_data->type != AMQP_TYPE_MAP)
Azure.IoT Build 0:6ae2f7bca550 1729 {
Azure.IoT Build 0:6ae2f7bca550 1730 /* Codes_SRS_AMQPVALUE_01_205: [If the map argument is not an AMQP value created with the amqpvalue_create_map function then amqpvalue_get_map_key_value_pair shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1731 LogError("Value is not of type MAP");
AzureIoTClient 23:1111ee8bcba4 1732 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1733 }
Azure.IoT Build 0:6ae2f7bca550 1734 else if (value_data->value.map_value.pair_count <= index)
Azure.IoT Build 0:6ae2f7bca550 1735 {
Azure.IoT Build 0:6ae2f7bca550 1736 /* Codes_SRS_AMQPVALUE_01_204: [If the index argument is greater or equal to the number of key/value pairs in the map then amqpvalue_get_map_key_value_pair shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1737 LogError("Index out of range: %u", (unsigned int)index);
AzureIoTClient 23:1111ee8bcba4 1738 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1739 }
Azure.IoT Build 0:6ae2f7bca550 1740 else
Azure.IoT Build 0:6ae2f7bca550 1741 {
Azure.IoT Build 0:6ae2f7bca550 1742 /* Codes_SRS_AMQPVALUE_01_199: [amqpvalue_get_map_key_value_pair shall fill in the key and value arguments copies of the key/value pair on the 0 based position index in a map.] */
Azure.IoT Build 0:6ae2f7bca550 1743 *key = amqpvalue_clone(value_data->value.map_value.pairs[index].key);
Azure.IoT Build 0:6ae2f7bca550 1744 if (*key == NULL)
Azure.IoT Build 0:6ae2f7bca550 1745 {
Azure.IoT Build 0:6ae2f7bca550 1746 /* Codes_SRS_AMQPVALUE_01_202: [If cloning the key fails, amqpvalue_get_map_key_value_pair shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 1747 LogError("Could not clone index %u key", (unsigned int)index);
AzureIoTClient 23:1111ee8bcba4 1748 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1749 }
Azure.IoT Build 0:6ae2f7bca550 1750 else
Azure.IoT Build 0:6ae2f7bca550 1751 {
Azure.IoT Build 0:6ae2f7bca550 1752 *value = amqpvalue_clone(value_data->value.map_value.pairs[index].value);
Azure.IoT Build 0:6ae2f7bca550 1753 if (*value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1754 {
Azure.IoT Build 0:6ae2f7bca550 1755 /* Codes_SRS_AMQPVALUE_01_203: [If cloning the value fails, amqpvalue_get_map_key_value_pair shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 1756 amqpvalue_destroy(*key);
AzureIoTClient 23:1111ee8bcba4 1757 LogError("Could not clone index %u value", (unsigned int)index);
AzureIoTClient 23:1111ee8bcba4 1758 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1759 }
Azure.IoT Build 0:6ae2f7bca550 1760 else
Azure.IoT Build 0:6ae2f7bca550 1761 {
Azure.IoT Build 0:6ae2f7bca550 1762 /* Codes_SRS_AMQPVALUE_01_200: [On success amqpvalue_get_map_key_value_pair shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 1763 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1764 }
Azure.IoT Build 0:6ae2f7bca550 1765 }
Azure.IoT Build 0:6ae2f7bca550 1766 }
Azure.IoT Build 0:6ae2f7bca550 1767 }
Azure.IoT Build 0:6ae2f7bca550 1768
Azure.IoT Build 0:6ae2f7bca550 1769 return result;
Azure.IoT Build 0:6ae2f7bca550 1770 }
Azure.IoT Build 0:6ae2f7bca550 1771
Azure.IoT Build 0:6ae2f7bca550 1772 int amqpvalue_get_map(AMQP_VALUE value, AMQP_VALUE* map_value)
Azure.IoT Build 0:6ae2f7bca550 1773 {
Azure.IoT Build 0:6ae2f7bca550 1774 int result;
Azure.IoT Build 0:6ae2f7bca550 1775
Azure.IoT Build 0:6ae2f7bca550 1776 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1777 (map_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1778 {
AzureIoTClient 23:1111ee8bcba4 1779 LogError("Bad arguments: value = %p, map_value = %p",
AzureIoTClient 23:1111ee8bcba4 1780 value, map_value);
AzureIoTClient 23:1111ee8bcba4 1781 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1782 }
Azure.IoT Build 0:6ae2f7bca550 1783 else
Azure.IoT Build 0:6ae2f7bca550 1784 {
Azure.IoT Build 0:6ae2f7bca550 1785 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1786 if (value_data->type != AMQP_TYPE_MAP)
Azure.IoT Build 0:6ae2f7bca550 1787 {
AzureIoTClient 23:1111ee8bcba4 1788 LogError("Value is not of type MAP");
AzureIoTClient 23:1111ee8bcba4 1789 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1790 }
Azure.IoT Build 0:6ae2f7bca550 1791 else
Azure.IoT Build 0:6ae2f7bca550 1792 {
AzureIoTClient 23:1111ee8bcba4 1793 *map_value = value;
AzureIoTClient 23:1111ee8bcba4 1794 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1795 }
Azure.IoT Build 0:6ae2f7bca550 1796 }
Azure.IoT Build 0:6ae2f7bca550 1797
Azure.IoT Build 0:6ae2f7bca550 1798 return result;
Azure.IoT Build 0:6ae2f7bca550 1799 }
Azure.IoT Build 0:6ae2f7bca550 1800
Azure.IoT Build 0:6ae2f7bca550 1801 AMQP_VALUE amqpvalue_create_array(void)
Azure.IoT Build 0:6ae2f7bca550 1802 {
AzureIoTClient 21:f9c433d8e6ca 1803 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 1804 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 1805 {
AzureIoTClient 23:1111ee8bcba4 1806 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 1807 }
AzureIoTClient 23:1111ee8bcba4 1808 else
AzureIoTClient 23:1111ee8bcba4 1809 {
Azure.IoT Build 0:6ae2f7bca550 1810 result->type = AMQP_TYPE_ARRAY;
Azure.IoT Build 0:6ae2f7bca550 1811 }
AzureIoTClient 23:1111ee8bcba4 1812
Azure.IoT Build 0:6ae2f7bca550 1813 return result;
Azure.IoT Build 0:6ae2f7bca550 1814 }
Azure.IoT Build 0:6ae2f7bca550 1815
Azure.IoT Build 0:6ae2f7bca550 1816 int amqpvalue_get_array_item_count(AMQP_VALUE value, uint32_t* size)
Azure.IoT Build 0:6ae2f7bca550 1817 {
Azure.IoT Build 0:6ae2f7bca550 1818 int result;
Azure.IoT Build 0:6ae2f7bca550 1819
Azure.IoT Build 0:6ae2f7bca550 1820 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1821 (size == NULL))
Azure.IoT Build 0:6ae2f7bca550 1822 {
AzureIoTClient 23:1111ee8bcba4 1823 LogError("Bad arguments: value = %p, size = %p",
AzureIoTClient 23:1111ee8bcba4 1824 value, size);
AzureIoTClient 23:1111ee8bcba4 1825 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1826 }
Azure.IoT Build 0:6ae2f7bca550 1827 else
Azure.IoT Build 0:6ae2f7bca550 1828 {
Azure.IoT Build 0:6ae2f7bca550 1829 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1830
Azure.IoT Build 0:6ae2f7bca550 1831 if (value_data->type != AMQP_TYPE_ARRAY)
Azure.IoT Build 0:6ae2f7bca550 1832 {
AzureIoTClient 23:1111ee8bcba4 1833 LogError("Value is not of type ARRAY");
AzureIoTClient 23:1111ee8bcba4 1834 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1835 }
Azure.IoT Build 0:6ae2f7bca550 1836 else
Azure.IoT Build 0:6ae2f7bca550 1837 {
Azure.IoT Build 0:6ae2f7bca550 1838 *size = value_data->value.array_value.count;
Azure.IoT Build 0:6ae2f7bca550 1839 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1840 }
Azure.IoT Build 0:6ae2f7bca550 1841 }
Azure.IoT Build 0:6ae2f7bca550 1842
Azure.IoT Build 0:6ae2f7bca550 1843 return result;
Azure.IoT Build 0:6ae2f7bca550 1844 }
Azure.IoT Build 0:6ae2f7bca550 1845
Azure.IoT Build 0:6ae2f7bca550 1846 int amqpvalue_add_array_item(AMQP_VALUE value, AMQP_VALUE array_item_value)
Azure.IoT Build 0:6ae2f7bca550 1847 {
Azure.IoT Build 0:6ae2f7bca550 1848 int result;
Azure.IoT Build 0:6ae2f7bca550 1849
Azure.IoT Build 0:6ae2f7bca550 1850 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1851 {
AzureIoTClient 23:1111ee8bcba4 1852 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 1853 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1854 }
Azure.IoT Build 0:6ae2f7bca550 1855 else
Azure.IoT Build 0:6ae2f7bca550 1856 {
Azure.IoT Build 0:6ae2f7bca550 1857 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1858 if (value_data->type != AMQP_TYPE_ARRAY)
Azure.IoT Build 0:6ae2f7bca550 1859 {
AzureIoTClient 23:1111ee8bcba4 1860 LogError("Value is not of type ARRAY");
AzureIoTClient 23:1111ee8bcba4 1861 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1862 }
Azure.IoT Build 0:6ae2f7bca550 1863 else
Azure.IoT Build 0:6ae2f7bca550 1864 {
Azure.IoT Build 0:6ae2f7bca550 1865 AMQP_VALUE_DATA* array_item_value_data = (AMQP_VALUE_DATA*)array_item_value;
Azure.IoT Build 0:6ae2f7bca550 1866 if ((value_data->value.array_value.count > 0) &&
Azure.IoT Build 0:6ae2f7bca550 1867 (array_item_value_data->type != value_data->value.array_value.items[0]->type))
Azure.IoT Build 0:6ae2f7bca550 1868 {
AzureIoTClient 23:1111ee8bcba4 1869 LogError("Cannot put different types in the same array");
AzureIoTClient 23:1111ee8bcba4 1870 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1871 }
Azure.IoT Build 0:6ae2f7bca550 1872 else
Azure.IoT Build 0:6ae2f7bca550 1873 {
Azure.IoT Build 0:6ae2f7bca550 1874 AMQP_VALUE cloned_item = amqpvalue_clone(array_item_value);
Azure.IoT Build 0:6ae2f7bca550 1875 if (cloned_item == NULL)
Azure.IoT Build 0:6ae2f7bca550 1876 {
AzureIoTClient 23:1111ee8bcba4 1877 LogError("Cannot clone value to put in the array");
AzureIoTClient 23:1111ee8bcba4 1878 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1879 }
Azure.IoT Build 0:6ae2f7bca550 1880 else
Azure.IoT Build 0:6ae2f7bca550 1881 {
AzureIoTClient 21:f9c433d8e6ca 1882 AMQP_VALUE* new_array = (AMQP_VALUE*)realloc(value_data->value.array_value.items, (value_data->value.array_value.count + 1) * sizeof(AMQP_VALUE));
Azure.IoT Build 0:6ae2f7bca550 1883 if (new_array == NULL)
Azure.IoT Build 0:6ae2f7bca550 1884 {
Azure.IoT Build 0:6ae2f7bca550 1885 amqpvalue_destroy(cloned_item);
AzureIoTClient 23:1111ee8bcba4 1886 LogError("Cannot resize array");
AzureIoTClient 23:1111ee8bcba4 1887 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1888 }
Azure.IoT Build 0:6ae2f7bca550 1889 else
Azure.IoT Build 0:6ae2f7bca550 1890 {
Azure.IoT Build 0:6ae2f7bca550 1891 value_data->value.array_value.items = new_array;
Azure.IoT Build 0:6ae2f7bca550 1892
Azure.IoT Build 0:6ae2f7bca550 1893 value_data->value.array_value.items[value_data->value.array_value.count] = cloned_item;
Azure.IoT Build 0:6ae2f7bca550 1894 value_data->value.array_value.count++;
Azure.IoT Build 0:6ae2f7bca550 1895
Azure.IoT Build 0:6ae2f7bca550 1896 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1897 }
Azure.IoT Build 0:6ae2f7bca550 1898 }
Azure.IoT Build 0:6ae2f7bca550 1899 }
Azure.IoT Build 0:6ae2f7bca550 1900 }
Azure.IoT Build 0:6ae2f7bca550 1901 }
Azure.IoT Build 0:6ae2f7bca550 1902
Azure.IoT Build 0:6ae2f7bca550 1903 return result;
Azure.IoT Build 0:6ae2f7bca550 1904 }
Azure.IoT Build 0:6ae2f7bca550 1905
Azure.IoT Build 0:6ae2f7bca550 1906 AMQP_VALUE amqpvalue_get_array_item(AMQP_VALUE value, uint32_t index)
Azure.IoT Build 0:6ae2f7bca550 1907 {
Azure.IoT Build 0:6ae2f7bca550 1908 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 1909
Azure.IoT Build 0:6ae2f7bca550 1910 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 1911 {
AzureIoTClient 23:1111ee8bcba4 1912 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 1913 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1914 }
Azure.IoT Build 0:6ae2f7bca550 1915 else
Azure.IoT Build 0:6ae2f7bca550 1916 {
Azure.IoT Build 0:6ae2f7bca550 1917 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1918
AzureIoTClient 23:1111ee8bcba4 1919 if (value_data->type != AMQP_TYPE_ARRAY)
AzureIoTClient 23:1111ee8bcba4 1920 {
AzureIoTClient 23:1111ee8bcba4 1921 LogError("Value is not of type ARRAY");
AzureIoTClient 23:1111ee8bcba4 1922 result = NULL;
AzureIoTClient 23:1111ee8bcba4 1923 }
AzureIoTClient 23:1111ee8bcba4 1924 else if (value_data->value.array_value.count <= index)
Azure.IoT Build 0:6ae2f7bca550 1925 {
AzureIoTClient 23:1111ee8bcba4 1926 LogError("Index out of range: %u", (unsigned int)index);
AzureIoTClient 23:1111ee8bcba4 1927 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 1928 }
Azure.IoT Build 0:6ae2f7bca550 1929 else
Azure.IoT Build 0:6ae2f7bca550 1930 {
Azure.IoT Build 0:6ae2f7bca550 1931 result = amqpvalue_clone(value_data->value.array_value.items[index]);
Azure.IoT Build 0:6ae2f7bca550 1932 }
Azure.IoT Build 0:6ae2f7bca550 1933 }
Azure.IoT Build 0:6ae2f7bca550 1934
Azure.IoT Build 0:6ae2f7bca550 1935 return result;
Azure.IoT Build 0:6ae2f7bca550 1936 }
Azure.IoT Build 0:6ae2f7bca550 1937
Azure.IoT Build 0:6ae2f7bca550 1938 int amqpvalue_get_array(AMQP_VALUE value, AMQP_VALUE* array_value)
Azure.IoT Build 0:6ae2f7bca550 1939 {
Azure.IoT Build 0:6ae2f7bca550 1940 int result;
Azure.IoT Build 0:6ae2f7bca550 1941
Azure.IoT Build 0:6ae2f7bca550 1942 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1943 (array_value == NULL))
Azure.IoT Build 0:6ae2f7bca550 1944 {
AzureIoTClient 23:1111ee8bcba4 1945 LogError("Bad arguments: value = %p, array_value = %p",
AzureIoTClient 23:1111ee8bcba4 1946 value, array_value);
AzureIoTClient 23:1111ee8bcba4 1947 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1948 }
Azure.IoT Build 0:6ae2f7bca550 1949 else
Azure.IoT Build 0:6ae2f7bca550 1950 {
Azure.IoT Build 0:6ae2f7bca550 1951 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 1952 if (value_data->type != AMQP_TYPE_ARRAY)
Azure.IoT Build 0:6ae2f7bca550 1953 {
AzureIoTClient 23:1111ee8bcba4 1954 LogError("Value is not of type ARRAY");
AzureIoTClient 23:1111ee8bcba4 1955 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1956 }
Azure.IoT Build 0:6ae2f7bca550 1957 else
Azure.IoT Build 0:6ae2f7bca550 1958 {
AzureIoTClient 23:1111ee8bcba4 1959 *array_value = value;
AzureIoTClient 23:1111ee8bcba4 1960 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1961 }
Azure.IoT Build 0:6ae2f7bca550 1962 }
Azure.IoT Build 0:6ae2f7bca550 1963
Azure.IoT Build 0:6ae2f7bca550 1964 return result;
Azure.IoT Build 0:6ae2f7bca550 1965 }
Azure.IoT Build 0:6ae2f7bca550 1966
Azure.IoT Build 0:6ae2f7bca550 1967 /* Codes_SRS_AMQPVALUE_01_206: [amqpvalue_are_equal shall return true if the contents of value1 and value2 are equal.] */
Azure.IoT Build 0:6ae2f7bca550 1968 bool amqpvalue_are_equal(AMQP_VALUE value1, AMQP_VALUE value2)
Azure.IoT Build 0:6ae2f7bca550 1969 {
Azure.IoT Build 0:6ae2f7bca550 1970 bool result;
Azure.IoT Build 0:6ae2f7bca550 1971
Azure.IoT Build 0:6ae2f7bca550 1972 /* Codes_SRS_AMQPVALUE_01_207: [If value1 and value2 are NULL, amqpvalue_are_equal shall return true.] */
Azure.IoT Build 0:6ae2f7bca550 1973 if ((value1 == NULL) &&
Azure.IoT Build 0:6ae2f7bca550 1974 (value2 == NULL))
Azure.IoT Build 0:6ae2f7bca550 1975 {
AzureIoTClient 23:1111ee8bcba4 1976 LogError("Bad arguments: value1 = %p, value2 = %p",
AzureIoTClient 23:1111ee8bcba4 1977 value1, value2);
AzureIoTClient 23:1111ee8bcba4 1978 result = true;
Azure.IoT Build 0:6ae2f7bca550 1979 }
Azure.IoT Build 0:6ae2f7bca550 1980 /* Codes_SRS_AMQPVALUE_01_208: [If one of the arguments is NULL and the other is not, amqpvalue_are_equal shall return false.] */
Azure.IoT Build 0:6ae2f7bca550 1981 else if ((value1 != value2) && ((value1 == NULL) || (value2 == NULL)))
Azure.IoT Build 0:6ae2f7bca550 1982 {
Azure.IoT Build 0:6ae2f7bca550 1983 result = false;
Azure.IoT Build 0:6ae2f7bca550 1984 }
Azure.IoT Build 0:6ae2f7bca550 1985 else
Azure.IoT Build 0:6ae2f7bca550 1986 {
Azure.IoT Build 0:6ae2f7bca550 1987 AMQP_VALUE_DATA* value1_data = (AMQP_VALUE_DATA*)value1;
Azure.IoT Build 0:6ae2f7bca550 1988 AMQP_VALUE_DATA* value2_data = (AMQP_VALUE_DATA*)value2;
Azure.IoT Build 0:6ae2f7bca550 1989
Azure.IoT Build 0:6ae2f7bca550 1990 /* Codes_SRS_AMQPVALUE_01_209: [If the types for value1 and value2 are different amqpvalue_are_equal shall return false.] */
Azure.IoT Build 0:6ae2f7bca550 1991 #if _MSC_VER
Azure.IoT Build 0:6ae2f7bca550 1992 #pragma warning(suppress: 28182) /* The compiler states that value2_data can be NULL, but it cannot. And there are tests for it. */
Azure.IoT Build 0:6ae2f7bca550 1993 #endif
Azure.IoT Build 0:6ae2f7bca550 1994 if (value1_data->type != value2_data->type)
Azure.IoT Build 0:6ae2f7bca550 1995 {
Azure.IoT Build 0:6ae2f7bca550 1996 result = false;
Azure.IoT Build 0:6ae2f7bca550 1997 }
Azure.IoT Build 0:6ae2f7bca550 1998 else
Azure.IoT Build 0:6ae2f7bca550 1999 {
Azure.IoT Build 0:6ae2f7bca550 2000 switch (value1_data->type)
Azure.IoT Build 0:6ae2f7bca550 2001 {
Azure.IoT Build 0:6ae2f7bca550 2002 default:
Azure.IoT Build 0:6ae2f7bca550 2003 result = false;
Azure.IoT Build 0:6ae2f7bca550 2004 break;
Azure.IoT Build 0:6ae2f7bca550 2005
Azure.IoT Build 0:6ae2f7bca550 2006 case AMQP_TYPE_NULL:
Azure.IoT Build 0:6ae2f7bca550 2007 /* Codes_SRS_AMQPVALUE_01_210: [- null: always equal.] */
Azure.IoT Build 0:6ae2f7bca550 2008 result = true;
Azure.IoT Build 0:6ae2f7bca550 2009 break;
Azure.IoT Build 0:6ae2f7bca550 2010
Azure.IoT Build 0:6ae2f7bca550 2011 case AMQP_TYPE_BOOL:
Azure.IoT Build 0:6ae2f7bca550 2012 /* Codes_SRS_AMQPVALUE_01_211: [- boolean: compare the bool content.] */
Azure.IoT Build 0:6ae2f7bca550 2013 result = (value1_data->value.bool_value == value2_data->value.bool_value);
Azure.IoT Build 0:6ae2f7bca550 2014 break;
Azure.IoT Build 0:6ae2f7bca550 2015
Azure.IoT Build 0:6ae2f7bca550 2016 case AMQP_TYPE_UBYTE:
Azure.IoT Build 0:6ae2f7bca550 2017 /* Codes_SRS_AMQPVALUE_01_212: [- ubyte: compare the unsigned char content.] */
Azure.IoT Build 0:6ae2f7bca550 2018 result = (value1_data->value.ubyte_value == value2_data->value.ubyte_value);
Azure.IoT Build 0:6ae2f7bca550 2019 break;
Azure.IoT Build 0:6ae2f7bca550 2020
Azure.IoT Build 0:6ae2f7bca550 2021 case AMQP_TYPE_USHORT:
Azure.IoT Build 0:6ae2f7bca550 2022 /* Codes_SRS_AMQPVALUE_01_213: [- ushort: compare the uint16_t content.] */
Azure.IoT Build 0:6ae2f7bca550 2023 result = (value1_data->value.ushort_value == value2_data->value.ushort_value);
Azure.IoT Build 0:6ae2f7bca550 2024 break;
Azure.IoT Build 0:6ae2f7bca550 2025
Azure.IoT Build 0:6ae2f7bca550 2026 case AMQP_TYPE_UINT:
Azure.IoT Build 0:6ae2f7bca550 2027 /* Codes_SRS_AMQPVALUE_01_214: [- uint: compare the uint32_t content.] */
Azure.IoT Build 0:6ae2f7bca550 2028 result = (value1_data->value.uint_value == value2_data->value.uint_value);
Azure.IoT Build 0:6ae2f7bca550 2029 break;
Azure.IoT Build 0:6ae2f7bca550 2030
Azure.IoT Build 0:6ae2f7bca550 2031 case AMQP_TYPE_ULONG:
Azure.IoT Build 0:6ae2f7bca550 2032 /* Codes_SRS_AMQPVALUE_01_215: [- ulong: compare the uint64_t content.] */
Azure.IoT Build 0:6ae2f7bca550 2033 result = (value1_data->value.ulong_value == value2_data->value.ulong_value);
Azure.IoT Build 0:6ae2f7bca550 2034 break;
Azure.IoT Build 0:6ae2f7bca550 2035
Azure.IoT Build 0:6ae2f7bca550 2036 case AMQP_TYPE_BYTE:
Azure.IoT Build 0:6ae2f7bca550 2037 /* Codes_SRS_AMQPVALUE_01_216: [- byte: compare the char content.] */
Azure.IoT Build 0:6ae2f7bca550 2038 result = (value1_data->value.byte_value == value2_data->value.byte_value);
Azure.IoT Build 0:6ae2f7bca550 2039 break;
Azure.IoT Build 0:6ae2f7bca550 2040
Azure.IoT Build 0:6ae2f7bca550 2041 case AMQP_TYPE_SHORT:
Azure.IoT Build 0:6ae2f7bca550 2042 /* Codes_SRS_AMQPVALUE_01_217: [- short: compare the int16_t content.] */
Azure.IoT Build 0:6ae2f7bca550 2043 result = (value1_data->value.short_value == value2_data->value.short_value);
Azure.IoT Build 0:6ae2f7bca550 2044 break;
Azure.IoT Build 0:6ae2f7bca550 2045
Azure.IoT Build 0:6ae2f7bca550 2046 case AMQP_TYPE_INT:
Azure.IoT Build 0:6ae2f7bca550 2047 /* Codes_SRS_AMQPVALUE_01_218: [- int: compare the int32_t content.] */
Azure.IoT Build 0:6ae2f7bca550 2048 result = (value1_data->value.int_value == value2_data->value.int_value);
Azure.IoT Build 0:6ae2f7bca550 2049 break;
Azure.IoT Build 0:6ae2f7bca550 2050
Azure.IoT Build 0:6ae2f7bca550 2051 case AMQP_TYPE_LONG:
Azure.IoT Build 0:6ae2f7bca550 2052 /* Codes_SRS_AMQPVALUE_01_219: [- long: compare the int64_t content.] */
Azure.IoT Build 0:6ae2f7bca550 2053 result = (value1_data->value.long_value == value2_data->value.long_value);
Azure.IoT Build 0:6ae2f7bca550 2054 break;
Azure.IoT Build 0:6ae2f7bca550 2055
Azure.IoT Build 0:6ae2f7bca550 2056 case AMQP_TYPE_FLOAT:
Azure.IoT Build 0:6ae2f7bca550 2057 /* Codes_SRS_AMQPVALUE_01_224: [- float: compare the float content.] */
Azure.IoT Build 0:6ae2f7bca550 2058 result = (value1_data->value.float_value == value2_data->value.float_value);
Azure.IoT Build 0:6ae2f7bca550 2059 break;
Azure.IoT Build 0:6ae2f7bca550 2060
Azure.IoT Build 0:6ae2f7bca550 2061 case AMQP_TYPE_DOUBLE:
Azure.IoT Build 0:6ae2f7bca550 2062 /* Codes_SRS_AMQPVALUE_01_225: [- double: compare the double content.] */
Azure.IoT Build 0:6ae2f7bca550 2063 result = (value1_data->value.double_value == value2_data->value.double_value);
Azure.IoT Build 0:6ae2f7bca550 2064 break;
Azure.IoT Build 0:6ae2f7bca550 2065
Azure.IoT Build 0:6ae2f7bca550 2066 case AMQP_TYPE_CHAR:
Azure.IoT Build 0:6ae2f7bca550 2067 /* Codes_SRS_AMQPVALUE_01_226: [- char: compare the UNICODE character.] */
Azure.IoT Build 0:6ae2f7bca550 2068 result = (value1_data->value.char_value == value2_data->value.char_value);
Azure.IoT Build 0:6ae2f7bca550 2069 break;
Azure.IoT Build 0:6ae2f7bca550 2070
Azure.IoT Build 0:6ae2f7bca550 2071 case AMQP_TYPE_TIMESTAMP:
Azure.IoT Build 0:6ae2f7bca550 2072 /* Codes_SRS_AMQPVALUE_01_227: [- timestamp: compare the underlying 64 bit integer.] */
Azure.IoT Build 0:6ae2f7bca550 2073 result = (value1_data->value.timestamp_value == value2_data->value.timestamp_value);
Azure.IoT Build 0:6ae2f7bca550 2074 break;
Azure.IoT Build 0:6ae2f7bca550 2075
Azure.IoT Build 0:6ae2f7bca550 2076 case AMQP_TYPE_UUID:
Azure.IoT Build 0:6ae2f7bca550 2077 /* Codes_SRS_AMQPVALUE_01_228: [- uuid: compare all uuid bytes.] */
Azure.IoT Build 0:6ae2f7bca550 2078 result = (memcmp(value1_data->value.uuid_value, value2_data->value.uuid_value, sizeof(value1_data->value.uuid_value)) == 0);
Azure.IoT Build 0:6ae2f7bca550 2079 break;
Azure.IoT Build 0:6ae2f7bca550 2080
Azure.IoT Build 0:6ae2f7bca550 2081 case AMQP_TYPE_BINARY:
Azure.IoT Build 0:6ae2f7bca550 2082 /* Codes_SRS_AMQPVALUE_01_229: [- binary: compare all binary bytes.] */
Azure.IoT Build 0:6ae2f7bca550 2083 result = (value1_data->value.binary_value.length == value2_data->value.binary_value.length) &&
Azure.IoT Build 0:6ae2f7bca550 2084 (memcmp(value1_data->value.binary_value.bytes, value2_data->value.binary_value.bytes, value1_data->value.binary_value.length) == 0);
Azure.IoT Build 0:6ae2f7bca550 2085 break;
Azure.IoT Build 0:6ae2f7bca550 2086
Azure.IoT Build 0:6ae2f7bca550 2087 case AMQP_TYPE_STRING:
Azure.IoT Build 0:6ae2f7bca550 2088 /* Codes_SRS_AMQPVALUE_01_230: [- string: compare all string characters.] */
Azure.IoT Build 0:6ae2f7bca550 2089 result = (strcmp(value1_data->value.string_value.chars, value2_data->value.string_value.chars) == 0);
Azure.IoT Build 0:6ae2f7bca550 2090 break;
Azure.IoT Build 0:6ae2f7bca550 2091
Azure.IoT Build 0:6ae2f7bca550 2092 case AMQP_TYPE_SYMBOL:
Azure.IoT Build 0:6ae2f7bca550 2093 /* Codes_SRS_AMQPVALUE_01_263: [- symbol: compare all symbol characters.] */
Azure.IoT Build 0:6ae2f7bca550 2094 result = (strcmp(value1_data->value.symbol_value.chars, value2_data->value.symbol_value.chars) == 0);
Azure.IoT Build 0:6ae2f7bca550 2095 break;
Azure.IoT Build 0:6ae2f7bca550 2096
Azure.IoT Build 0:6ae2f7bca550 2097 case AMQP_TYPE_LIST:
Azure.IoT Build 0:6ae2f7bca550 2098 {
Azure.IoT Build 0:6ae2f7bca550 2099 /* Codes_SRS_AMQPVALUE_01_231: [- list: compare list item count and each element.] */
Azure.IoT Build 0:6ae2f7bca550 2100 if (value1_data->value.list_value.count != value2_data->value.list_value.count)
Azure.IoT Build 0:6ae2f7bca550 2101 {
Azure.IoT Build 0:6ae2f7bca550 2102 result = false;
Azure.IoT Build 0:6ae2f7bca550 2103 }
Azure.IoT Build 0:6ae2f7bca550 2104 else
Azure.IoT Build 0:6ae2f7bca550 2105 {
Azure.IoT Build 0:6ae2f7bca550 2106 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 2107
Azure.IoT Build 0:6ae2f7bca550 2108 for (i = 0; i < value1_data->value.list_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 2109 {
Azure.IoT Build 0:6ae2f7bca550 2110 /* Codes_SRS_AMQPVALUE_01_232: [Nesting shall be considered in comparison.] */
Azure.IoT Build 0:6ae2f7bca550 2111 if (!amqpvalue_are_equal(value1_data->value.list_value.items[i], value2_data->value.list_value.items[i]))
Azure.IoT Build 0:6ae2f7bca550 2112 {
Azure.IoT Build 0:6ae2f7bca550 2113 break;
Azure.IoT Build 0:6ae2f7bca550 2114 }
Azure.IoT Build 0:6ae2f7bca550 2115 }
Azure.IoT Build 0:6ae2f7bca550 2116
Azure.IoT Build 0:6ae2f7bca550 2117 result = (i == value1_data->value.list_value.count);
Azure.IoT Build 0:6ae2f7bca550 2118 }
Azure.IoT Build 0:6ae2f7bca550 2119
Azure.IoT Build 0:6ae2f7bca550 2120 break;
Azure.IoT Build 0:6ae2f7bca550 2121 }
Azure.IoT Build 0:6ae2f7bca550 2122 case AMQP_TYPE_MAP:
Azure.IoT Build 0:6ae2f7bca550 2123 {
Azure.IoT Build 0:6ae2f7bca550 2124 /* Codes_SRS_AMQPVALUE_01_233: [- map: compare map pair count and each key/value pair.] */
Azure.IoT Build 0:6ae2f7bca550 2125 if (value1_data->value.map_value.pair_count != value2_data->value.map_value.pair_count)
Azure.IoT Build 0:6ae2f7bca550 2126 {
Azure.IoT Build 0:6ae2f7bca550 2127 result = false;
Azure.IoT Build 0:6ae2f7bca550 2128 }
Azure.IoT Build 0:6ae2f7bca550 2129 else
Azure.IoT Build 0:6ae2f7bca550 2130 {
Azure.IoT Build 0:6ae2f7bca550 2131 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 2132
Azure.IoT Build 0:6ae2f7bca550 2133 /* Codes_SRS_AMQPVALUE_01_126: [Unless known to be otherwise, maps MUST be considered to be ordered, that is, the order of the key-value pairs is semantically important and two maps which are different only in the order in which their key-value pairs are encoded are not equal.] */
Azure.IoT Build 0:6ae2f7bca550 2134 for (i = 0; i < value1_data->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 2135 {
Azure.IoT Build 0:6ae2f7bca550 2136 /* Codes_SRS_AMQPVALUE_01_234: [Nesting shall be considered in comparison.] */
Azure.IoT Build 0:6ae2f7bca550 2137 if ((!amqpvalue_are_equal(value1_data->value.map_value.pairs[i].key, value2_data->value.map_value.pairs[i].key)) ||
Azure.IoT Build 0:6ae2f7bca550 2138 (!amqpvalue_are_equal(value1_data->value.map_value.pairs[i].value, value2_data->value.map_value.pairs[i].value)))
Azure.IoT Build 0:6ae2f7bca550 2139 {
Azure.IoT Build 0:6ae2f7bca550 2140 break;
Azure.IoT Build 0:6ae2f7bca550 2141 }
Azure.IoT Build 0:6ae2f7bca550 2142 }
Azure.IoT Build 0:6ae2f7bca550 2143
Azure.IoT Build 0:6ae2f7bca550 2144 result = (i == value1_data->value.map_value.pair_count);
Azure.IoT Build 0:6ae2f7bca550 2145 }
Azure.IoT Build 0:6ae2f7bca550 2146
Azure.IoT Build 0:6ae2f7bca550 2147 break;
Azure.IoT Build 0:6ae2f7bca550 2148 }
Azure.IoT Build 0:6ae2f7bca550 2149 }
Azure.IoT Build 0:6ae2f7bca550 2150 }
Azure.IoT Build 0:6ae2f7bca550 2151 }
Azure.IoT Build 0:6ae2f7bca550 2152
Azure.IoT Build 0:6ae2f7bca550 2153 return result;
Azure.IoT Build 0:6ae2f7bca550 2154 }
Azure.IoT Build 0:6ae2f7bca550 2155
Azure.IoT Build 0:6ae2f7bca550 2156 AMQP_VALUE amqpvalue_clone(AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 2157 {
Azure.IoT Build 0:6ae2f7bca550 2158 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 2159
Azure.IoT Build 0:6ae2f7bca550 2160 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 2161 {
AzureIoTClient 23:1111ee8bcba4 2162 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 2163 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2164 }
Azure.IoT Build 0:6ae2f7bca550 2165 else
Azure.IoT Build 0:6ae2f7bca550 2166 {
Azure.IoT Build 0:6ae2f7bca550 2167 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 2168 switch (value_data->type)
Azure.IoT Build 0:6ae2f7bca550 2169 {
Azure.IoT Build 0:6ae2f7bca550 2170 default:
AzureIoTClient 23:1111ee8bcba4 2171 LogError("Invalid data type: %d", (int)value_data->type);
AzureIoTClient 23:1111ee8bcba4 2172 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2173 break;
Azure.IoT Build 0:6ae2f7bca550 2174
Azure.IoT Build 0:6ae2f7bca550 2175 case AMQP_TYPE_NULL:
Azure.IoT Build 0:6ae2f7bca550 2176 /* Codes_SRS_AMQPVALUE_01_237: [null] */
Azure.IoT Build 0:6ae2f7bca550 2177 result = amqpvalue_create_null();
Azure.IoT Build 0:6ae2f7bca550 2178 break;
Azure.IoT Build 0:6ae2f7bca550 2179
Azure.IoT Build 0:6ae2f7bca550 2180 case AMQP_TYPE_BOOL:
Azure.IoT Build 0:6ae2f7bca550 2181 /* Codes_SRS_AMQPVALUE_01_238: [boolean] */
Azure.IoT Build 0:6ae2f7bca550 2182 result = amqpvalue_create_boolean(value_data->value.bool_value);
Azure.IoT Build 0:6ae2f7bca550 2183 break;
Azure.IoT Build 0:6ae2f7bca550 2184
Azure.IoT Build 0:6ae2f7bca550 2185 case AMQP_TYPE_UBYTE:
Azure.IoT Build 0:6ae2f7bca550 2186 /* Codes_SRS_AMQPVALUE_01_239: [ubyte] */
Azure.IoT Build 0:6ae2f7bca550 2187 result = amqpvalue_create_ubyte(value_data->value.ubyte_value);
Azure.IoT Build 0:6ae2f7bca550 2188 break;
Azure.IoT Build 0:6ae2f7bca550 2189
Azure.IoT Build 0:6ae2f7bca550 2190 case AMQP_TYPE_USHORT:
Azure.IoT Build 0:6ae2f7bca550 2191 /* Codes_SRS_AMQPVALUE_01_240: [ushort] */
Azure.IoT Build 0:6ae2f7bca550 2192 result = amqpvalue_create_ushort(value_data->value.ushort_value);
Azure.IoT Build 0:6ae2f7bca550 2193 break;
Azure.IoT Build 0:6ae2f7bca550 2194
Azure.IoT Build 0:6ae2f7bca550 2195 case AMQP_TYPE_UINT:
Azure.IoT Build 0:6ae2f7bca550 2196 /* Codes_SRS_AMQPVALUE_01_241: [uint] */
Azure.IoT Build 0:6ae2f7bca550 2197 result = amqpvalue_create_uint(value_data->value.uint_value);
Azure.IoT Build 0:6ae2f7bca550 2198 break;
Azure.IoT Build 0:6ae2f7bca550 2199
Azure.IoT Build 0:6ae2f7bca550 2200 case AMQP_TYPE_ULONG:
Azure.IoT Build 0:6ae2f7bca550 2201 /* Codes_SRS_AMQPVALUE_01_242: [ulong] */
Azure.IoT Build 0:6ae2f7bca550 2202 result = amqpvalue_create_ulong(value_data->value.ulong_value);
Azure.IoT Build 0:6ae2f7bca550 2203 break;
Azure.IoT Build 0:6ae2f7bca550 2204
Azure.IoT Build 0:6ae2f7bca550 2205 case AMQP_TYPE_BYTE:
Azure.IoT Build 0:6ae2f7bca550 2206 /* Codes_SRS_AMQPVALUE_01_243: [byte] */
Azure.IoT Build 0:6ae2f7bca550 2207 result = amqpvalue_create_byte(value_data->value.byte_value);
Azure.IoT Build 0:6ae2f7bca550 2208 break;
Azure.IoT Build 0:6ae2f7bca550 2209
Azure.IoT Build 0:6ae2f7bca550 2210 case AMQP_TYPE_SHORT:
Azure.IoT Build 0:6ae2f7bca550 2211 /* Codes_SRS_AMQPVALUE_01_244: [short] */
Azure.IoT Build 0:6ae2f7bca550 2212 result = amqpvalue_create_short(value_data->value.short_value);
Azure.IoT Build 0:6ae2f7bca550 2213 break;
Azure.IoT Build 0:6ae2f7bca550 2214
Azure.IoT Build 0:6ae2f7bca550 2215 case AMQP_TYPE_INT:
Azure.IoT Build 0:6ae2f7bca550 2216 /* Codes_SRS_AMQPVALUE_01_245: [int] */
Azure.IoT Build 0:6ae2f7bca550 2217 result = amqpvalue_create_int(value_data->value.int_value);
Azure.IoT Build 0:6ae2f7bca550 2218 break;
Azure.IoT Build 0:6ae2f7bca550 2219
Azure.IoT Build 0:6ae2f7bca550 2220 case AMQP_TYPE_LONG:
Azure.IoT Build 0:6ae2f7bca550 2221 /* Codes_SRS_AMQPVALUE_01_246: [long] */
Azure.IoT Build 0:6ae2f7bca550 2222 result = amqpvalue_create_long(value_data->value.long_value);
Azure.IoT Build 0:6ae2f7bca550 2223 break;
Azure.IoT Build 0:6ae2f7bca550 2224
Azure.IoT Build 0:6ae2f7bca550 2225 case AMQP_TYPE_FLOAT:
Azure.IoT Build 0:6ae2f7bca550 2226 /* Codes_SRS_AMQPVALUE_01_247: [float] */
Azure.IoT Build 0:6ae2f7bca550 2227 result = amqpvalue_create_float(value_data->value.float_value);
Azure.IoT Build 0:6ae2f7bca550 2228 break;
Azure.IoT Build 0:6ae2f7bca550 2229
Azure.IoT Build 0:6ae2f7bca550 2230 case AMQP_TYPE_DOUBLE:
Azure.IoT Build 0:6ae2f7bca550 2231 /* Codes_SRS_AMQPVALUE_01_248: [double] */
Azure.IoT Build 0:6ae2f7bca550 2232 result = amqpvalue_create_double(value_data->value.double_value);
Azure.IoT Build 0:6ae2f7bca550 2233 break;
Azure.IoT Build 0:6ae2f7bca550 2234
Azure.IoT Build 0:6ae2f7bca550 2235 case AMQP_TYPE_CHAR:
Azure.IoT Build 0:6ae2f7bca550 2236 /* Codes_SRS_AMQPVALUE_01_252: [char] */
Azure.IoT Build 0:6ae2f7bca550 2237 result = amqpvalue_create_char(value_data->value.char_value);
Azure.IoT Build 0:6ae2f7bca550 2238 break;
Azure.IoT Build 0:6ae2f7bca550 2239
Azure.IoT Build 0:6ae2f7bca550 2240 case AMQP_TYPE_TIMESTAMP:
Azure.IoT Build 0:6ae2f7bca550 2241 /* Codes_SRS_AMQPVALUE_01_253: [timestamp] */
Azure.IoT Build 0:6ae2f7bca550 2242 result = amqpvalue_create_timestamp(value_data->value.timestamp_value);
Azure.IoT Build 0:6ae2f7bca550 2243 break;
Azure.IoT Build 0:6ae2f7bca550 2244
Azure.IoT Build 0:6ae2f7bca550 2245 case AMQP_TYPE_UUID:
Azure.IoT Build 0:6ae2f7bca550 2246 /* Codes_SRS_AMQPVALUE_01_254: [uuid] */
Azure.IoT Build 0:6ae2f7bca550 2247 result = amqpvalue_create_uuid(value_data->value.uuid_value);
Azure.IoT Build 0:6ae2f7bca550 2248 break;
Azure.IoT Build 0:6ae2f7bca550 2249
Azure.IoT Build 0:6ae2f7bca550 2250 case AMQP_TYPE_BINARY:
Azure.IoT Build 0:6ae2f7bca550 2251 /* Codes_SRS_AMQPVALUE_01_255: [binary] */
Azure.IoT Build 0:6ae2f7bca550 2252 result = amqpvalue_create_binary(value_data->value.binary_value);
Azure.IoT Build 0:6ae2f7bca550 2253 break;
Azure.IoT Build 0:6ae2f7bca550 2254
Azure.IoT Build 0:6ae2f7bca550 2255 case AMQP_TYPE_STRING:
Azure.IoT Build 0:6ae2f7bca550 2256 /* Codes_SRS_AMQPVALUE_01_256: [string] */
Azure.IoT Build 0:6ae2f7bca550 2257 result = amqpvalue_create_string(value_data->value.string_value.chars);
Azure.IoT Build 0:6ae2f7bca550 2258 break;
Azure.IoT Build 0:6ae2f7bca550 2259
Azure.IoT Build 0:6ae2f7bca550 2260 case AMQP_TYPE_SYMBOL:
Azure.IoT Build 0:6ae2f7bca550 2261 /* Codes_SRS_AMQPVALUE_01_257: [symbol] */
Azure.IoT Build 0:6ae2f7bca550 2262 result = amqpvalue_create_symbol(value_data->value.symbol_value.chars);
Azure.IoT Build 0:6ae2f7bca550 2263 break;
Azure.IoT Build 0:6ae2f7bca550 2264
Azure.IoT Build 0:6ae2f7bca550 2265 case AMQP_TYPE_LIST:
Azure.IoT Build 0:6ae2f7bca550 2266 {
Azure.IoT Build 0:6ae2f7bca550 2267 /* Codes_SRS_AMQPVALUE_01_258: [list] */
Azure.IoT Build 0:6ae2f7bca550 2268 uint32_t i;
AzureIoTClient 23:1111ee8bcba4 2269 AMQP_VALUE_DATA* result_data = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 2270 if (result_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 2271 {
Azure.IoT Build 0:6ae2f7bca550 2272 /* Codes_SRS_AMQPVALUE_01_236: [If creating the cloned value fails, amqpvalue_clone shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 2273 LogError("Cannot allocate memory for cloned value");
AzureIoTClient 23:1111ee8bcba4 2274 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2275 }
Azure.IoT Build 0:6ae2f7bca550 2276 else
Azure.IoT Build 0:6ae2f7bca550 2277 {
Azure.IoT Build 0:6ae2f7bca550 2278 result_data->type = AMQP_TYPE_LIST;
Azure.IoT Build 0:6ae2f7bca550 2279 result_data->value.list_value.count = value_data->value.list_value.count;
Azure.IoT Build 0:6ae2f7bca550 2280
Azure.IoT Build 0:6ae2f7bca550 2281 if (value_data->value.list_value.count > 0)
Azure.IoT Build 0:6ae2f7bca550 2282 {
AzureIoTClient 21:f9c433d8e6ca 2283 result_data->value.list_value.items = (AMQP_VALUE*)malloc(value_data->value.list_value.count * sizeof(AMQP_VALUE));
Azure.IoT Build 0:6ae2f7bca550 2284 if (result_data->value.list_value.items == NULL)
Azure.IoT Build 0:6ae2f7bca550 2285 {
Azure.IoT Build 0:6ae2f7bca550 2286 /* Codes_SRS_AMQPVALUE_01_236: [If creating the cloned value fails, amqpvalue_clone shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 2287 LogError("Cannot allocate memory for cloned list");
AzureIoTClient 23:1111ee8bcba4 2288 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2289 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2290 }
Azure.IoT Build 0:6ae2f7bca550 2291 else
Azure.IoT Build 0:6ae2f7bca550 2292 {
Azure.IoT Build 0:6ae2f7bca550 2293 for (i = 0; i < value_data->value.list_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 2294 {
Azure.IoT Build 0:6ae2f7bca550 2295 result_data->value.list_value.items[i] = amqpvalue_clone(value_data->value.list_value.items[i]);
Azure.IoT Build 0:6ae2f7bca550 2296 if (result_data->value.list_value.items[i] == NULL)
Azure.IoT Build 0:6ae2f7bca550 2297 {
AzureIoTClient 23:1111ee8bcba4 2298 LogError("Cannot clone list item %u", (unsigned int)i);
AzureIoTClient 23:1111ee8bcba4 2299 break;
Azure.IoT Build 0:6ae2f7bca550 2300 }
Azure.IoT Build 0:6ae2f7bca550 2301 }
Azure.IoT Build 0:6ae2f7bca550 2302
Azure.IoT Build 0:6ae2f7bca550 2303 if (i < value_data->value.list_value.count)
Azure.IoT Build 0:6ae2f7bca550 2304 {
Azure.IoT Build 0:6ae2f7bca550 2305 uint32_t j;
Azure.IoT Build 0:6ae2f7bca550 2306
Azure.IoT Build 0:6ae2f7bca550 2307 /* Codes_SRS_AMQPVALUE_01_236: [If creating the cloned value fails, amqpvalue_clone shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 2308 /* destroy all the allocated values to return to the initial state */
Azure.IoT Build 0:6ae2f7bca550 2309 for (j = 0; j < i; j++)
Azure.IoT Build 0:6ae2f7bca550 2310 {
Azure.IoT Build 0:6ae2f7bca550 2311 amqpvalue_destroy(result_data->value.list_value.items[j]);
Azure.IoT Build 0:6ae2f7bca550 2312 }
Azure.IoT Build 0:6ae2f7bca550 2313
AzureIoTClient 21:f9c433d8e6ca 2314 free(result_data->value.list_value.items);
AzureIoTClient 21:f9c433d8e6ca 2315 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2316 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2317 }
Azure.IoT Build 0:6ae2f7bca550 2318 else
Azure.IoT Build 0:6ae2f7bca550 2319 {
Azure.IoT Build 0:6ae2f7bca550 2320 result = result_data;
Azure.IoT Build 0:6ae2f7bca550 2321 }
Azure.IoT Build 0:6ae2f7bca550 2322 }
Azure.IoT Build 0:6ae2f7bca550 2323 }
Azure.IoT Build 0:6ae2f7bca550 2324 else
Azure.IoT Build 0:6ae2f7bca550 2325 {
Azure.IoT Build 0:6ae2f7bca550 2326 result_data->value.list_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 2327 result = result_data;
Azure.IoT Build 0:6ae2f7bca550 2328 }
Azure.IoT Build 0:6ae2f7bca550 2329 }
Azure.IoT Build 0:6ae2f7bca550 2330
Azure.IoT Build 0:6ae2f7bca550 2331 break;
Azure.IoT Build 0:6ae2f7bca550 2332 }
Azure.IoT Build 0:6ae2f7bca550 2333 case AMQP_TYPE_MAP:
Azure.IoT Build 0:6ae2f7bca550 2334 {
Azure.IoT Build 0:6ae2f7bca550 2335 /* Codes_SRS_AMQPVALUE_01_259: [map] */
Azure.IoT Build 0:6ae2f7bca550 2336 uint32_t i;
AzureIoTClient 23:1111ee8bcba4 2337 AMQP_VALUE_DATA* result_data = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 2338 if (result_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 2339 {
Azure.IoT Build 0:6ae2f7bca550 2340 /* Codes_SRS_AMQPVALUE_01_236: [If creating the cloned value fails, amqpvalue_clone shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 2341 LogError("Cannot allocate memory for cloned map");
AzureIoTClient 23:1111ee8bcba4 2342 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2343 }
Azure.IoT Build 0:6ae2f7bca550 2344 else
Azure.IoT Build 0:6ae2f7bca550 2345 {
Azure.IoT Build 0:6ae2f7bca550 2346 result_data->type = AMQP_TYPE_MAP;
Azure.IoT Build 0:6ae2f7bca550 2347 result_data->value.map_value.pair_count = value_data->value.map_value.pair_count;
Azure.IoT Build 0:6ae2f7bca550 2348
Azure.IoT Build 0:6ae2f7bca550 2349 if (result_data->value.map_value.pair_count > 0)
Azure.IoT Build 0:6ae2f7bca550 2350 {
AzureIoTClient 21:f9c433d8e6ca 2351 result_data->value.map_value.pairs = (AMQP_MAP_KEY_VALUE_PAIR*)malloc(value_data->value.map_value.pair_count * sizeof(AMQP_MAP_KEY_VALUE_PAIR));
Azure.IoT Build 0:6ae2f7bca550 2352 if (result_data->value.map_value.pairs == NULL)
Azure.IoT Build 0:6ae2f7bca550 2353 {
Azure.IoT Build 0:6ae2f7bca550 2354 /* Codes_SRS_AMQPVALUE_01_236: [If creating the cloned value fails, amqpvalue_clone shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 2355 LogError("Cannot allocate memory for cloned map storage");
AzureIoTClient 21:f9c433d8e6ca 2356 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2357 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2358 }
Azure.IoT Build 0:6ae2f7bca550 2359 else
Azure.IoT Build 0:6ae2f7bca550 2360 {
Azure.IoT Build 0:6ae2f7bca550 2361 for (i = 0; i < value_data->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 2362 {
Azure.IoT Build 0:6ae2f7bca550 2363 result_data->value.map_value.pairs[i].key = amqpvalue_clone(value_data->value.map_value.pairs[i].key);
Azure.IoT Build 0:6ae2f7bca550 2364 if (result_data->value.map_value.pairs[i].key == NULL)
Azure.IoT Build 0:6ae2f7bca550 2365 {
AzureIoTClient 23:1111ee8bcba4 2366 LogError("Cannot clone map key index %u", (unsigned int)i);
AzureIoTClient 23:1111ee8bcba4 2367 break;
Azure.IoT Build 0:6ae2f7bca550 2368 }
Azure.IoT Build 0:6ae2f7bca550 2369
Azure.IoT Build 0:6ae2f7bca550 2370 result_data->value.map_value.pairs[i].value = amqpvalue_clone(value_data->value.map_value.pairs[i].value);
Azure.IoT Build 0:6ae2f7bca550 2371 if (result_data->value.map_value.pairs[i].value == NULL)
Azure.IoT Build 0:6ae2f7bca550 2372 {
AzureIoTClient 23:1111ee8bcba4 2373 LogError("Cannot clone map value index %u", (unsigned int)i);
AzureIoTClient 23:1111ee8bcba4 2374 amqpvalue_destroy(result_data->value.map_value.pairs[i].key);
Azure.IoT Build 0:6ae2f7bca550 2375 break;
Azure.IoT Build 0:6ae2f7bca550 2376 }
Azure.IoT Build 0:6ae2f7bca550 2377 }
Azure.IoT Build 0:6ae2f7bca550 2378
Azure.IoT Build 0:6ae2f7bca550 2379 if (i < value_data->value.map_value.pair_count)
Azure.IoT Build 0:6ae2f7bca550 2380 {
Azure.IoT Build 0:6ae2f7bca550 2381 /* Codes_SRS_AMQPVALUE_01_236: [If creating the cloned value fails, amqpvalue_clone shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 2382 uint32_t j;
Azure.IoT Build 0:6ae2f7bca550 2383
Azure.IoT Build 0:6ae2f7bca550 2384 for (j = 0; j < i; j++)
Azure.IoT Build 0:6ae2f7bca550 2385 {
Azure.IoT Build 0:6ae2f7bca550 2386 amqpvalue_destroy(result_data->value.map_value.pairs[j].key);
Azure.IoT Build 0:6ae2f7bca550 2387 amqpvalue_destroy(result_data->value.map_value.pairs[j].value);
Azure.IoT Build 0:6ae2f7bca550 2388 }
Azure.IoT Build 0:6ae2f7bca550 2389
AzureIoTClient 21:f9c433d8e6ca 2390 free(result_data->value.map_value.pairs);
AzureIoTClient 21:f9c433d8e6ca 2391 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2392 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2393 }
Azure.IoT Build 0:6ae2f7bca550 2394 else
Azure.IoT Build 0:6ae2f7bca550 2395 {
Azure.IoT Build 0:6ae2f7bca550 2396 result = (AMQP_VALUE)result_data;
Azure.IoT Build 0:6ae2f7bca550 2397 }
Azure.IoT Build 0:6ae2f7bca550 2398 }
Azure.IoT Build 0:6ae2f7bca550 2399 }
Azure.IoT Build 0:6ae2f7bca550 2400 else
Azure.IoT Build 0:6ae2f7bca550 2401 {
Azure.IoT Build 0:6ae2f7bca550 2402 result_data->value.map_value.pairs = NULL;
Azure.IoT Build 0:6ae2f7bca550 2403 result = (AMQP_VALUE)result_data;
Azure.IoT Build 0:6ae2f7bca550 2404 }
Azure.IoT Build 0:6ae2f7bca550 2405 }
Azure.IoT Build 0:6ae2f7bca550 2406
Azure.IoT Build 0:6ae2f7bca550 2407 break;
Azure.IoT Build 0:6ae2f7bca550 2408 }
Azure.IoT Build 0:6ae2f7bca550 2409 case AMQP_TYPE_ARRAY:
Azure.IoT Build 0:6ae2f7bca550 2410 {
Azure.IoT Build 0:6ae2f7bca550 2411 uint32_t i;
AzureIoTClient 23:1111ee8bcba4 2412 AMQP_VALUE_DATA* result_data = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 2413 if (result_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 2414 {
AzureIoTClient 23:1111ee8bcba4 2415 LogError("Cannot allocate memory for cloned array");
AzureIoTClient 23:1111ee8bcba4 2416 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2417 }
Azure.IoT Build 0:6ae2f7bca550 2418 else
Azure.IoT Build 0:6ae2f7bca550 2419 {
Azure.IoT Build 0:6ae2f7bca550 2420 result_data->type = AMQP_TYPE_ARRAY;
Azure.IoT Build 0:6ae2f7bca550 2421 result_data->value.array_value.count = value_data->value.array_value.count;
Azure.IoT Build 0:6ae2f7bca550 2422
Azure.IoT Build 0:6ae2f7bca550 2423 if (value_data->value.array_value.count > 0)
Azure.IoT Build 0:6ae2f7bca550 2424 {
AzureIoTClient 21:f9c433d8e6ca 2425 result_data->value.array_value.items = (AMQP_VALUE*)malloc(value_data->value.array_value.count * sizeof(AMQP_VALUE));
Azure.IoT Build 0:6ae2f7bca550 2426 if (result_data->value.array_value.items == NULL)
Azure.IoT Build 0:6ae2f7bca550 2427 {
AzureIoTClient 23:1111ee8bcba4 2428 LogError("Cannot allocate memory for cloned array storage");
AzureIoTClient 23:1111ee8bcba4 2429 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2430 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2431 }
Azure.IoT Build 0:6ae2f7bca550 2432 else
Azure.IoT Build 0:6ae2f7bca550 2433 {
Azure.IoT Build 0:6ae2f7bca550 2434 for (i = 0; i < value_data->value.array_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 2435 {
Azure.IoT Build 0:6ae2f7bca550 2436 result_data->value.array_value.items[i] = amqpvalue_clone(value_data->value.array_value.items[i]);
Azure.IoT Build 0:6ae2f7bca550 2437 if (result_data->value.array_value.items[i] == NULL)
Azure.IoT Build 0:6ae2f7bca550 2438 {
AzureIoTClient 23:1111ee8bcba4 2439 LogError("Cannot allocate memory for cloned array item %u", (unsigned int)i);
AzureIoTClient 23:1111ee8bcba4 2440 break;
Azure.IoT Build 0:6ae2f7bca550 2441 }
Azure.IoT Build 0:6ae2f7bca550 2442 }
Azure.IoT Build 0:6ae2f7bca550 2443
Azure.IoT Build 0:6ae2f7bca550 2444 if (i < value_data->value.array_value.count)
Azure.IoT Build 0:6ae2f7bca550 2445 {
Azure.IoT Build 0:6ae2f7bca550 2446 uint32_t j;
Azure.IoT Build 0:6ae2f7bca550 2447
Azure.IoT Build 0:6ae2f7bca550 2448 for (j = 0; j < i; j++)
Azure.IoT Build 0:6ae2f7bca550 2449 {
Azure.IoT Build 0:6ae2f7bca550 2450 amqpvalue_destroy(result_data->value.array_value.items[j]);
Azure.IoT Build 0:6ae2f7bca550 2451 }
Azure.IoT Build 0:6ae2f7bca550 2452
AzureIoTClient 21:f9c433d8e6ca 2453 free(result_data->value.array_value.items);
AzureIoTClient 21:f9c433d8e6ca 2454 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2455 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2456 }
Azure.IoT Build 0:6ae2f7bca550 2457 else
Azure.IoT Build 0:6ae2f7bca550 2458 {
Azure.IoT Build 0:6ae2f7bca550 2459 result = result_data;
Azure.IoT Build 0:6ae2f7bca550 2460 }
Azure.IoT Build 0:6ae2f7bca550 2461 }
Azure.IoT Build 0:6ae2f7bca550 2462 }
Azure.IoT Build 0:6ae2f7bca550 2463 else
Azure.IoT Build 0:6ae2f7bca550 2464 {
Azure.IoT Build 0:6ae2f7bca550 2465 result_data->value.array_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 2466 result = result_data;
Azure.IoT Build 0:6ae2f7bca550 2467 }
Azure.IoT Build 0:6ae2f7bca550 2468 }
Azure.IoT Build 0:6ae2f7bca550 2469
Azure.IoT Build 0:6ae2f7bca550 2470 break;
Azure.IoT Build 0:6ae2f7bca550 2471 }
Azure.IoT Build 0:6ae2f7bca550 2472 case AMQP_TYPE_DESCRIBED:
Azure.IoT Build 0:6ae2f7bca550 2473 result = amqpvalue_create_described(amqpvalue_clone(value_data->value.described_value.descriptor), amqpvalue_clone(value_data->value.described_value.value));
Azure.IoT Build 0:6ae2f7bca550 2474 break;
Azure.IoT Build 0:6ae2f7bca550 2475
Azure.IoT Build 0:6ae2f7bca550 2476 case AMQP_TYPE_COMPOSITE:
Azure.IoT Build 0:6ae2f7bca550 2477 {
AzureIoTClient 21:f9c433d8e6ca 2478 AMQP_VALUE_DATA* result_data = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 2479 AMQP_VALUE cloned_descriptor;
Azure.IoT Build 0:6ae2f7bca550 2480 AMQP_VALUE cloned_list;
Azure.IoT Build 0:6ae2f7bca550 2481
Azure.IoT Build 0:6ae2f7bca550 2482 if (result_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 2483 {
AzureIoTClient 23:1111ee8bcba4 2484 LogError("Cannot allocate memory for cloned composite value");
AzureIoTClient 23:1111ee8bcba4 2485 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2486 }
Azure.IoT Build 0:6ae2f7bca550 2487 else if ((cloned_descriptor = amqpvalue_clone(value_data->value.described_value.descriptor)) == NULL)
Azure.IoT Build 0:6ae2f7bca550 2488 {
AzureIoTClient 23:1111ee8bcba4 2489 LogError("Cannot clone descriptor");
AzureIoTClient 23:1111ee8bcba4 2490 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2491 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2492 }
Azure.IoT Build 0:6ae2f7bca550 2493 else if ((cloned_list = amqpvalue_clone(value_data->value.described_value.value)) == NULL)
Azure.IoT Build 0:6ae2f7bca550 2494 {
AzureIoTClient 23:1111ee8bcba4 2495 LogError("Cannot clone described value");
AzureIoTClient 23:1111ee8bcba4 2496 amqpvalue_destroy(cloned_descriptor);
AzureIoTClient 21:f9c433d8e6ca 2497 free(result_data);
Azure.IoT Build 0:6ae2f7bca550 2498 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 2499 }
Azure.IoT Build 0:6ae2f7bca550 2500 else
Azure.IoT Build 0:6ae2f7bca550 2501 {
Azure.IoT Build 0:6ae2f7bca550 2502 result_data->value.described_value.descriptor = cloned_descriptor;
Azure.IoT Build 0:6ae2f7bca550 2503 result_data->value.described_value.value = cloned_list;
Azure.IoT Build 0:6ae2f7bca550 2504 result_data->type = AMQP_TYPE_COMPOSITE;
Azure.IoT Build 0:6ae2f7bca550 2505
Azure.IoT Build 0:6ae2f7bca550 2506 result = (AMQP_VALUE)result_data;
Azure.IoT Build 0:6ae2f7bca550 2507 }
Azure.IoT Build 0:6ae2f7bca550 2508 break;
Azure.IoT Build 0:6ae2f7bca550 2509 }
Azure.IoT Build 0:6ae2f7bca550 2510 }
Azure.IoT Build 0:6ae2f7bca550 2511 }
Azure.IoT Build 0:6ae2f7bca550 2512
Azure.IoT Build 0:6ae2f7bca550 2513 /* Codes_SRS_AMQPVALUE_01_235: [amqpvalue_clone shall clone the value passed as argument and return a new non-NULL handle to the cloned AMQP value.] */
Azure.IoT Build 0:6ae2f7bca550 2514 return result;
Azure.IoT Build 0:6ae2f7bca550 2515 }
Azure.IoT Build 0:6ae2f7bca550 2516
Azure.IoT Build 0:6ae2f7bca550 2517 AMQP_TYPE amqpvalue_get_type(AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 2518 {
Azure.IoT Build 0:6ae2f7bca550 2519 AMQP_VALUE_DATA* amqpvalue_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 2520 return amqpvalue_data->type;
Azure.IoT Build 0:6ae2f7bca550 2521 }
Azure.IoT Build 0:6ae2f7bca550 2522
Azure.IoT Build 0:6ae2f7bca550 2523 static int output_byte(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, unsigned char b)
Azure.IoT Build 0:6ae2f7bca550 2524 {
Azure.IoT Build 0:6ae2f7bca550 2525 int result;
Azure.IoT Build 0:6ae2f7bca550 2526
Azure.IoT Build 0:6ae2f7bca550 2527 if (encoder_output != NULL)
Azure.IoT Build 0:6ae2f7bca550 2528 {
Azure.IoT Build 0:6ae2f7bca550 2529 /* Codes_SRS_AMQPVALUE_01_267: [amqpvalue_encode shall pass the encoded bytes to the encoder_output function.] */
Azure.IoT Build 0:6ae2f7bca550 2530 /* Codes_SRS_AMQPVALUE_01_268: [On each call to the encoder_output function, amqpvalue_encode shall also pass the context argument.] */
Azure.IoT Build 0:6ae2f7bca550 2531 result = encoder_output(context, &b, 1);
Azure.IoT Build 0:6ae2f7bca550 2532 }
Azure.IoT Build 0:6ae2f7bca550 2533 else
Azure.IoT Build 0:6ae2f7bca550 2534 {
Azure.IoT Build 0:6ae2f7bca550 2535 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2536 }
Azure.IoT Build 0:6ae2f7bca550 2537
Azure.IoT Build 0:6ae2f7bca550 2538 return result;
Azure.IoT Build 0:6ae2f7bca550 2539 }
Azure.IoT Build 0:6ae2f7bca550 2540
Azure.IoT Build 0:6ae2f7bca550 2541 static int output_bytes(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, const void* bytes, size_t length)
Azure.IoT Build 0:6ae2f7bca550 2542 {
Azure.IoT Build 0:6ae2f7bca550 2543 int result;
Azure.IoT Build 0:6ae2f7bca550 2544
Azure.IoT Build 0:6ae2f7bca550 2545 if (encoder_output != NULL)
Azure.IoT Build 0:6ae2f7bca550 2546 {
Azure.IoT Build 0:6ae2f7bca550 2547 /* Codes_SRS_AMQPVALUE_01_267: [amqpvalue_encode shall pass the encoded bytes to the encoder_output function.] */
Azure.IoT Build 0:6ae2f7bca550 2548 /* Codes_SRS_AMQPVALUE_01_268: [On each call to the encoder_output function, amqpvalue_encode shall also pass the context argument.] */
AzureIoTClient 23:1111ee8bcba4 2549 result = encoder_output(context, (const unsigned char*)bytes, length);
Azure.IoT Build 0:6ae2f7bca550 2550 }
Azure.IoT Build 0:6ae2f7bca550 2551 else
Azure.IoT Build 0:6ae2f7bca550 2552 {
Azure.IoT Build 0:6ae2f7bca550 2553 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2554 }
Azure.IoT Build 0:6ae2f7bca550 2555
Azure.IoT Build 0:6ae2f7bca550 2556 return result;
Azure.IoT Build 0:6ae2f7bca550 2557 }
Azure.IoT Build 0:6ae2f7bca550 2558
Azure.IoT Build 0:6ae2f7bca550 2559 static int encode_boolean(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, bool value)
Azure.IoT Build 0:6ae2f7bca550 2560 {
Azure.IoT Build 0:6ae2f7bca550 2561 int result;
Azure.IoT Build 0:6ae2f7bca550 2562
Azure.IoT Build 0:6ae2f7bca550 2563 if (value == false)
Azure.IoT Build 0:6ae2f7bca550 2564 {
Azure.IoT Build 0:6ae2f7bca550 2565 /* Codes_SRS_AMQPVALUE_01_273: [<encoding name="false" code="0x42" category="fixed" width="0" label="the boolean value false"/>] */
Azure.IoT Build 0:6ae2f7bca550 2566 if (output_byte(encoder_output, context, 0x42) != 0)
Azure.IoT Build 0:6ae2f7bca550 2567 {
Azure.IoT Build 0:6ae2f7bca550 2568 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2569 LogError("Failed encoding boolean");
AzureIoTClient 23:1111ee8bcba4 2570 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2571 }
Azure.IoT Build 0:6ae2f7bca550 2572 else
Azure.IoT Build 0:6ae2f7bca550 2573 {
Azure.IoT Build 0:6ae2f7bca550 2574 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2575 }
Azure.IoT Build 0:6ae2f7bca550 2576 }
Azure.IoT Build 0:6ae2f7bca550 2577 else
Azure.IoT Build 0:6ae2f7bca550 2578 {
Azure.IoT Build 0:6ae2f7bca550 2579 /* Codes_SRS_AMQPVALUE_01_272: [<encoding name="true" code="0x41" category="fixed" width="0" label="the boolean value true"/>] */
Azure.IoT Build 0:6ae2f7bca550 2580 if (output_byte(encoder_output, context, 0x41) != 0)
Azure.IoT Build 0:6ae2f7bca550 2581 {
Azure.IoT Build 0:6ae2f7bca550 2582 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2583 LogError("Failed encoding boolean");
AzureIoTClient 23:1111ee8bcba4 2584 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2585 }
Azure.IoT Build 0:6ae2f7bca550 2586 else
Azure.IoT Build 0:6ae2f7bca550 2587 {
Azure.IoT Build 0:6ae2f7bca550 2588 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2589 }
Azure.IoT Build 0:6ae2f7bca550 2590 }
Azure.IoT Build 0:6ae2f7bca550 2591
Azure.IoT Build 0:6ae2f7bca550 2592 return result;
Azure.IoT Build 0:6ae2f7bca550 2593 }
Azure.IoT Build 0:6ae2f7bca550 2594
Azure.IoT Build 0:6ae2f7bca550 2595 static int encode_ubyte(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, unsigned char value)
Azure.IoT Build 0:6ae2f7bca550 2596 {
Azure.IoT Build 0:6ae2f7bca550 2597 int result;
Azure.IoT Build 0:6ae2f7bca550 2598
Azure.IoT Build 0:6ae2f7bca550 2599 /* Codes_SRS_AMQPVALUE_01_275: [<encoding code="0x50" category="fixed" width="1" label="8-bit unsigned integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 2600 if ((output_byte(encoder_output, context, 0x50) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2601 (output_byte(encoder_output, context, value) != 0))
Azure.IoT Build 0:6ae2f7bca550 2602 {
Azure.IoT Build 0:6ae2f7bca550 2603 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2604 LogError("Failed encoding ubyte");
AzureIoTClient 23:1111ee8bcba4 2605 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2606 }
Azure.IoT Build 0:6ae2f7bca550 2607 else
Azure.IoT Build 0:6ae2f7bca550 2608 {
Azure.IoT Build 0:6ae2f7bca550 2609 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2610 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2611 }
Azure.IoT Build 0:6ae2f7bca550 2612
Azure.IoT Build 0:6ae2f7bca550 2613 return result;
Azure.IoT Build 0:6ae2f7bca550 2614 }
Azure.IoT Build 0:6ae2f7bca550 2615
Azure.IoT Build 0:6ae2f7bca550 2616 static int encode_ushort(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint16_t value)
Azure.IoT Build 0:6ae2f7bca550 2617 {
Azure.IoT Build 0:6ae2f7bca550 2618 int result;
Azure.IoT Build 0:6ae2f7bca550 2619
Azure.IoT Build 0:6ae2f7bca550 2620 /* Codes_SRS_AMQPVALUE_01_276: [<encoding code="0x60" category="fixed" width="2" label="16-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 2621 if ((output_byte(encoder_output, context, 0x60) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2622 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2623 (output_byte(encoder_output, context, (value & 0xFF)) != 0))
Azure.IoT Build 0:6ae2f7bca550 2624 {
Azure.IoT Build 0:6ae2f7bca550 2625 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2626 LogError("Failed encoding ushort");
AzureIoTClient 23:1111ee8bcba4 2627 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2628 }
Azure.IoT Build 0:6ae2f7bca550 2629 else
Azure.IoT Build 0:6ae2f7bca550 2630 {
Azure.IoT Build 0:6ae2f7bca550 2631 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2632 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2633 }
Azure.IoT Build 0:6ae2f7bca550 2634
Azure.IoT Build 0:6ae2f7bca550 2635 return result;
Azure.IoT Build 0:6ae2f7bca550 2636 }
Azure.IoT Build 0:6ae2f7bca550 2637
Azure.IoT Build 0:6ae2f7bca550 2638 static int encode_uint(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint32_t value)
Azure.IoT Build 0:6ae2f7bca550 2639 {
Azure.IoT Build 0:6ae2f7bca550 2640 int result;
Azure.IoT Build 0:6ae2f7bca550 2641
Azure.IoT Build 0:6ae2f7bca550 2642 if (value == 0)
Azure.IoT Build 0:6ae2f7bca550 2643 {
Azure.IoT Build 0:6ae2f7bca550 2644 /* uint0 */
Azure.IoT Build 0:6ae2f7bca550 2645 /* Codes_SRS_AMQPVALUE_01_279: [<encoding name="uint0" code="0x43" category="fixed" width="0" label="the uint value 0"/>] */
Azure.IoT Build 0:6ae2f7bca550 2646 if (output_byte(encoder_output, context, 0x43) != 0)
Azure.IoT Build 0:6ae2f7bca550 2647 {
AzureIoTClient 23:1111ee8bcba4 2648 LogError("Failed encoding uint");
AzureIoTClient 23:1111ee8bcba4 2649 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2650 }
Azure.IoT Build 0:6ae2f7bca550 2651 else
Azure.IoT Build 0:6ae2f7bca550 2652 {
Azure.IoT Build 0:6ae2f7bca550 2653 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2654 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2655 }
Azure.IoT Build 0:6ae2f7bca550 2656 }
Azure.IoT Build 0:6ae2f7bca550 2657 else if (value <= 255)
Azure.IoT Build 0:6ae2f7bca550 2658 {
Azure.IoT Build 0:6ae2f7bca550 2659 /* smalluint */
Azure.IoT Build 0:6ae2f7bca550 2660 /* Codes_SRS_AMQPVALUE_01_278: [<encoding name="smalluint" code="0x52" category="fixed" width="1" label="unsigned integer value in the range 0 to 255 inclusive"/>] */
Azure.IoT Build 0:6ae2f7bca550 2661 if ((output_byte(encoder_output, context, 0x52) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2662 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2663 {
Azure.IoT Build 0:6ae2f7bca550 2664 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2665 LogError("Failed encoding uint");
AzureIoTClient 23:1111ee8bcba4 2666 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2667 }
Azure.IoT Build 0:6ae2f7bca550 2668 else
Azure.IoT Build 0:6ae2f7bca550 2669 {
Azure.IoT Build 0:6ae2f7bca550 2670 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2671 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2672 }
Azure.IoT Build 0:6ae2f7bca550 2673 }
Azure.IoT Build 0:6ae2f7bca550 2674 else
Azure.IoT Build 0:6ae2f7bca550 2675 {
Azure.IoT Build 0:6ae2f7bca550 2676 /* Codes_SRS_AMQPVALUE_01_277: [<encoding code="0x70" category="fixed" width="4" label="32-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 2677 if ((output_byte(encoder_output, context, 0x70) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2678 (output_byte(encoder_output, context, (value >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2679 (output_byte(encoder_output, context, (value >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2680 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2681 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2682 {
Azure.IoT Build 0:6ae2f7bca550 2683 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2684 LogError("Failed encoding uint");
AzureIoTClient 23:1111ee8bcba4 2685 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2686 }
Azure.IoT Build 0:6ae2f7bca550 2687 else
Azure.IoT Build 0:6ae2f7bca550 2688 {
Azure.IoT Build 0:6ae2f7bca550 2689 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2690 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2691 }
Azure.IoT Build 0:6ae2f7bca550 2692 }
Azure.IoT Build 0:6ae2f7bca550 2693
Azure.IoT Build 0:6ae2f7bca550 2694 return result;
Azure.IoT Build 0:6ae2f7bca550 2695 }
Azure.IoT Build 0:6ae2f7bca550 2696
Azure.IoT Build 0:6ae2f7bca550 2697 static int encode_ulong(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint64_t value)
Azure.IoT Build 0:6ae2f7bca550 2698 {
Azure.IoT Build 0:6ae2f7bca550 2699 int result;
Azure.IoT Build 0:6ae2f7bca550 2700 if (value == 0)
Azure.IoT Build 0:6ae2f7bca550 2701 {
Azure.IoT Build 0:6ae2f7bca550 2702 /* ulong0 */
Azure.IoT Build 0:6ae2f7bca550 2703 /* Codes_SRS_AMQPVALUE_01_282: [<encoding name="ulong0" code="0x44" category="fixed" width="0" label="the ulong value 0"/>] */
Azure.IoT Build 0:6ae2f7bca550 2704 if (output_byte(encoder_output, context, 0x44) != 0)
Azure.IoT Build 0:6ae2f7bca550 2705 {
Azure.IoT Build 0:6ae2f7bca550 2706 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2707 LogError("Failed encoding ulong");
AzureIoTClient 23:1111ee8bcba4 2708 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2709 }
Azure.IoT Build 0:6ae2f7bca550 2710 else
Azure.IoT Build 0:6ae2f7bca550 2711 {
Azure.IoT Build 0:6ae2f7bca550 2712 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2713 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2714 }
Azure.IoT Build 0:6ae2f7bca550 2715 }
Azure.IoT Build 0:6ae2f7bca550 2716 else if (value <= 255)
Azure.IoT Build 0:6ae2f7bca550 2717 {
Azure.IoT Build 0:6ae2f7bca550 2718 /* smallulong */
Azure.IoT Build 0:6ae2f7bca550 2719 /* Codes_SRS_AMQPVALUE_01_281: [<encoding name="smallulong" code="0x53" category="fixed" width="1" label="unsigned long value in the range 0 to 255 inclusive"/>] */
Azure.IoT Build 0:6ae2f7bca550 2720 if ((output_byte(encoder_output, context, 0x53) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2721 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2722 {
Azure.IoT Build 0:6ae2f7bca550 2723 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2724 LogError("Failed encoding ulong");
AzureIoTClient 23:1111ee8bcba4 2725 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2726 }
Azure.IoT Build 0:6ae2f7bca550 2727 else
Azure.IoT Build 0:6ae2f7bca550 2728 {
Azure.IoT Build 0:6ae2f7bca550 2729 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2730 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2731 }
Azure.IoT Build 0:6ae2f7bca550 2732 }
Azure.IoT Build 0:6ae2f7bca550 2733 else
Azure.IoT Build 0:6ae2f7bca550 2734 {
Azure.IoT Build 0:6ae2f7bca550 2735 /* Codes_SRS_AMQPVALUE_01_280: [<encoding code="0x80" category="fixed" width="8" label="64-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 2736 if ((output_byte(encoder_output, context, 0x80) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2737 (output_byte(encoder_output, context, (value >> 56) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2738 (output_byte(encoder_output, context, (value >> 48) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2739 (output_byte(encoder_output, context, (value >> 40) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2740 (output_byte(encoder_output, context, (value >> 32) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2741 (output_byte(encoder_output, context, (value >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2742 (output_byte(encoder_output, context, (value >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2743 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2744 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2745 {
Azure.IoT Build 0:6ae2f7bca550 2746 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2747 LogError("Failed encoding ulong");
AzureIoTClient 23:1111ee8bcba4 2748 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2749 }
Azure.IoT Build 0:6ae2f7bca550 2750 else
Azure.IoT Build 0:6ae2f7bca550 2751 {
Azure.IoT Build 0:6ae2f7bca550 2752 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2753 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2754 }
Azure.IoT Build 0:6ae2f7bca550 2755 }
Azure.IoT Build 0:6ae2f7bca550 2756
Azure.IoT Build 0:6ae2f7bca550 2757 return result;
Azure.IoT Build 0:6ae2f7bca550 2758 }
Azure.IoT Build 0:6ae2f7bca550 2759
Azure.IoT Build 0:6ae2f7bca550 2760 static int encode_byte(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, char value)
Azure.IoT Build 0:6ae2f7bca550 2761 {
Azure.IoT Build 0:6ae2f7bca550 2762 int result;
Azure.IoT Build 0:6ae2f7bca550 2763
Azure.IoT Build 0:6ae2f7bca550 2764 /* Codes_SRS_AMQPVALUE_01_283: [<encoding code="0x51" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 2765 if ((output_byte(encoder_output, context, 0x51) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2766 (output_byte(encoder_output, context, value) != 0))
Azure.IoT Build 0:6ae2f7bca550 2767 {
Azure.IoT Build 0:6ae2f7bca550 2768 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2769 LogError("Failed encoding byte");
AzureIoTClient 23:1111ee8bcba4 2770 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2771 }
Azure.IoT Build 0:6ae2f7bca550 2772 else
Azure.IoT Build 0:6ae2f7bca550 2773 {
Azure.IoT Build 0:6ae2f7bca550 2774 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2775 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2776 }
Azure.IoT Build 0:6ae2f7bca550 2777
Azure.IoT Build 0:6ae2f7bca550 2778 return result;
Azure.IoT Build 0:6ae2f7bca550 2779 }
Azure.IoT Build 0:6ae2f7bca550 2780
Azure.IoT Build 0:6ae2f7bca550 2781 static int encode_short(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, int16_t value)
Azure.IoT Build 0:6ae2f7bca550 2782 {
Azure.IoT Build 0:6ae2f7bca550 2783 int result;
Azure.IoT Build 0:6ae2f7bca550 2784
Azure.IoT Build 0:6ae2f7bca550 2785 /* Codes_SRS_AMQPVALUE_01_284: [<encoding code="0x61" category="fixed" width="2" label="16-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 2786 if ((output_byte(encoder_output, context, 0x61) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2787 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2788 (output_byte(encoder_output, context, (value & 0xFF)) != 0))
Azure.IoT Build 0:6ae2f7bca550 2789 {
Azure.IoT Build 0:6ae2f7bca550 2790 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2791 LogError("Failed encoding short");
AzureIoTClient 23:1111ee8bcba4 2792 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2793 }
Azure.IoT Build 0:6ae2f7bca550 2794 else
Azure.IoT Build 0:6ae2f7bca550 2795 {
Azure.IoT Build 0:6ae2f7bca550 2796 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2797 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2798 }
Azure.IoT Build 0:6ae2f7bca550 2799
Azure.IoT Build 0:6ae2f7bca550 2800 return result;
Azure.IoT Build 0:6ae2f7bca550 2801 }
Azure.IoT Build 0:6ae2f7bca550 2802
Azure.IoT Build 0:6ae2f7bca550 2803 static int encode_int(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, int32_t value)
Azure.IoT Build 0:6ae2f7bca550 2804 {
Azure.IoT Build 0:6ae2f7bca550 2805 int result;
Azure.IoT Build 0:6ae2f7bca550 2806
Azure.IoT Build 0:6ae2f7bca550 2807 if ((value <= 127) && (value >= -128))
Azure.IoT Build 0:6ae2f7bca550 2808 {
Azure.IoT Build 0:6ae2f7bca550 2809 /* Codes_SRS_AMQPVALUE_01_286: [<encoding name="smallint" code="0x54" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 2810 if ((output_byte(encoder_output, context, 0x54) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2811 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2812 {
Azure.IoT Build 0:6ae2f7bca550 2813 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2814 LogError("Failed encoding int");
AzureIoTClient 23:1111ee8bcba4 2815 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2816 }
Azure.IoT Build 0:6ae2f7bca550 2817 else
Azure.IoT Build 0:6ae2f7bca550 2818 {
Azure.IoT Build 0:6ae2f7bca550 2819 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2820 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2821 }
Azure.IoT Build 0:6ae2f7bca550 2822 }
Azure.IoT Build 0:6ae2f7bca550 2823 else
Azure.IoT Build 0:6ae2f7bca550 2824 {
Azure.IoT Build 0:6ae2f7bca550 2825 /* Codes_SRS_AMQPVALUE_01_285: [<encoding code="0x71" category="fixed" width="4" label="32-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 2826 if ((output_byte(encoder_output, context, 0x71) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2827 (output_byte(encoder_output, context, (value >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2828 (output_byte(encoder_output, context, (value >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2829 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2830 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2831 {
Azure.IoT Build 0:6ae2f7bca550 2832 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2833 LogError("Failed encoding int");
AzureIoTClient 23:1111ee8bcba4 2834 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2835 }
Azure.IoT Build 0:6ae2f7bca550 2836 else
Azure.IoT Build 0:6ae2f7bca550 2837 {
Azure.IoT Build 0:6ae2f7bca550 2838 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2839 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2840 }
Azure.IoT Build 0:6ae2f7bca550 2841 }
Azure.IoT Build 0:6ae2f7bca550 2842
Azure.IoT Build 0:6ae2f7bca550 2843 return result;
Azure.IoT Build 0:6ae2f7bca550 2844 }
Azure.IoT Build 0:6ae2f7bca550 2845
Azure.IoT Build 0:6ae2f7bca550 2846 static int encode_long(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, int64_t value)
Azure.IoT Build 0:6ae2f7bca550 2847 {
Azure.IoT Build 0:6ae2f7bca550 2848 int result;
Azure.IoT Build 0:6ae2f7bca550 2849
Azure.IoT Build 0:6ae2f7bca550 2850 if ((value <= 127) && (value >= -128))
Azure.IoT Build 0:6ae2f7bca550 2851 {
Azure.IoT Build 0:6ae2f7bca550 2852 /* Codes_SRS_AMQPVALUE_01_288: [<encoding name="smalllong" code="0x55" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 2853 if ((output_byte(encoder_output, context, 0x55) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2854 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2855 {
Azure.IoT Build 0:6ae2f7bca550 2856 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2857 LogError("Failed encoding long");
AzureIoTClient 23:1111ee8bcba4 2858 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2859 }
Azure.IoT Build 0:6ae2f7bca550 2860 else
Azure.IoT Build 0:6ae2f7bca550 2861 {
Azure.IoT Build 0:6ae2f7bca550 2862 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2863 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2864 }
Azure.IoT Build 0:6ae2f7bca550 2865 }
Azure.IoT Build 0:6ae2f7bca550 2866 else
Azure.IoT Build 0:6ae2f7bca550 2867 {
Azure.IoT Build 0:6ae2f7bca550 2868 /* Codes_SRS_AMQPVALUE_01_287: [<encoding code="0x81" category="fixed" width="8" label="64-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 2869 if ((output_byte(encoder_output, context, 0x81) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2870 (output_byte(encoder_output, context, (value >> 56) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2871 (output_byte(encoder_output, context, (value >> 48) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2872 (output_byte(encoder_output, context, (value >> 40) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2873 (output_byte(encoder_output, context, (value >> 32) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2874 (output_byte(encoder_output, context, (value >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2875 (output_byte(encoder_output, context, (value >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2876 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2877 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2878 {
Azure.IoT Build 0:6ae2f7bca550 2879 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2880 LogError("Failed encoding long");
AzureIoTClient 23:1111ee8bcba4 2881 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2882 }
Azure.IoT Build 0:6ae2f7bca550 2883 else
Azure.IoT Build 0:6ae2f7bca550 2884 {
Azure.IoT Build 0:6ae2f7bca550 2885 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2886 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2887 }
Azure.IoT Build 0:6ae2f7bca550 2888 }
Azure.IoT Build 0:6ae2f7bca550 2889
Azure.IoT Build 0:6ae2f7bca550 2890 return result;
Azure.IoT Build 0:6ae2f7bca550 2891 }
Azure.IoT Build 0:6ae2f7bca550 2892
AzureIoTClient 23:1111ee8bcba4 2893 static int encode_float(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, float value)
AzureIoTClient 23:1111ee8bcba4 2894 {
AzureIoTClient 23:1111ee8bcba4 2895 int result;
AzureIoTClient 23:1111ee8bcba4 2896
AzureIoTClient 23:1111ee8bcba4 2897 uint32_t value_as_uint32 = *((uint32_t*)(void*)&value);
AzureIoTClient 23:1111ee8bcba4 2898 /* Codes_SRS_AMQPVALUE_01_289: [\<encoding name="ieee-754" code="0x72" category="fixed" width="4" label="IEEE 754-2008 binary32"/>] */
AzureIoTClient 23:1111ee8bcba4 2899 if ((output_byte(encoder_output, context, 0x72) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2900 (output_byte(encoder_output, context, (value_as_uint32 >> 24) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2901 (output_byte(encoder_output, context, (value_as_uint32 >> 16) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2902 (output_byte(encoder_output, context, (value_as_uint32 >> 8) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2903 (output_byte(encoder_output, context, (value_as_uint32) & 0xFF) != 0))
AzureIoTClient 23:1111ee8bcba4 2904 {
AzureIoTClient 23:1111ee8bcba4 2905 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2906 LogError("Failure encoding bytes for float");
AzureIoTClient 23:1111ee8bcba4 2907 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 2908 }
AzureIoTClient 23:1111ee8bcba4 2909 else
AzureIoTClient 23:1111ee8bcba4 2910 {
AzureIoTClient 23:1111ee8bcba4 2911 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
AzureIoTClient 23:1111ee8bcba4 2912 result = 0;
AzureIoTClient 23:1111ee8bcba4 2913 }
AzureIoTClient 23:1111ee8bcba4 2914
AzureIoTClient 23:1111ee8bcba4 2915 return result;
AzureIoTClient 23:1111ee8bcba4 2916 }
AzureIoTClient 23:1111ee8bcba4 2917
AzureIoTClient 23:1111ee8bcba4 2918 static int encode_double(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, double value)
AzureIoTClient 23:1111ee8bcba4 2919 {
AzureIoTClient 23:1111ee8bcba4 2920 int result;
AzureIoTClient 23:1111ee8bcba4 2921
AzureIoTClient 23:1111ee8bcba4 2922 uint64_t value_as_uint64 = *((uint64_t*)(void*)&value);
AzureIoTClient 23:1111ee8bcba4 2923 /* Codes_SRS_AMQPVALUE_01_290: [\<encoding name="ieee-754" code="0x82" category="fixed" width="8" label="IEEE 754-2008 binary64"/>] */
AzureIoTClient 23:1111ee8bcba4 2924 if ((output_byte(encoder_output, context, 0x82) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2925 (output_byte(encoder_output, context, (value_as_uint64 >> 56) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2926 (output_byte(encoder_output, context, (value_as_uint64 >> 48) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2927 (output_byte(encoder_output, context, (value_as_uint64 >> 40) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2928 (output_byte(encoder_output, context, (value_as_uint64 >> 32) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2929 (output_byte(encoder_output, context, (value_as_uint64 >> 24) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2930 (output_byte(encoder_output, context, (value_as_uint64 >> 16) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2931 (output_byte(encoder_output, context, (value_as_uint64 >> 8) & 0xFF) != 0) ||
AzureIoTClient 23:1111ee8bcba4 2932 (output_byte(encoder_output, context, (value_as_uint64) & 0xFF) != 0))
AzureIoTClient 23:1111ee8bcba4 2933 {
AzureIoTClient 23:1111ee8bcba4 2934 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2935 LogError("Failure encoding bytes for double");
AzureIoTClient 23:1111ee8bcba4 2936 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 2937 }
AzureIoTClient 23:1111ee8bcba4 2938 else
AzureIoTClient 23:1111ee8bcba4 2939 {
AzureIoTClient 23:1111ee8bcba4 2940 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
AzureIoTClient 23:1111ee8bcba4 2941 result = 0;
AzureIoTClient 23:1111ee8bcba4 2942 }
AzureIoTClient 23:1111ee8bcba4 2943
AzureIoTClient 23:1111ee8bcba4 2944 return result;
AzureIoTClient 23:1111ee8bcba4 2945 }
AzureIoTClient 23:1111ee8bcba4 2946
Azure.IoT Build 0:6ae2f7bca550 2947 static int encode_timestamp(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, int64_t value)
Azure.IoT Build 0:6ae2f7bca550 2948 {
Azure.IoT Build 0:6ae2f7bca550 2949 int result;
Azure.IoT Build 0:6ae2f7bca550 2950
Azure.IoT Build 0:6ae2f7bca550 2951 /* Codes_SRS_AMQPVALUE_01_295: [<encoding name="ms64" code="0x83" category="fixed" width="8" label="64-bit two's-complement integer representing milliseconds since the unix epoch"/>] */
Azure.IoT Build 0:6ae2f7bca550 2952 if ((output_byte(encoder_output, context, 0x83) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2953 (output_byte(encoder_output, context, (value >> 56) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2954 (output_byte(encoder_output, context, (value >> 48) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2955 (output_byte(encoder_output, context, (value >> 40) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2956 (output_byte(encoder_output, context, (value >> 32) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2957 (output_byte(encoder_output, context, (value >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2958 (output_byte(encoder_output, context, (value >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2959 (output_byte(encoder_output, context, (value >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2960 (output_byte(encoder_output, context, value & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 2961 {
Azure.IoT Build 0:6ae2f7bca550 2962 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2963 LogError("Failed encoding timestamp");
AzureIoTClient 23:1111ee8bcba4 2964 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2965 }
Azure.IoT Build 0:6ae2f7bca550 2966 else
Azure.IoT Build 0:6ae2f7bca550 2967 {
Azure.IoT Build 0:6ae2f7bca550 2968 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2969 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2970 }
Azure.IoT Build 0:6ae2f7bca550 2971
Azure.IoT Build 0:6ae2f7bca550 2972 return result;
Azure.IoT Build 0:6ae2f7bca550 2973 }
Azure.IoT Build 0:6ae2f7bca550 2974
Azure.IoT Build 0:6ae2f7bca550 2975 static int encode_uuid(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uuid uuid)
Azure.IoT Build 0:6ae2f7bca550 2976 {
Azure.IoT Build 0:6ae2f7bca550 2977 int result;
Azure.IoT Build 0:6ae2f7bca550 2978
Azure.IoT Build 0:6ae2f7bca550 2979 /* Codes_SRS_AMQPVALUE_01_296: [<encoding code="0x98" category="fixed" width="16" label="UUID as defined in section 4.1.2 of RFC-4122"/>] */
Azure.IoT Build 0:6ae2f7bca550 2980 if ((output_byte(encoder_output, context, 0x98) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 2981 (output_bytes(encoder_output, context, uuid, 16) != 0))
Azure.IoT Build 0:6ae2f7bca550 2982 {
Azure.IoT Build 0:6ae2f7bca550 2983 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 2984 LogError("Failed encoding uuid");
AzureIoTClient 23:1111ee8bcba4 2985 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 2986 }
Azure.IoT Build 0:6ae2f7bca550 2987 else
Azure.IoT Build 0:6ae2f7bca550 2988 {
Azure.IoT Build 0:6ae2f7bca550 2989 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 2990 result = 0;
Azure.IoT Build 0:6ae2f7bca550 2991 }
Azure.IoT Build 0:6ae2f7bca550 2992
Azure.IoT Build 0:6ae2f7bca550 2993 return result;
Azure.IoT Build 0:6ae2f7bca550 2994 }
Azure.IoT Build 0:6ae2f7bca550 2995
Azure.IoT Build 0:6ae2f7bca550 2996 static int encode_binary(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, const unsigned char* value, uint32_t length)
Azure.IoT Build 0:6ae2f7bca550 2997 {
Azure.IoT Build 0:6ae2f7bca550 2998 int result;
Azure.IoT Build 0:6ae2f7bca550 2999 if (length <= 255)
Azure.IoT Build 0:6ae2f7bca550 3000 {
Azure.IoT Build 0:6ae2f7bca550 3001 /* Codes_SRS_AMQPVALUE_01_297: [<encoding name="vbin8" code="0xa0" category="variable" width="1" label="up to 2^8 - 1 octets of binary data"/>] */
Azure.IoT Build 0:6ae2f7bca550 3002 if ((output_byte(encoder_output, context, 0xA0) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3003 (output_byte(encoder_output, context, (unsigned char)length) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3004 ((length > 0) && (output_bytes(encoder_output, context, value, length) != 0)))
Azure.IoT Build 0:6ae2f7bca550 3005 {
Azure.IoT Build 0:6ae2f7bca550 3006 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3007 LogError("Failed encoding binary");
AzureIoTClient 23:1111ee8bcba4 3008 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3009 }
Azure.IoT Build 0:6ae2f7bca550 3010 else
Azure.IoT Build 0:6ae2f7bca550 3011 {
Azure.IoT Build 0:6ae2f7bca550 3012 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3013 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3014 }
Azure.IoT Build 0:6ae2f7bca550 3015 }
Azure.IoT Build 0:6ae2f7bca550 3016 else
Azure.IoT Build 0:6ae2f7bca550 3017 {
Azure.IoT Build 0:6ae2f7bca550 3018 /* Codes_SRS_AMQPVALUE_01_298: [<encoding name="vbin32" code="0xb0" category="variable" width="4" label="up to 2^32 - 1 octets of binary data"/>] */
Azure.IoT Build 0:6ae2f7bca550 3019 if ((output_byte(encoder_output, context, 0xB0) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3020 (output_byte(encoder_output, context, (length >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3021 (output_byte(encoder_output, context, (length >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3022 (output_byte(encoder_output, context, (length >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3023 (output_byte(encoder_output, context, length & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3024 (output_bytes(encoder_output, context, value, length) != 0))
Azure.IoT Build 0:6ae2f7bca550 3025 {
Azure.IoT Build 0:6ae2f7bca550 3026 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3027 LogError("Failed encoding binary");
AzureIoTClient 23:1111ee8bcba4 3028 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3029 }
Azure.IoT Build 0:6ae2f7bca550 3030 else
Azure.IoT Build 0:6ae2f7bca550 3031 {
Azure.IoT Build 0:6ae2f7bca550 3032 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3033 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3034 }
Azure.IoT Build 0:6ae2f7bca550 3035 }
Azure.IoT Build 0:6ae2f7bca550 3036
Azure.IoT Build 0:6ae2f7bca550 3037 return result;
Azure.IoT Build 0:6ae2f7bca550 3038 }
Azure.IoT Build 0:6ae2f7bca550 3039
Azure.IoT Build 0:6ae2f7bca550 3040 static int encode_string(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, const char* value)
Azure.IoT Build 0:6ae2f7bca550 3041 {
Azure.IoT Build 0:6ae2f7bca550 3042 int result;
AzureIoTClient 6:641a9672db08 3043 size_t length = strlen(value);
Azure.IoT Build 0:6ae2f7bca550 3044
Azure.IoT Build 0:6ae2f7bca550 3045 if (length <= 255)
Azure.IoT Build 0:6ae2f7bca550 3046 {
Azure.IoT Build 0:6ae2f7bca550 3047 /* Codes_SRS_AMQPVALUE_01_299: [<encoding name="str8-utf8" code="0xa1" category="variable" width="1" label="up to 2^8 - 1 octets worth of UTF-8 Unicode (with no byte order mark)"/>] */
Azure.IoT Build 0:6ae2f7bca550 3048 if ((output_byte(encoder_output, context, (unsigned char)0xA1) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3049 (output_byte(encoder_output, context, (unsigned char)length) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3050 (output_bytes(encoder_output, context, value, length) != 0))
Azure.IoT Build 0:6ae2f7bca550 3051 {
Azure.IoT Build 0:6ae2f7bca550 3052 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3053 LogError("Failed encoding string");
AzureIoTClient 23:1111ee8bcba4 3054 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3055 }
Azure.IoT Build 0:6ae2f7bca550 3056 else
Azure.IoT Build 0:6ae2f7bca550 3057 {
Azure.IoT Build 0:6ae2f7bca550 3058 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3059 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3060 }
Azure.IoT Build 0:6ae2f7bca550 3061 }
Azure.IoT Build 0:6ae2f7bca550 3062 else
Azure.IoT Build 0:6ae2f7bca550 3063 {
Azure.IoT Build 0:6ae2f7bca550 3064 /* Codes_SRS_AMQPVALUE_01_300: [<encoding name="str32-utf8" code="0xb1" category="variable" width="4" label="up to 2^32 - 1 octets worth of UTF-8 Unicode (with no byte order mark)"/>] */
Azure.IoT Build 0:6ae2f7bca550 3065 if ((output_byte(encoder_output, context, 0xB1) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3066 (output_byte(encoder_output, context, (length >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3067 (output_byte(encoder_output, context, (length >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3068 (output_byte(encoder_output, context, (length >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3069 (output_byte(encoder_output, context, length & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3070 (output_bytes(encoder_output, context, value, length) != 0))
Azure.IoT Build 0:6ae2f7bca550 3071 {
Azure.IoT Build 0:6ae2f7bca550 3072 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3073 LogError("Failed encoding string");
AzureIoTClient 23:1111ee8bcba4 3074 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3075 }
Azure.IoT Build 0:6ae2f7bca550 3076 else
Azure.IoT Build 0:6ae2f7bca550 3077 {
Azure.IoT Build 0:6ae2f7bca550 3078 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3079 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3080 }
Azure.IoT Build 0:6ae2f7bca550 3081 }
Azure.IoT Build 0:6ae2f7bca550 3082
Azure.IoT Build 0:6ae2f7bca550 3083 return result;
Azure.IoT Build 0:6ae2f7bca550 3084 }
Azure.IoT Build 0:6ae2f7bca550 3085
Azure.IoT Build 0:6ae2f7bca550 3086 static int encode_symbol(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, const char* value)
Azure.IoT Build 0:6ae2f7bca550 3087 {
Azure.IoT Build 0:6ae2f7bca550 3088 int result;
AzureIoTClient 6:641a9672db08 3089 size_t length = strlen(value);
Azure.IoT Build 0:6ae2f7bca550 3090
Azure.IoT Build 0:6ae2f7bca550 3091 if (length <= 255)
Azure.IoT Build 0:6ae2f7bca550 3092 {
Azure.IoT Build 0:6ae2f7bca550 3093 /* Codes_SRS_AMQPVALUE_01_301: [<encoding name="sym8" code="0xa3" category="variable" width="1" label="up to 2^8 - 1 seven bit ASCII characters representing a symbolic value"/>] */
Azure.IoT Build 0:6ae2f7bca550 3094 if ((output_byte(encoder_output, context, (unsigned char)0xA3) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3095 (output_byte(encoder_output, context, (unsigned char)length) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3096 (output_bytes(encoder_output, context, value, length) != 0))
Azure.IoT Build 0:6ae2f7bca550 3097 {
Azure.IoT Build 0:6ae2f7bca550 3098 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3099 LogError("Failed encoding symbol");
AzureIoTClient 23:1111ee8bcba4 3100 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3101 }
Azure.IoT Build 0:6ae2f7bca550 3102 else
Azure.IoT Build 0:6ae2f7bca550 3103 {
Azure.IoT Build 0:6ae2f7bca550 3104 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3105 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3106 }
Azure.IoT Build 0:6ae2f7bca550 3107 }
Azure.IoT Build 0:6ae2f7bca550 3108 else
Azure.IoT Build 0:6ae2f7bca550 3109 {
Azure.IoT Build 0:6ae2f7bca550 3110 /* Codes_SRS_AMQPVALUE_01_302: [<encoding name="sym32" code="0xb3" category="variable" width="4" label="up to 2^32 - 1 seven bit ASCII characters representing a symbolic value"/>] */
Azure.IoT Build 0:6ae2f7bca550 3111 if ((output_byte(encoder_output, context, 0xB3) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3112 (output_byte(encoder_output, context, (length >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3113 (output_byte(encoder_output, context, (length >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3114 (output_byte(encoder_output, context, (length >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3115 (output_byte(encoder_output, context, length & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3116 /* Codes_SRS_AMQPVALUE_01_122: [Symbols are encoded as ASCII characters [ASCII].] */
Azure.IoT Build 0:6ae2f7bca550 3117 (output_bytes(encoder_output, context, value, length) != 0))
Azure.IoT Build 0:6ae2f7bca550 3118 {
Azure.IoT Build 0:6ae2f7bca550 3119 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3120 LogError("Failed encoding symbol");
AzureIoTClient 23:1111ee8bcba4 3121 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3122 }
Azure.IoT Build 0:6ae2f7bca550 3123 else
Azure.IoT Build 0:6ae2f7bca550 3124 {
Azure.IoT Build 0:6ae2f7bca550 3125 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3126 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3127 }
Azure.IoT Build 0:6ae2f7bca550 3128 }
Azure.IoT Build 0:6ae2f7bca550 3129
Azure.IoT Build 0:6ae2f7bca550 3130 return result;
Azure.IoT Build 0:6ae2f7bca550 3131 }
Azure.IoT Build 0:6ae2f7bca550 3132
Azure.IoT Build 0:6ae2f7bca550 3133 static int encode_list(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint32_t count, AMQP_VALUE* items)
Azure.IoT Build 0:6ae2f7bca550 3134 {
Azure.IoT Build 0:6ae2f7bca550 3135 size_t i;
Azure.IoT Build 0:6ae2f7bca550 3136 int result;
Azure.IoT Build 0:6ae2f7bca550 3137
Azure.IoT Build 0:6ae2f7bca550 3138 if (count == 0)
Azure.IoT Build 0:6ae2f7bca550 3139 {
Azure.IoT Build 0:6ae2f7bca550 3140 /* Codes_SRS_AMQPVALUE_01_303: [<encoding name="list0" code="0x45" category="fixed" width="0" label="the empty list (i.e. the list with no elements)"/>] */
Azure.IoT Build 0:6ae2f7bca550 3141 if (output_byte(encoder_output, context, 0x45) != 0)
Azure.IoT Build 0:6ae2f7bca550 3142 {
Azure.IoT Build 0:6ae2f7bca550 3143 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 6:641a9672db08 3144 LogError("Could not output list constructor byte");
AzureIoTClient 19:000ab4e6a2c1 3145 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3146 }
Azure.IoT Build 0:6ae2f7bca550 3147 else
Azure.IoT Build 0:6ae2f7bca550 3148 {
Azure.IoT Build 0:6ae2f7bca550 3149 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3150 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3151 }
Azure.IoT Build 0:6ae2f7bca550 3152 }
Azure.IoT Build 0:6ae2f7bca550 3153 else
Azure.IoT Build 0:6ae2f7bca550 3154 {
Azure.IoT Build 0:6ae2f7bca550 3155 uint32_t size = 0;
Azure.IoT Build 0:6ae2f7bca550 3156
Azure.IoT Build 0:6ae2f7bca550 3157 /* get the size of all items in the list */
Azure.IoT Build 0:6ae2f7bca550 3158 for (i = 0; i < count; i++)
Azure.IoT Build 0:6ae2f7bca550 3159 {
Azure.IoT Build 0:6ae2f7bca550 3160 size_t item_size;
Azure.IoT Build 0:6ae2f7bca550 3161 if (amqpvalue_get_encoded_size(items[i], &item_size) != 0)
Azure.IoT Build 0:6ae2f7bca550 3162 {
AzureIoTClient 23:1111ee8bcba4 3163 LogError("Could not get encoded size for element %u of the list", (unsigned int)i);
Azure.IoT Build 0:6ae2f7bca550 3164 break;
Azure.IoT Build 0:6ae2f7bca550 3165 }
Azure.IoT Build 0:6ae2f7bca550 3166
AzureIoTClient 6:641a9672db08 3167 if ((item_size > UINT32_MAX) ||
AzureIoTClient 6:641a9672db08 3168 size + (uint32_t)item_size < size)
AzureIoTClient 6:641a9672db08 3169 {
AzureIoTClient 6:641a9672db08 3170 LogError("Overflow in list size computation");
AzureIoTClient 6:641a9672db08 3171 break;
AzureIoTClient 6:641a9672db08 3172 }
AzureIoTClient 6:641a9672db08 3173
AzureIoTClient 6:641a9672db08 3174 size = (uint32_t)(size + item_size);
AzureIoTClient 6:641a9672db08 3175 }
Azure.IoT Build 0:6ae2f7bca550 3176
Azure.IoT Build 0:6ae2f7bca550 3177 if (i < count)
Azure.IoT Build 0:6ae2f7bca550 3178 {
Azure.IoT Build 0:6ae2f7bca550 3179 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 19:000ab4e6a2c1 3180 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3181 }
Azure.IoT Build 0:6ae2f7bca550 3182 else
Azure.IoT Build 0:6ae2f7bca550 3183 {
Azure.IoT Build 0:6ae2f7bca550 3184 if ((count <= 255) && (size < 255))
Azure.IoT Build 0:6ae2f7bca550 3185 {
Azure.IoT Build 0:6ae2f7bca550 3186 size++;
Azure.IoT Build 0:6ae2f7bca550 3187
Azure.IoT Build 0:6ae2f7bca550 3188 /* Codes_SRS_AMQPVALUE_01_304: [<encoding name="list8" code="0xc0" category="compound" width="1" label="up to 2^8 - 1 list elements with total size less than 2^8 octets"/>] */
Azure.IoT Build 0:6ae2f7bca550 3189 if ((output_byte(encoder_output, context, 0xC0) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3190 /* size */
Azure.IoT Build 0:6ae2f7bca550 3191 (output_byte(encoder_output, context, (size & 0xFF)) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3192 /* count */
Azure.IoT Build 0:6ae2f7bca550 3193 (output_byte(encoder_output, context, (count & 0xFF)) != 0))
Azure.IoT Build 0:6ae2f7bca550 3194 {
Azure.IoT Build 0:6ae2f7bca550 3195 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 6:641a9672db08 3196 LogError("Failed encoding list");
AzureIoTClient 19:000ab4e6a2c1 3197 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3198 }
Azure.IoT Build 0:6ae2f7bca550 3199 else
Azure.IoT Build 0:6ae2f7bca550 3200 {
Azure.IoT Build 0:6ae2f7bca550 3201 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3202 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3203 }
Azure.IoT Build 0:6ae2f7bca550 3204 }
Azure.IoT Build 0:6ae2f7bca550 3205 else
Azure.IoT Build 0:6ae2f7bca550 3206 {
Azure.IoT Build 0:6ae2f7bca550 3207 size += 4;
Azure.IoT Build 0:6ae2f7bca550 3208
Azure.IoT Build 0:6ae2f7bca550 3209 /* Codes_SRS_AMQPVALUE_01_305: [<encoding name="list32" code="0xd0" category="compound" width="4" label="up to 2^32 - 1 list elements with total size less than 2^32 octets"/>] */
Azure.IoT Build 0:6ae2f7bca550 3210 if ((output_byte(encoder_output, context, 0xD0) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3211 /* size */
Azure.IoT Build 0:6ae2f7bca550 3212 (output_byte(encoder_output, context, (size >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3213 (output_byte(encoder_output, context, (size >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3214 (output_byte(encoder_output, context, (size >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3215 (output_byte(encoder_output, context, size & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3216 /* count */
Azure.IoT Build 0:6ae2f7bca550 3217 (output_byte(encoder_output, context, (count >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3218 (output_byte(encoder_output, context, (count >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3219 (output_byte(encoder_output, context, (count >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3220 (output_byte(encoder_output, context, count & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 3221 {
Azure.IoT Build 0:6ae2f7bca550 3222 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 6:641a9672db08 3223 LogError("Failed encoding list");
AzureIoTClient 19:000ab4e6a2c1 3224 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3225 }
Azure.IoT Build 0:6ae2f7bca550 3226 else
Azure.IoT Build 0:6ae2f7bca550 3227 {
Azure.IoT Build 0:6ae2f7bca550 3228 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3229 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3230 }
Azure.IoT Build 0:6ae2f7bca550 3231 }
Azure.IoT Build 0:6ae2f7bca550 3232
Azure.IoT Build 0:6ae2f7bca550 3233 if (result == 0)
Azure.IoT Build 0:6ae2f7bca550 3234 {
Azure.IoT Build 0:6ae2f7bca550 3235 for (i = 0; i < count; i++)
Azure.IoT Build 0:6ae2f7bca550 3236 {
Azure.IoT Build 0:6ae2f7bca550 3237 if (amqpvalue_encode(items[i], encoder_output, context) != 0)
Azure.IoT Build 0:6ae2f7bca550 3238 {
AzureIoTClient 23:1111ee8bcba4 3239 break;
Azure.IoT Build 0:6ae2f7bca550 3240 }
Azure.IoT Build 0:6ae2f7bca550 3241 }
Azure.IoT Build 0:6ae2f7bca550 3242
Azure.IoT Build 0:6ae2f7bca550 3243 if (i < count)
Azure.IoT Build 0:6ae2f7bca550 3244 {
AzureIoTClient 23:1111ee8bcba4 3245 LogError("Failed encoding element %u of the list", (unsigned int)i);
AzureIoTClient 19:000ab4e6a2c1 3246 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3247 }
Azure.IoT Build 0:6ae2f7bca550 3248 else
Azure.IoT Build 0:6ae2f7bca550 3249 {
Azure.IoT Build 0:6ae2f7bca550 3250 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3251 }
Azure.IoT Build 0:6ae2f7bca550 3252 }
Azure.IoT Build 0:6ae2f7bca550 3253 }
Azure.IoT Build 0:6ae2f7bca550 3254 }
Azure.IoT Build 0:6ae2f7bca550 3255
Azure.IoT Build 0:6ae2f7bca550 3256 return result;
Azure.IoT Build 0:6ae2f7bca550 3257 }
Azure.IoT Build 0:6ae2f7bca550 3258
Azure.IoT Build 0:6ae2f7bca550 3259 static int encode_map(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint32_t count, AMQP_MAP_KEY_VALUE_PAIR* pairs)
Azure.IoT Build 0:6ae2f7bca550 3260 {
Azure.IoT Build 0:6ae2f7bca550 3261 size_t i;
Azure.IoT Build 0:6ae2f7bca550 3262 int result;
Azure.IoT Build 0:6ae2f7bca550 3263
Azure.IoT Build 0:6ae2f7bca550 3264 uint32_t size = 0;
Azure.IoT Build 0:6ae2f7bca550 3265
Azure.IoT Build 0:6ae2f7bca550 3266 /* Codes_SRS_AMQPVALUE_01_124: [Map encodings MUST contain an even number of items (i.e. an equal number of keys and values).] */
Azure.IoT Build 0:6ae2f7bca550 3267 uint32_t elements = count * 2;
Azure.IoT Build 0:6ae2f7bca550 3268
Azure.IoT Build 0:6ae2f7bca550 3269 /* get the size of all items in the list */
Azure.IoT Build 0:6ae2f7bca550 3270 for (i = 0; i < count; i++)
Azure.IoT Build 0:6ae2f7bca550 3271 {
Azure.IoT Build 0:6ae2f7bca550 3272 size_t item_size;
Azure.IoT Build 0:6ae2f7bca550 3273 if (amqpvalue_get_encoded_size(pairs[i].key, &item_size) != 0)
Azure.IoT Build 0:6ae2f7bca550 3274 {
AzureIoTClient 23:1111ee8bcba4 3275 LogError("Could not get encoded size for key element %u of the map", (unsigned int)i);
Azure.IoT Build 0:6ae2f7bca550 3276 break;
Azure.IoT Build 0:6ae2f7bca550 3277 }
Azure.IoT Build 0:6ae2f7bca550 3278
AzureIoTClient 6:641a9672db08 3279 if ((item_size > UINT32_MAX) ||
AzureIoTClient 6:641a9672db08 3280 size + (uint32_t)item_size < size)
AzureIoTClient 6:641a9672db08 3281 {
AzureIoTClient 6:641a9672db08 3282 LogError("Encoded data is more than the max size for a map");
AzureIoTClient 6:641a9672db08 3283 break;
AzureIoTClient 6:641a9672db08 3284 }
AzureIoTClient 6:641a9672db08 3285
AzureIoTClient 6:641a9672db08 3286 size = (uint32_t)(size + item_size);
Azure.IoT Build 0:6ae2f7bca550 3287
Azure.IoT Build 0:6ae2f7bca550 3288 if (amqpvalue_get_encoded_size(pairs[i].value, &item_size) != 0)
Azure.IoT Build 0:6ae2f7bca550 3289 {
AzureIoTClient 23:1111ee8bcba4 3290 LogError("Could not get encoded size for value element %u of the map", (unsigned int)i);
Azure.IoT Build 0:6ae2f7bca550 3291 break;
Azure.IoT Build 0:6ae2f7bca550 3292 }
Azure.IoT Build 0:6ae2f7bca550 3293
AzureIoTClient 6:641a9672db08 3294 if ((item_size > UINT32_MAX) ||
AzureIoTClient 6:641a9672db08 3295 size + (uint32_t)item_size < size)
AzureIoTClient 6:641a9672db08 3296 {
AzureIoTClient 6:641a9672db08 3297 LogError("Encoded data is more than the max size for a map");
AzureIoTClient 6:641a9672db08 3298 break;
AzureIoTClient 6:641a9672db08 3299 }
AzureIoTClient 6:641a9672db08 3300
AzureIoTClient 6:641a9672db08 3301 size = (uint32_t)(size + item_size);
Azure.IoT Build 0:6ae2f7bca550 3302 }
Azure.IoT Build 0:6ae2f7bca550 3303
Azure.IoT Build 0:6ae2f7bca550 3304 if (i < count)
Azure.IoT Build 0:6ae2f7bca550 3305 {
Azure.IoT Build 0:6ae2f7bca550 3306 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 19:000ab4e6a2c1 3307 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3308 }
Azure.IoT Build 0:6ae2f7bca550 3309 else
Azure.IoT Build 0:6ae2f7bca550 3310 {
Azure.IoT Build 0:6ae2f7bca550 3311 if ((elements <= 255) && (size < 255))
Azure.IoT Build 0:6ae2f7bca550 3312 {
Azure.IoT Build 0:6ae2f7bca550 3313 size++;
Azure.IoT Build 0:6ae2f7bca550 3314
Azure.IoT Build 0:6ae2f7bca550 3315 /* Codes_SRS_AMQPVALUE_01_306: [<encoding name="map8" code="0xc1" category="compound" width="1" label="up to 2^8 - 1 octets of encoded map data"/>] */
Azure.IoT Build 0:6ae2f7bca550 3316 if ((output_byte(encoder_output, context, 0xC1) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3317 /* size */
Azure.IoT Build 0:6ae2f7bca550 3318 (output_byte(encoder_output, context, (size & 0xFF)) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3319 /* count */
Azure.IoT Build 0:6ae2f7bca550 3320 (output_byte(encoder_output, context, (elements & 0xFF)) != 0))
Azure.IoT Build 0:6ae2f7bca550 3321 {
Azure.IoT Build 0:6ae2f7bca550 3322 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 6:641a9672db08 3323 LogError("Could not encode map header");
AzureIoTClient 19:000ab4e6a2c1 3324 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3325 }
Azure.IoT Build 0:6ae2f7bca550 3326 else
Azure.IoT Build 0:6ae2f7bca550 3327 {
Azure.IoT Build 0:6ae2f7bca550 3328 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3329 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3330 }
Azure.IoT Build 0:6ae2f7bca550 3331 }
Azure.IoT Build 0:6ae2f7bca550 3332 else
Azure.IoT Build 0:6ae2f7bca550 3333 {
Azure.IoT Build 0:6ae2f7bca550 3334 size += 4;
Azure.IoT Build 0:6ae2f7bca550 3335
Azure.IoT Build 0:6ae2f7bca550 3336 /* Codes_SRS_AMQPVALUE_01_307: [<encoding name="map32" code="0xd1" category="compound" width="4" label="up to 2^32 - 1 octets of encoded map data"/>] */
Azure.IoT Build 0:6ae2f7bca550 3337 if ((output_byte(encoder_output, context, 0xD1) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3338 /* size */
Azure.IoT Build 0:6ae2f7bca550 3339 (output_byte(encoder_output, context, (size >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3340 (output_byte(encoder_output, context, (size >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3341 (output_byte(encoder_output, context, (size >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3342 (output_byte(encoder_output, context, size & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3343 /* count */
Azure.IoT Build 0:6ae2f7bca550 3344 (output_byte(encoder_output, context, (elements >> 24) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3345 (output_byte(encoder_output, context, (elements >> 16) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3346 (output_byte(encoder_output, context, (elements >> 8) & 0xFF) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3347 (output_byte(encoder_output, context, elements & 0xFF) != 0))
Azure.IoT Build 0:6ae2f7bca550 3348 {
Azure.IoT Build 0:6ae2f7bca550 3349 /* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
AzureIoTClient 6:641a9672db08 3350 LogError("Could not encode map header");
AzureIoTClient 19:000ab4e6a2c1 3351 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3352 }
Azure.IoT Build 0:6ae2f7bca550 3353 else
Azure.IoT Build 0:6ae2f7bca550 3354 {
Azure.IoT Build 0:6ae2f7bca550 3355 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3356 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3357 }
Azure.IoT Build 0:6ae2f7bca550 3358 }
Azure.IoT Build 0:6ae2f7bca550 3359
Azure.IoT Build 0:6ae2f7bca550 3360 if (result == 0)
Azure.IoT Build 0:6ae2f7bca550 3361 {
Azure.IoT Build 0:6ae2f7bca550 3362 /* Codes_SRS_AMQPVALUE_01_123: [A map is encoded as a compound value where the constituent elements form alternating key value pairs.] */
Azure.IoT Build 0:6ae2f7bca550 3363 for (i = 0; i < count; i++)
Azure.IoT Build 0:6ae2f7bca550 3364 {
Azure.IoT Build 0:6ae2f7bca550 3365 if ((amqpvalue_encode(pairs[i].key, encoder_output, context) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3366 (amqpvalue_encode(pairs[i].value, encoder_output, context) != 0))
Azure.IoT Build 0:6ae2f7bca550 3367 {
AzureIoTClient 23:1111ee8bcba4 3368 LogError("Failed encoding map element %u", (unsigned int)i);
AzureIoTClient 23:1111ee8bcba4 3369 break;
Azure.IoT Build 0:6ae2f7bca550 3370 }
Azure.IoT Build 0:6ae2f7bca550 3371 }
Azure.IoT Build 0:6ae2f7bca550 3372
Azure.IoT Build 0:6ae2f7bca550 3373 if (i < count)
Azure.IoT Build 0:6ae2f7bca550 3374 {
AzureIoTClient 6:641a9672db08 3375 LogError("Could not encode map");
AzureIoTClient 19:000ab4e6a2c1 3376 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3377 }
Azure.IoT Build 0:6ae2f7bca550 3378 else
Azure.IoT Build 0:6ae2f7bca550 3379 {
Azure.IoT Build 0:6ae2f7bca550 3380 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3381 }
Azure.IoT Build 0:6ae2f7bca550 3382 }
Azure.IoT Build 0:6ae2f7bca550 3383 }
Azure.IoT Build 0:6ae2f7bca550 3384
Azure.IoT Build 0:6ae2f7bca550 3385 return result;
Azure.IoT Build 0:6ae2f7bca550 3386 }
Azure.IoT Build 0:6ae2f7bca550 3387
Azure.IoT Build 0:6ae2f7bca550 3388 static int encode_descriptor_header(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context)
Azure.IoT Build 0:6ae2f7bca550 3389 {
Azure.IoT Build 0:6ae2f7bca550 3390 int result;
Azure.IoT Build 0:6ae2f7bca550 3391
AzureIoTClient 23:1111ee8bcba4 3392 if (output_byte(encoder_output, context, 0x00) != 0)
AzureIoTClient 23:1111ee8bcba4 3393 {
AzureIoTClient 23:1111ee8bcba4 3394 LogError("Failed encoding descriptor header");
AzureIoTClient 23:1111ee8bcba4 3395 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 3396 }
AzureIoTClient 23:1111ee8bcba4 3397 else
AzureIoTClient 23:1111ee8bcba4 3398 {
AzureIoTClient 23:1111ee8bcba4 3399 result = 0;
AzureIoTClient 23:1111ee8bcba4 3400 }
Azure.IoT Build 0:6ae2f7bca550 3401
Azure.IoT Build 0:6ae2f7bca550 3402 return result;
Azure.IoT Build 0:6ae2f7bca550 3403 }
Azure.IoT Build 0:6ae2f7bca550 3404
Azure.IoT Build 0:6ae2f7bca550 3405 /* Codes_SRS_AMQPVALUE_01_265: [amqpvalue_encode shall encode the value per the ISO.] */
Azure.IoT Build 0:6ae2f7bca550 3406 int amqpvalue_encode(AMQP_VALUE value, AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context)
Azure.IoT Build 0:6ae2f7bca550 3407 {
Azure.IoT Build 0:6ae2f7bca550 3408 int result;
Azure.IoT Build 0:6ae2f7bca550 3409
Azure.IoT Build 0:6ae2f7bca550 3410 /* Codes_SRS_AMQPVALUE_01_269: [If value or encoder_output are NULL, amqpvalue_encode shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 3411 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 3412 (encoder_output == NULL))
Azure.IoT Build 0:6ae2f7bca550 3413 {
AzureIoTClient 23:1111ee8bcba4 3414 LogError("Bad arguments: value = %p, encoder_output = %p",
AzureIoTClient 23:1111ee8bcba4 3415 value, encoder_output);
AzureIoTClient 23:1111ee8bcba4 3416 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3417 }
Azure.IoT Build 0:6ae2f7bca550 3418 else
Azure.IoT Build 0:6ae2f7bca550 3419 {
Azure.IoT Build 0:6ae2f7bca550 3420 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 3421
Azure.IoT Build 0:6ae2f7bca550 3422 switch (value_data->type)
Azure.IoT Build 0:6ae2f7bca550 3423 {
Azure.IoT Build 0:6ae2f7bca550 3424 default:
Azure.IoT Build 0:6ae2f7bca550 3425 /* Codes_SRS_AMQPVALUE_01_271: [If encoding fails due to any error not specifically mentioned here, it shall return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 3426 LogError("Invalid type: %d", (int)value_data->type);
AzureIoTClient 23:1111ee8bcba4 3427 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3428 break;
Azure.IoT Build 0:6ae2f7bca550 3429
Azure.IoT Build 0:6ae2f7bca550 3430 case AMQP_TYPE_NULL:
Azure.IoT Build 0:6ae2f7bca550 3431 /* Codes_SRS_AMQPVALUE_01_264: [<encoding code="0x40" category="fixed" width="0" label="the null value"/>] */
Azure.IoT Build 0:6ae2f7bca550 3432 /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 3433 result = output_byte(encoder_output, context, (unsigned char)0x40);
Azure.IoT Build 0:6ae2f7bca550 3434 break;
Azure.IoT Build 0:6ae2f7bca550 3435
Azure.IoT Build 0:6ae2f7bca550 3436 case AMQP_TYPE_BOOL:
Azure.IoT Build 0:6ae2f7bca550 3437 result = encode_boolean(encoder_output, context, value_data->value.bool_value);
Azure.IoT Build 0:6ae2f7bca550 3438 break;
Azure.IoT Build 0:6ae2f7bca550 3439
Azure.IoT Build 0:6ae2f7bca550 3440 case AMQP_TYPE_UBYTE:
Azure.IoT Build 0:6ae2f7bca550 3441 result = encode_ubyte(encoder_output, context, value_data->value.ubyte_value);
Azure.IoT Build 0:6ae2f7bca550 3442 break;
Azure.IoT Build 0:6ae2f7bca550 3443
Azure.IoT Build 0:6ae2f7bca550 3444 case AMQP_TYPE_USHORT:
Azure.IoT Build 0:6ae2f7bca550 3445 result = encode_ushort(encoder_output, context, value_data->value.ushort_value);
Azure.IoT Build 0:6ae2f7bca550 3446 break;
Azure.IoT Build 0:6ae2f7bca550 3447
Azure.IoT Build 0:6ae2f7bca550 3448 case AMQP_TYPE_UINT:
Azure.IoT Build 0:6ae2f7bca550 3449 result = encode_uint(encoder_output, context, value_data->value.uint_value);
Azure.IoT Build 0:6ae2f7bca550 3450 break;
Azure.IoT Build 0:6ae2f7bca550 3451
Azure.IoT Build 0:6ae2f7bca550 3452 case AMQP_TYPE_ULONG:
Azure.IoT Build 0:6ae2f7bca550 3453 result = encode_ulong(encoder_output, context, value_data->value.ulong_value);
Azure.IoT Build 0:6ae2f7bca550 3454 break;
Azure.IoT Build 0:6ae2f7bca550 3455
Azure.IoT Build 0:6ae2f7bca550 3456 case AMQP_TYPE_BYTE:
Azure.IoT Build 0:6ae2f7bca550 3457 result = encode_byte(encoder_output, context, value_data->value.byte_value);
Azure.IoT Build 0:6ae2f7bca550 3458 break;
Azure.IoT Build 0:6ae2f7bca550 3459
Azure.IoT Build 0:6ae2f7bca550 3460 case AMQP_TYPE_SHORT:
Azure.IoT Build 0:6ae2f7bca550 3461 result = encode_short(encoder_output, context, value_data->value.short_value);
Azure.IoT Build 0:6ae2f7bca550 3462 break;
Azure.IoT Build 0:6ae2f7bca550 3463
Azure.IoT Build 0:6ae2f7bca550 3464 case AMQP_TYPE_INT:
Azure.IoT Build 0:6ae2f7bca550 3465 result = encode_int(encoder_output, context, value_data->value.int_value);
Azure.IoT Build 0:6ae2f7bca550 3466 break;
Azure.IoT Build 0:6ae2f7bca550 3467
Azure.IoT Build 0:6ae2f7bca550 3468 case AMQP_TYPE_LONG:
Azure.IoT Build 0:6ae2f7bca550 3469 result = encode_long(encoder_output, context, value_data->value.long_value);
Azure.IoT Build 0:6ae2f7bca550 3470 break;
Azure.IoT Build 0:6ae2f7bca550 3471
AzureIoTClient 23:1111ee8bcba4 3472 case AMQP_TYPE_FLOAT:
AzureIoTClient 23:1111ee8bcba4 3473 result = encode_float(encoder_output, context, value_data->value.float_value);
AzureIoTClient 23:1111ee8bcba4 3474 break;
AzureIoTClient 23:1111ee8bcba4 3475
AzureIoTClient 23:1111ee8bcba4 3476 case AMQP_TYPE_DOUBLE:
AzureIoTClient 23:1111ee8bcba4 3477 result = encode_double(encoder_output, context, value_data->value.double_value);
AzureIoTClient 23:1111ee8bcba4 3478 break;
AzureIoTClient 23:1111ee8bcba4 3479
Azure.IoT Build 0:6ae2f7bca550 3480 case AMQP_TYPE_TIMESTAMP:
Azure.IoT Build 0:6ae2f7bca550 3481 result = encode_timestamp(encoder_output, context, value_data->value.timestamp_value);
Azure.IoT Build 0:6ae2f7bca550 3482 break;
Azure.IoT Build 0:6ae2f7bca550 3483
Azure.IoT Build 0:6ae2f7bca550 3484 case AMQP_TYPE_UUID:
Azure.IoT Build 0:6ae2f7bca550 3485 result = encode_uuid(encoder_output, context, value_data->value.uuid_value);
Azure.IoT Build 0:6ae2f7bca550 3486 break;
Azure.IoT Build 0:6ae2f7bca550 3487
Azure.IoT Build 0:6ae2f7bca550 3488 case AMQP_TYPE_BINARY:
AzureIoTClient 23:1111ee8bcba4 3489 result = encode_binary(encoder_output, context, (const unsigned char*)value_data->value.binary_value.bytes, value_data->value.binary_value.length);
Azure.IoT Build 0:6ae2f7bca550 3490 break;
Azure.IoT Build 0:6ae2f7bca550 3491
Azure.IoT Build 0:6ae2f7bca550 3492 case AMQP_TYPE_STRING:
Azure.IoT Build 0:6ae2f7bca550 3493 result = encode_string(encoder_output, context, value_data->value.string_value.chars);
Azure.IoT Build 0:6ae2f7bca550 3494 break;
Azure.IoT Build 0:6ae2f7bca550 3495
Azure.IoT Build 0:6ae2f7bca550 3496 case AMQP_TYPE_SYMBOL:
Azure.IoT Build 0:6ae2f7bca550 3497 result = encode_symbol(encoder_output, context, value_data->value.symbol_value.chars);
Azure.IoT Build 0:6ae2f7bca550 3498 break;
Azure.IoT Build 0:6ae2f7bca550 3499
Azure.IoT Build 0:6ae2f7bca550 3500 case AMQP_TYPE_LIST:
Azure.IoT Build 0:6ae2f7bca550 3501 result = encode_list(encoder_output, context, value_data->value.list_value.count, value_data->value.list_value.items);
Azure.IoT Build 0:6ae2f7bca550 3502 break;
Azure.IoT Build 0:6ae2f7bca550 3503
Azure.IoT Build 0:6ae2f7bca550 3504 case AMQP_TYPE_MAP:
Azure.IoT Build 0:6ae2f7bca550 3505 result = encode_map(encoder_output, context, value_data->value.map_value.pair_count, value_data->value.map_value.pairs);
Azure.IoT Build 0:6ae2f7bca550 3506 break;
Azure.IoT Build 0:6ae2f7bca550 3507
Azure.IoT Build 0:6ae2f7bca550 3508 case AMQP_TYPE_COMPOSITE:
Azure.IoT Build 0:6ae2f7bca550 3509 case AMQP_TYPE_DESCRIBED:
Azure.IoT Build 0:6ae2f7bca550 3510 {
Azure.IoT Build 0:6ae2f7bca550 3511 if ((encode_descriptor_header(encoder_output, context) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3512 (amqpvalue_encode(value_data->value.described_value.descriptor, encoder_output, context) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 3513 (amqpvalue_encode(value_data->value.described_value.value, encoder_output, context) != 0))
Azure.IoT Build 0:6ae2f7bca550 3514 {
AzureIoTClient 23:1111ee8bcba4 3515 LogError("Failed encoding described or composite type");
AzureIoTClient 23:1111ee8bcba4 3516 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3517 }
Azure.IoT Build 0:6ae2f7bca550 3518 else
Azure.IoT Build 0:6ae2f7bca550 3519 {
Azure.IoT Build 0:6ae2f7bca550 3520 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3521 }
AzureIoTClient 23:1111ee8bcba4 3522
Azure.IoT Build 0:6ae2f7bca550 3523 break;
Azure.IoT Build 0:6ae2f7bca550 3524 }
Azure.IoT Build 0:6ae2f7bca550 3525 }
Azure.IoT Build 0:6ae2f7bca550 3526 }
Azure.IoT Build 0:6ae2f7bca550 3527
Azure.IoT Build 0:6ae2f7bca550 3528 return result;
Azure.IoT Build 0:6ae2f7bca550 3529 }
Azure.IoT Build 0:6ae2f7bca550 3530
Azure.IoT Build 0:6ae2f7bca550 3531 static int count_bytes(void* context, const unsigned char* bytes, size_t length)
Azure.IoT Build 0:6ae2f7bca550 3532 {
Azure.IoT Build 0:6ae2f7bca550 3533 (void)bytes;
Azure.IoT Build 0:6ae2f7bca550 3534
Azure.IoT Build 0:6ae2f7bca550 3535 size_t* byte_count = (size_t*)context;
Azure.IoT Build 0:6ae2f7bca550 3536 *byte_count += length;
Azure.IoT Build 0:6ae2f7bca550 3537
Azure.IoT Build 0:6ae2f7bca550 3538 return 0;
Azure.IoT Build 0:6ae2f7bca550 3539 }
Azure.IoT Build 0:6ae2f7bca550 3540
Azure.IoT Build 0:6ae2f7bca550 3541 int amqpvalue_get_encoded_size(AMQP_VALUE value, size_t* encoded_size)
Azure.IoT Build 0:6ae2f7bca550 3542 {
Azure.IoT Build 0:6ae2f7bca550 3543 int result;
Azure.IoT Build 0:6ae2f7bca550 3544
Azure.IoT Build 0:6ae2f7bca550 3545 /* Codes_SRS_AMQPVALUE_01_309: [If any argument is NULL, amqpvalue_get_encoded_size shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 3546 if ((value == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 3547 (encoded_size == NULL))
Azure.IoT Build 0:6ae2f7bca550 3548 {
AzureIoTClient 23:1111ee8bcba4 3549 LogError("Bad arguments: value = %p, encoded_size = %p",
AzureIoTClient 23:1111ee8bcba4 3550 value, encoded_size);
AzureIoTClient 19:000ab4e6a2c1 3551 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3552 }
Azure.IoT Build 0:6ae2f7bca550 3553 else
Azure.IoT Build 0:6ae2f7bca550 3554 {
Azure.IoT Build 0:6ae2f7bca550 3555 *encoded_size = 0;
Azure.IoT Build 0:6ae2f7bca550 3556 result = amqpvalue_encode(value, count_bytes, encoded_size);
Azure.IoT Build 0:6ae2f7bca550 3557 }
Azure.IoT Build 0:6ae2f7bca550 3558
Azure.IoT Build 0:6ae2f7bca550 3559 return result;
Azure.IoT Build 0:6ae2f7bca550 3560 }
Azure.IoT Build 0:6ae2f7bca550 3561
Azure.IoT Build 0:6ae2f7bca550 3562 static void amqpvalue_clear(AMQP_VALUE_DATA* value_data)
Azure.IoT Build 0:6ae2f7bca550 3563 {
Azure.IoT Build 0:6ae2f7bca550 3564 switch (value_data->type)
Azure.IoT Build 0:6ae2f7bca550 3565 {
Azure.IoT Build 0:6ae2f7bca550 3566 default:
AzureIoTClient 23:1111ee8bcba4 3567 break;
AzureIoTClient 23:1111ee8bcba4 3568
Azure.IoT Build 0:6ae2f7bca550 3569 case AMQP_TYPE_BINARY:
Azure.IoT Build 0:6ae2f7bca550 3570 if (value_data->value.binary_value.bytes != NULL)
Azure.IoT Build 0:6ae2f7bca550 3571 {
AzureIoTClient 21:f9c433d8e6ca 3572 free((void*)value_data->value.binary_value.bytes);
Azure.IoT Build 0:6ae2f7bca550 3573 }
Azure.IoT Build 0:6ae2f7bca550 3574 break;
Azure.IoT Build 0:6ae2f7bca550 3575 case AMQP_TYPE_STRING:
Azure.IoT Build 0:6ae2f7bca550 3576 if (value_data->value.string_value.chars != NULL)
Azure.IoT Build 0:6ae2f7bca550 3577 {
AzureIoTClient 21:f9c433d8e6ca 3578 free(value_data->value.string_value.chars);
Azure.IoT Build 0:6ae2f7bca550 3579 }
Azure.IoT Build 0:6ae2f7bca550 3580 break;
Azure.IoT Build 0:6ae2f7bca550 3581 case AMQP_TYPE_SYMBOL:
Azure.IoT Build 0:6ae2f7bca550 3582 if (value_data->value.symbol_value.chars != NULL)
Azure.IoT Build 0:6ae2f7bca550 3583 {
AzureIoTClient 21:f9c433d8e6ca 3584 free(value_data->value.symbol_value.chars);
Azure.IoT Build 0:6ae2f7bca550 3585 }
Azure.IoT Build 0:6ae2f7bca550 3586 break;
Azure.IoT Build 0:6ae2f7bca550 3587 case AMQP_TYPE_LIST:
Azure.IoT Build 0:6ae2f7bca550 3588 {
Azure.IoT Build 0:6ae2f7bca550 3589 size_t i;
Azure.IoT Build 0:6ae2f7bca550 3590 for (i = 0; i < value_data->value.list_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 3591 {
Azure.IoT Build 0:6ae2f7bca550 3592 amqpvalue_destroy(value_data->value.list_value.items[i]);
Azure.IoT Build 0:6ae2f7bca550 3593 }
Azure.IoT Build 0:6ae2f7bca550 3594
AzureIoTClient 21:f9c433d8e6ca 3595 free(value_data->value.list_value.items);
Azure.IoT Build 0:6ae2f7bca550 3596 value_data->value.list_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 3597 break;
Azure.IoT Build 0:6ae2f7bca550 3598 }
Azure.IoT Build 0:6ae2f7bca550 3599 case AMQP_TYPE_MAP:
Azure.IoT Build 0:6ae2f7bca550 3600 {
Azure.IoT Build 0:6ae2f7bca550 3601 size_t i;
Azure.IoT Build 0:6ae2f7bca550 3602 for (i = 0; i < value_data->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 3603 {
Azure.IoT Build 0:6ae2f7bca550 3604 amqpvalue_destroy(value_data->value.map_value.pairs[i].key);
Azure.IoT Build 0:6ae2f7bca550 3605 amqpvalue_destroy(value_data->value.map_value.pairs[i].value);
Azure.IoT Build 0:6ae2f7bca550 3606 }
Azure.IoT Build 0:6ae2f7bca550 3607
AzureIoTClient 21:f9c433d8e6ca 3608 free(value_data->value.map_value.pairs);
Azure.IoT Build 0:6ae2f7bca550 3609 value_data->value.map_value.pairs = NULL;
Azure.IoT Build 0:6ae2f7bca550 3610 break;
Azure.IoT Build 0:6ae2f7bca550 3611 }
Azure.IoT Build 0:6ae2f7bca550 3612 case AMQP_TYPE_ARRAY:
Azure.IoT Build 0:6ae2f7bca550 3613 {
Azure.IoT Build 0:6ae2f7bca550 3614 size_t i;
Azure.IoT Build 0:6ae2f7bca550 3615 for (i = 0; i < value_data->value.array_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 3616 {
Azure.IoT Build 0:6ae2f7bca550 3617 amqpvalue_destroy(value_data->value.array_value.items[i]);
Azure.IoT Build 0:6ae2f7bca550 3618 }
Azure.IoT Build 0:6ae2f7bca550 3619
AzureIoTClient 21:f9c433d8e6ca 3620 free(value_data->value.array_value.items);
Azure.IoT Build 0:6ae2f7bca550 3621 value_data->value.array_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 3622 break;
Azure.IoT Build 0:6ae2f7bca550 3623 }
Azure.IoT Build 0:6ae2f7bca550 3624 case AMQP_TYPE_COMPOSITE:
Azure.IoT Build 0:6ae2f7bca550 3625 case AMQP_TYPE_DESCRIBED:
Azure.IoT Build 0:6ae2f7bca550 3626 amqpvalue_destroy(value_data->value.described_value.descriptor);
Azure.IoT Build 0:6ae2f7bca550 3627 amqpvalue_destroy(value_data->value.described_value.value);
Azure.IoT Build 0:6ae2f7bca550 3628 break;
Azure.IoT Build 0:6ae2f7bca550 3629 }
Azure.IoT Build 0:6ae2f7bca550 3630
Azure.IoT Build 0:6ae2f7bca550 3631 value_data->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 3632 }
Azure.IoT Build 0:6ae2f7bca550 3633
Azure.IoT Build 0:6ae2f7bca550 3634 void amqpvalue_destroy(AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 3635 {
Azure.IoT Build 0:6ae2f7bca550 3636 /* Codes_SRS_AMQPVALUE_01_315: [If the value argument is NULL, amqpvalue_destroy shall do nothing.] */
AzureIoTClient 23:1111ee8bcba4 3637 if (value == NULL)
AzureIoTClient 23:1111ee8bcba4 3638 {
AzureIoTClient 23:1111ee8bcba4 3639 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 3640 }
AzureIoTClient 23:1111ee8bcba4 3641 else
AzureIoTClient 23:1111ee8bcba4 3642 {
Azure.IoT Build 0:6ae2f7bca550 3643 /* Codes_SRS_AMQPVALUE_01_314: [amqpvalue_destroy shall free all resources allocated by any of the amqpvalue_create_xxx functions or amqpvalue_clone.] */
Azure.IoT Build 0:6ae2f7bca550 3644 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 3645 amqpvalue_clear(value_data);
AzureIoTClient 21:f9c433d8e6ca 3646 free(value);
Azure.IoT Build 0:6ae2f7bca550 3647 }
Azure.IoT Build 0:6ae2f7bca550 3648 }
Azure.IoT Build 0:6ae2f7bca550 3649
Azure.IoT Build 0:6ae2f7bca550 3650 static INTERNAL_DECODER_DATA* internal_decoder_create(ON_VALUE_DECODED on_value_decoded, void* callback_context, AMQP_VALUE_DATA* value_data)
Azure.IoT Build 0:6ae2f7bca550 3651 {
AzureIoTClient 21:f9c433d8e6ca 3652 INTERNAL_DECODER_DATA* internal_decoder_data = (INTERNAL_DECODER_DATA*)malloc(sizeof(INTERNAL_DECODER_DATA));
AzureIoTClient 23:1111ee8bcba4 3653 if (internal_decoder_data == NULL)
AzureIoTClient 23:1111ee8bcba4 3654 {
AzureIoTClient 23:1111ee8bcba4 3655 LogError("Cannot allocate memory for internal decoder structure");
AzureIoTClient 23:1111ee8bcba4 3656 }
AzureIoTClient 23:1111ee8bcba4 3657 else
AzureIoTClient 23:1111ee8bcba4 3658 {
Azure.IoT Build 0:6ae2f7bca550 3659 internal_decoder_data->on_value_decoded = on_value_decoded;
Azure.IoT Build 0:6ae2f7bca550 3660 internal_decoder_data->on_value_decoded_context = callback_context;
Azure.IoT Build 0:6ae2f7bca550 3661 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 3662 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 3663 internal_decoder_data->decode_to_value = value_data;
Azure.IoT Build 0:6ae2f7bca550 3664 }
Azure.IoT Build 0:6ae2f7bca550 3665
Azure.IoT Build 0:6ae2f7bca550 3666 return internal_decoder_data;
Azure.IoT Build 0:6ae2f7bca550 3667 }
Azure.IoT Build 0:6ae2f7bca550 3668
Azure.IoT Build 0:6ae2f7bca550 3669 static void internal_decoder_destroy(INTERNAL_DECODER_DATA* internal_decoder)
Azure.IoT Build 0:6ae2f7bca550 3670 {
Azure.IoT Build 0:6ae2f7bca550 3671 if (internal_decoder != NULL)
Azure.IoT Build 0:6ae2f7bca550 3672 {
Azure.IoT Build 0:6ae2f7bca550 3673 internal_decoder_destroy(internal_decoder->inner_decoder);
AzureIoTClient 21:f9c433d8e6ca 3674 free(internal_decoder);
Azure.IoT Build 0:6ae2f7bca550 3675 }
Azure.IoT Build 0:6ae2f7bca550 3676 }
Azure.IoT Build 0:6ae2f7bca550 3677
Azure.IoT Build 0:6ae2f7bca550 3678 static void inner_decoder_callback(void* context, AMQP_VALUE decoded_value)
Azure.IoT Build 0:6ae2f7bca550 3679 {
AzureIoTClient 6:641a9672db08 3680 /* API issue: the decoded_value should be removed completely:
AzureIoTClient 23:1111ee8bcba4 3681 TODO: uAMQP: inner_decoder_callback in amqpvalue.c could probably do without the decoded_value ... */
AzureIoTClient 6:641a9672db08 3682 (void)decoded_value;
Azure.IoT Build 0:6ae2f7bca550 3683 INTERNAL_DECODER_DATA* internal_decoder_data = (INTERNAL_DECODER_DATA*)context;
Azure.IoT Build 0:6ae2f7bca550 3684 INTERNAL_DECODER_DATA* inner_decoder = (INTERNAL_DECODER_DATA*)internal_decoder_data->inner_decoder;
Azure.IoT Build 0:6ae2f7bca550 3685 inner_decoder->decoder_state = DECODER_STATE_DONE;
Azure.IoT Build 0:6ae2f7bca550 3686 }
Azure.IoT Build 0:6ae2f7bca550 3687
AzureIoTClient 23:1111ee8bcba4 3688 static int internal_decoder_decode_bytes(INTERNAL_DECODER_DATA* internal_decoder_data, const unsigned char* buffer, size_t size, size_t* used_bytes)
Azure.IoT Build 0:6ae2f7bca550 3689 {
Azure.IoT Build 0:6ae2f7bca550 3690 int result;
Azure.IoT Build 0:6ae2f7bca550 3691 size_t initial_size = size;
Azure.IoT Build 0:6ae2f7bca550 3692
Azure.IoT Build 0:6ae2f7bca550 3693 if (internal_decoder_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 3694 {
AzureIoTClient 23:1111ee8bcba4 3695 /* TODO: investigate if this check is even needed */
AzureIoTClient 23:1111ee8bcba4 3696 LogError("NULL internal_decoder_data");
AzureIoTClient 23:1111ee8bcba4 3697 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3698 }
Azure.IoT Build 0:6ae2f7bca550 3699 else
Azure.IoT Build 0:6ae2f7bca550 3700 {
Azure.IoT Build 0:6ae2f7bca550 3701 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3702 /* Codes_SRS_AMQPVALUE_01_322: [amqpvalue_decode_bytes shall process the bytes byte by byte, as a stream.] */
Azure.IoT Build 0:6ae2f7bca550 3703 while ((size > 0) && (internal_decoder_data->decoder_state != DECODER_STATE_DONE))
Azure.IoT Build 0:6ae2f7bca550 3704 {
Azure.IoT Build 0:6ae2f7bca550 3705 switch (internal_decoder_data->decoder_state)
Azure.IoT Build 0:6ae2f7bca550 3706 {
Azure.IoT Build 0:6ae2f7bca550 3707 default:
AzureIoTClient 23:1111ee8bcba4 3708 LogError("Invalid decoder state: %d", (int)internal_decoder_data->decoder_state);
AzureIoTClient 19:000ab4e6a2c1 3709 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3710 break;
AzureIoTClient 23:1111ee8bcba4 3711
Azure.IoT Build 0:6ae2f7bca550 3712 case DECODER_STATE_CONSTRUCTOR:
Azure.IoT Build 0:6ae2f7bca550 3713 {
Azure.IoT Build 0:6ae2f7bca550 3714 amqpvalue_clear(internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 3715 internal_decoder_data->constructor_byte = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 3716 buffer++;
Azure.IoT Build 0:6ae2f7bca550 3717 size--;
Azure.IoT Build 0:6ae2f7bca550 3718
Azure.IoT Build 0:6ae2f7bca550 3719 switch (internal_decoder_data->constructor_byte)
Azure.IoT Build 0:6ae2f7bca550 3720 {
Azure.IoT Build 0:6ae2f7bca550 3721 default:
Azure.IoT Build 0:6ae2f7bca550 3722 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 3723 LogError("Invalid constructor byte: 0x%02x", internal_decoder_data->constructor_byte);
AzureIoTClient 23:1111ee8bcba4 3724 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 3725 break;
AzureIoTClient 23:1111ee8bcba4 3726
Azure.IoT Build 0:6ae2f7bca550 3727 case 0x00: /* descriptor */
AzureIoTClient 23:1111ee8bcba4 3728 {
AzureIoTClient 23:1111ee8bcba4 3729 internal_decoder_data->decode_to_value->type = AMQP_TYPE_DESCRIBED;
AzureIoTClient 23:1111ee8bcba4 3730 AMQP_VALUE_DATA* descriptor = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 3731 if (descriptor == NULL)
AzureIoTClient 23:1111ee8bcba4 3732 {
AzureIoTClient 23:1111ee8bcba4 3733 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 3734 LogError("Could not allocate memory for descriptor");
AzureIoTClient 23:1111ee8bcba4 3735 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 3736 }
AzureIoTClient 23:1111ee8bcba4 3737 else
AzureIoTClient 23:1111ee8bcba4 3738 {
AzureIoTClient 23:1111ee8bcba4 3739 descriptor->type = AMQP_TYPE_UNKNOWN;
AzureIoTClient 23:1111ee8bcba4 3740 internal_decoder_data->decode_to_value->value.described_value.descriptor = descriptor;
AzureIoTClient 23:1111ee8bcba4 3741 internal_decoder_data->inner_decoder = internal_decoder_create(inner_decoder_callback, internal_decoder_data, descriptor);
AzureIoTClient 23:1111ee8bcba4 3742 if (internal_decoder_data->inner_decoder == NULL)
AzureIoTClient 23:1111ee8bcba4 3743 {
AzureIoTClient 23:1111ee8bcba4 3744 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 3745 LogError("Could not create inner decoder for descriptor");
AzureIoTClient 23:1111ee8bcba4 3746 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 3747 }
AzureIoTClient 23:1111ee8bcba4 3748 else
AzureIoTClient 23:1111ee8bcba4 3749 {
AzureIoTClient 23:1111ee8bcba4 3750 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
AzureIoTClient 23:1111ee8bcba4 3751 internal_decoder_data->decode_value_state.described_value_state.described_value_state = DECODE_DESCRIBED_VALUE_STEP_DESCRIPTOR;
AzureIoTClient 23:1111ee8bcba4 3752 result = 0;
AzureIoTClient 23:1111ee8bcba4 3753 }
AzureIoTClient 23:1111ee8bcba4 3754 }
AzureIoTClient 23:1111ee8bcba4 3755
AzureIoTClient 23:1111ee8bcba4 3756 break;
AzureIoTClient 23:1111ee8bcba4 3757 }
Azure.IoT Build 0:6ae2f7bca550 3758
Azure.IoT Build 0:6ae2f7bca550 3759 /* Codes_SRS_AMQPVALUE_01_329: [<encoding code="0x40" category="fixed" width="0" label="the null value"/>] */
Azure.IoT Build 0:6ae2f7bca550 3760 case 0x40:
Azure.IoT Build 0:6ae2f7bca550 3761 {
Azure.IoT Build 0:6ae2f7bca550 3762 /* Codes_SRS_AMQPVALUE_01_328: [1.6.1 null Indicates an empty value.] */
Azure.IoT Build 0:6ae2f7bca550 3763 internal_decoder_data->decode_to_value->type = AMQP_TYPE_NULL;
Azure.IoT Build 0:6ae2f7bca550 3764 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 3765
Azure.IoT Build 0:6ae2f7bca550 3766 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 3767 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 3768 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 3769 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 3770 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3771
Azure.IoT Build 0:6ae2f7bca550 3772 break;
Azure.IoT Build 0:6ae2f7bca550 3773 }
Azure.IoT Build 0:6ae2f7bca550 3774
Azure.IoT Build 0:6ae2f7bca550 3775 /* Codes_SRS_AMQPVALUE_01_331: [<encoding code="0x56" category="fixed" width="1" label="boolean with the octet 0x00 being false and octet 0x01 being true"/>] */
Azure.IoT Build 0:6ae2f7bca550 3776 case 0x56:
Azure.IoT Build 0:6ae2f7bca550 3777 {
Azure.IoT Build 0:6ae2f7bca550 3778 /* Codes_SRS_AMQPVALUE_01_330: [1.6.2 boolean Represents a true or false value.] */
Azure.IoT Build 0:6ae2f7bca550 3779 internal_decoder_data->decode_to_value->type = AMQP_TYPE_BOOL;
Azure.IoT Build 0:6ae2f7bca550 3780 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3781 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3782
Azure.IoT Build 0:6ae2f7bca550 3783 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3784 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3785 break;
Azure.IoT Build 0:6ae2f7bca550 3786 }
Azure.IoT Build 0:6ae2f7bca550 3787 /* Codes_SRS_AMQPVALUE_01_332: [<encoding name="true" code="0x41" category="fixed" width="0" label="the boolean value true"/>] */
Azure.IoT Build 0:6ae2f7bca550 3788 case 0x41:
Azure.IoT Build 0:6ae2f7bca550 3789 {
Azure.IoT Build 0:6ae2f7bca550 3790 /* Codes_SRS_AMQPVALUE_01_330: [1.6.2 boolean Represents a true or false value.] */
Azure.IoT Build 0:6ae2f7bca550 3791 internal_decoder_data->decode_to_value->type = AMQP_TYPE_BOOL;
Azure.IoT Build 0:6ae2f7bca550 3792 internal_decoder_data->decode_to_value->value.bool_value = true;
Azure.IoT Build 0:6ae2f7bca550 3793 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 3794
Azure.IoT Build 0:6ae2f7bca550 3795 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 3796 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 3797 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 3798 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 3799 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3800 break;
Azure.IoT Build 0:6ae2f7bca550 3801 }
Azure.IoT Build 0:6ae2f7bca550 3802 /* Codes_SRS_AMQPVALUE_01_333: [<encoding name="false" code="0x42" category="fixed" width="0" label="the boolean value false"/>] */
Azure.IoT Build 0:6ae2f7bca550 3803 case 0x42:
Azure.IoT Build 0:6ae2f7bca550 3804 {
Azure.IoT Build 0:6ae2f7bca550 3805 /* Codes_SRS_AMQPVALUE_01_330: [1.6.2 boolean Represents a true or false value.] */
Azure.IoT Build 0:6ae2f7bca550 3806 internal_decoder_data->decode_to_value->type = AMQP_TYPE_BOOL;
Azure.IoT Build 0:6ae2f7bca550 3807 internal_decoder_data->decode_to_value->value.bool_value = false;
Azure.IoT Build 0:6ae2f7bca550 3808 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 3809
Azure.IoT Build 0:6ae2f7bca550 3810 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 3811 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 3812 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 3813 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 3814 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3815 break;
Azure.IoT Build 0:6ae2f7bca550 3816 }
Azure.IoT Build 0:6ae2f7bca550 3817 /* Codes_SRS_AMQPVALUE_01_335: [<encoding code="0x50" category="fixed" width="1" label="8-bit unsigned integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 3818 case 0x50:
Azure.IoT Build 0:6ae2f7bca550 3819 {
Azure.IoT Build 0:6ae2f7bca550 3820 /* Codes_SRS_AMQPVALUE_01_334: [1.6.3 ubyte Integer in the range 0 to 28 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3821 internal_decoder_data->decode_to_value->type = AMQP_TYPE_UBYTE;
Azure.IoT Build 0:6ae2f7bca550 3822 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3823 internal_decoder_data->decode_to_value->value.ubyte_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3824
Azure.IoT Build 0:6ae2f7bca550 3825 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3826 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3827 break;
Azure.IoT Build 0:6ae2f7bca550 3828 }
Azure.IoT Build 0:6ae2f7bca550 3829 /* Codes_SRS_AMQPVALUE_01_337: [<encoding code="0x60" category="fixed" width="2" label="16-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 3830 case 0x60:
Azure.IoT Build 0:6ae2f7bca550 3831 {
Azure.IoT Build 0:6ae2f7bca550 3832 /* Codes_SRS_AMQPVALUE_01_336: [1.6.4 ushort Integer in the range 0 to 216 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3833 internal_decoder_data->decode_to_value->type = AMQP_TYPE_USHORT;
Azure.IoT Build 0:6ae2f7bca550 3834 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3835 internal_decoder_data->decode_to_value->value.ushort_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3836 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3837
Azure.IoT Build 0:6ae2f7bca550 3838 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3839 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3840 break;
Azure.IoT Build 0:6ae2f7bca550 3841 }
Azure.IoT Build 0:6ae2f7bca550 3842 /* Codes_SRS_AMQPVALUE_01_339: [<encoding code="0x70" category="fixed" width="4" label="32-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 3843 case 0x70:
Azure.IoT Build 0:6ae2f7bca550 3844 /* Codes_SRS_AMQPVALUE_01_340: [<encoding name="smalluint" code="0x52" category="fixed" width="1" label="unsigned integer value in the range 0 to 255 inclusive"/>] */
Azure.IoT Build 0:6ae2f7bca550 3845 case 0x52:
Azure.IoT Build 0:6ae2f7bca550 3846 {
Azure.IoT Build 0:6ae2f7bca550 3847 internal_decoder_data->decode_to_value->type = AMQP_TYPE_UINT;
Azure.IoT Build 0:6ae2f7bca550 3848 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3849 internal_decoder_data->decode_to_value->value.uint_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3850 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3851
Azure.IoT Build 0:6ae2f7bca550 3852 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3853 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3854 break;
Azure.IoT Build 0:6ae2f7bca550 3855 }
Azure.IoT Build 0:6ae2f7bca550 3856 /* Codes_SRS_AMQPVALUE_01_341: [<encoding name="uint0" code="0x43" category="fixed" width="0" label="the uint value 0"/>] */
Azure.IoT Build 0:6ae2f7bca550 3857 case 0x43:
Azure.IoT Build 0:6ae2f7bca550 3858 {
Azure.IoT Build 0:6ae2f7bca550 3859 /* Codes_SRS_AMQPVALUE_01_338: [1.6.5 uint Integer in the range 0 to 232 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3860 internal_decoder_data->decode_to_value->type = AMQP_TYPE_UINT;
Azure.IoT Build 0:6ae2f7bca550 3861 internal_decoder_data->decode_to_value->value.uint_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3862 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 3863
Azure.IoT Build 0:6ae2f7bca550 3864 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 3865 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 3866 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 3867 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 3868 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3869 break;
Azure.IoT Build 0:6ae2f7bca550 3870 }
Azure.IoT Build 0:6ae2f7bca550 3871 /* Codes_SRS_AMQPVALUE_01_343: [<encoding code="0x80" category="fixed" width="8" label="64-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 3872 case 0x80:
Azure.IoT Build 0:6ae2f7bca550 3873 {
Azure.IoT Build 0:6ae2f7bca550 3874 /* Codes_SRS_AMQPVALUE_01_342: [1.6.6 ulong Integer in the range 0 to 264 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3875 internal_decoder_data->decode_to_value->type = AMQP_TYPE_ULONG;
Azure.IoT Build 0:6ae2f7bca550 3876 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3877 internal_decoder_data->decode_to_value->value.ulong_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3878
Azure.IoT Build 0:6ae2f7bca550 3879 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3880 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3881 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3882 break;
Azure.IoT Build 0:6ae2f7bca550 3883 }
Azure.IoT Build 0:6ae2f7bca550 3884 /* Codes_SRS_AMQPVALUE_01_344: [<encoding name="smallulong" code="0x53" category="fixed" width="1" label="unsigned long value in the range 0 to 255 inclusive"/>] */
Azure.IoT Build 0:6ae2f7bca550 3885 case 0x53:
Azure.IoT Build 0:6ae2f7bca550 3886 {
Azure.IoT Build 0:6ae2f7bca550 3887 internal_decoder_data->decode_to_value->type = AMQP_TYPE_ULONG;
Azure.IoT Build 0:6ae2f7bca550 3888 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3889 internal_decoder_data->decode_to_value->value.ulong_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3890
Azure.IoT Build 0:6ae2f7bca550 3891 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3892 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3893 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3894 break;
Azure.IoT Build 0:6ae2f7bca550 3895 }
Azure.IoT Build 0:6ae2f7bca550 3896 /* Codes_SRS_AMQPVALUE_01_345: [<encoding name="ulong0" code="0x44" category="fixed" width="0" label="the ulong value 0"/>] */
Azure.IoT Build 0:6ae2f7bca550 3897 case 0x44:
Azure.IoT Build 0:6ae2f7bca550 3898 {
Azure.IoT Build 0:6ae2f7bca550 3899 /* Codes_SRS_AMQPVALUE_01_342: [1.6.6 ulong Integer in the range 0 to 264 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3900 internal_decoder_data->decode_to_value->type = AMQP_TYPE_ULONG;
Azure.IoT Build 0:6ae2f7bca550 3901 internal_decoder_data->decode_to_value->value.ulong_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3902 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 3903
Azure.IoT Build 0:6ae2f7bca550 3904 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 3905 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 3906 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 3907 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 3908 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3909 break;
Azure.IoT Build 0:6ae2f7bca550 3910 }
Azure.IoT Build 0:6ae2f7bca550 3911 /* Codes_SRS_AMQPVALUE_01_347: [<encoding code="0x51" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 3912 case 0x51:
Azure.IoT Build 0:6ae2f7bca550 3913 {
Azure.IoT Build 0:6ae2f7bca550 3914 /* Codes_SRS_AMQPVALUE_01_346: [1.6.7 byte Integer in the range -(27) to 27 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3915 internal_decoder_data->decode_to_value->type = AMQP_TYPE_BYTE;
Azure.IoT Build 0:6ae2f7bca550 3916 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3917 internal_decoder_data->decode_to_value->value.byte_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3918 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3919
Azure.IoT Build 0:6ae2f7bca550 3920 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3921 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3922 break;
Azure.IoT Build 0:6ae2f7bca550 3923 }
Azure.IoT Build 0:6ae2f7bca550 3924 /* Codes_SRS_AMQPVALUE_01_349: [<encoding code="0x61" category="fixed" width="2" label="16-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 3925 case 0x61:
Azure.IoT Build 0:6ae2f7bca550 3926 {
Azure.IoT Build 0:6ae2f7bca550 3927 /* Codes_SRS_AMQPVALUE_01_348: [1.6.8 short Integer in the range -(215) to 215 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3928 internal_decoder_data->decode_to_value->type = AMQP_TYPE_SHORT;
Azure.IoT Build 0:6ae2f7bca550 3929 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3930 internal_decoder_data->decode_to_value->value.short_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3931 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3932
Azure.IoT Build 0:6ae2f7bca550 3933 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3934 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3935 break;
Azure.IoT Build 0:6ae2f7bca550 3936 }
Azure.IoT Build 0:6ae2f7bca550 3937 /* Codes_SRS_AMQPVALUE_01_351: [<encoding code="0x71" category="fixed" width="4" label="32-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 3938 case 0x71:
Azure.IoT Build 0:6ae2f7bca550 3939 {
Azure.IoT Build 0:6ae2f7bca550 3940 /* Codes_SRS_AMQPVALUE_01_350: [1.6.9 int Integer in the range -(231) to 231 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3941 internal_decoder_data->decode_to_value->type = AMQP_TYPE_INT;
Azure.IoT Build 0:6ae2f7bca550 3942 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3943 internal_decoder_data->decode_to_value->value.int_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3944 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3945
Azure.IoT Build 0:6ae2f7bca550 3946 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3947 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3948 break;
Azure.IoT Build 0:6ae2f7bca550 3949 }
Azure.IoT Build 0:6ae2f7bca550 3950 /* Codes_SRS_AMQPVALUE_01_352: [<encoding name="smallint" code="0x54" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 3951 case 0x54:
Azure.IoT Build 0:6ae2f7bca550 3952 {
Azure.IoT Build 0:6ae2f7bca550 3953 /* Codes_SRS_AMQPVALUE_01_350: [1.6.9 int Integer in the range -(231) to 231 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3954 internal_decoder_data->decode_to_value->type = AMQP_TYPE_INT;
Azure.IoT Build 0:6ae2f7bca550 3955 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3956 internal_decoder_data->decode_to_value->value.int_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3957
Azure.IoT Build 0:6ae2f7bca550 3958 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3959 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3960 break;
Azure.IoT Build 0:6ae2f7bca550 3961 }
Azure.IoT Build 0:6ae2f7bca550 3962 /* Codes_SRS_AMQPVALUE_01_354: [<encoding code="0x81" category="fixed" width="8" label="64-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 3963 case 0x81:
Azure.IoT Build 0:6ae2f7bca550 3964 {
Azure.IoT Build 0:6ae2f7bca550 3965 /* Codes_SRS_AMQPVALUE_01_353: [1.6.10 long Integer in the range -(263) to 263 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3966 internal_decoder_data->decode_to_value->type = AMQP_TYPE_LONG;
Azure.IoT Build 0:6ae2f7bca550 3967 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3968 internal_decoder_data->decode_to_value->value.long_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3969 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 3970
Azure.IoT Build 0:6ae2f7bca550 3971 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3972 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3973 break;
Azure.IoT Build 0:6ae2f7bca550 3974 }
Azure.IoT Build 0:6ae2f7bca550 3975 /* Codes_SRS_AMQPVALUE_01_355: [<encoding name="smalllong" code="0x55" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 3976 case 0x55:
Azure.IoT Build 0:6ae2f7bca550 3977 {
Azure.IoT Build 0:6ae2f7bca550 3978 /* Codes_SRS_AMQPVALUE_01_353: [1.6.10 long Integer in the range -(263) to 263 - 1 inclusive.] */
Azure.IoT Build 0:6ae2f7bca550 3979 internal_decoder_data->decode_to_value->type = AMQP_TYPE_LONG;
Azure.IoT Build 0:6ae2f7bca550 3980 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 3981 internal_decoder_data->decode_to_value->value.long_value = 0;
Azure.IoT Build 0:6ae2f7bca550 3982
Azure.IoT Build 0:6ae2f7bca550 3983 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 3984 result = 0;
Azure.IoT Build 0:6ae2f7bca550 3985 break;
Azure.IoT Build 0:6ae2f7bca550 3986 }
AzureIoTClient 23:1111ee8bcba4 3987 /* Codes_SRS_AMQPVALUE_01_289: [\<encoding name="ieee-754" code="0x72" category="fixed" width="4" label="IEEE 754-2008 binary32"/>] */
AzureIoTClient 23:1111ee8bcba4 3988 case 0x72:
AzureIoTClient 23:1111ee8bcba4 3989 {
AzureIoTClient 23:1111ee8bcba4 3990 /* Codes_SRS_AMQPVALUE_01_019: [1.6.11 float 32-bit floating point number (IEEE 754-2008 binary32).] */
AzureIoTClient 23:1111ee8bcba4 3991 internal_decoder_data->decode_to_value->type = AMQP_TYPE_FLOAT;
AzureIoTClient 23:1111ee8bcba4 3992 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
AzureIoTClient 23:1111ee8bcba4 3993 internal_decoder_data->bytes_decoded = 0;
AzureIoTClient 23:1111ee8bcba4 3994 *((uint32_t*)&internal_decoder_data->decode_to_value->value.float_value) = 0;
AzureIoTClient 23:1111ee8bcba4 3995
AzureIoTClient 23:1111ee8bcba4 3996 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
AzureIoTClient 23:1111ee8bcba4 3997 result = 0;
AzureIoTClient 23:1111ee8bcba4 3998 break;
AzureIoTClient 23:1111ee8bcba4 3999 }
AzureIoTClient 23:1111ee8bcba4 4000 /* Codes_SRS_AMQPVALUE_01_290: [\<encoding name="ieee-754" code="0x82" category="fixed" width="8" label="IEEE 754-2008 binary64"/>] */
AzureIoTClient 23:1111ee8bcba4 4001 case 0x82:
AzureIoTClient 23:1111ee8bcba4 4002 {
AzureIoTClient 23:1111ee8bcba4 4003 /* Codes_SRS_AMQPVALUE_01_020: [1.6.12 double 64-bit floating point number (IEEE 754-2008 binary64).] */
AzureIoTClient 23:1111ee8bcba4 4004 internal_decoder_data->decode_to_value->type = AMQP_TYPE_DOUBLE;
AzureIoTClient 23:1111ee8bcba4 4005 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
AzureIoTClient 23:1111ee8bcba4 4006 internal_decoder_data->bytes_decoded = 0;
AzureIoTClient 23:1111ee8bcba4 4007 *((uint64_t*)&internal_decoder_data->decode_to_value->value.double_value) = 0;
AzureIoTClient 23:1111ee8bcba4 4008
AzureIoTClient 23:1111ee8bcba4 4009 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
AzureIoTClient 23:1111ee8bcba4 4010 result = 0;
AzureIoTClient 23:1111ee8bcba4 4011 break;
AzureIoTClient 23:1111ee8bcba4 4012 }
AzureIoTClient 23:1111ee8bcba4 4013 /* Codes_SRS_AMQPVALUE_01_369: [<encoding name="ms64" code="0x83" category="fixed" width="8" label="64-bit two's-complement integer representing milliseconds since the unix epoch"/>] */
Azure.IoT Build 0:6ae2f7bca550 4014 case 0x83:
Azure.IoT Build 0:6ae2f7bca550 4015 {
Azure.IoT Build 0:6ae2f7bca550 4016 /* Codes_SRS_AMQPVALUE_01_368: [1.6.17 timestamp An absolute point in time.] */
Azure.IoT Build 0:6ae2f7bca550 4017 internal_decoder_data->decode_to_value->type = AMQP_TYPE_TIMESTAMP;
Azure.IoT Build 0:6ae2f7bca550 4018 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4019 internal_decoder_data->decode_to_value->value.timestamp_value = 0;
Azure.IoT Build 0:6ae2f7bca550 4020 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4021
Azure.IoT Build 0:6ae2f7bca550 4022 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4023 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4024 break;
Azure.IoT Build 0:6ae2f7bca550 4025 }
Azure.IoT Build 0:6ae2f7bca550 4026 /* Codes_SRS_AMQPVALUE_01_371: [<encoding code="0x98" category="fixed" width="16" label="UUID as defined in section 4.1.2 of RFC-4122"/>] */
Azure.IoT Build 0:6ae2f7bca550 4027 case 0x98:
Azure.IoT Build 0:6ae2f7bca550 4028 {
Azure.IoT Build 0:6ae2f7bca550 4029 /* Codes_SRS_AMQPVALUE_01_370: [1.6.18 uuid A universally unique identifier as defined by RFC-4122 section 4.1.2 .] */
Azure.IoT Build 0:6ae2f7bca550 4030 internal_decoder_data->decode_to_value->type = AMQP_TYPE_UUID;
Azure.IoT Build 0:6ae2f7bca550 4031 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4032 internal_decoder_data->decode_to_value->value.timestamp_value = 0;
Azure.IoT Build 0:6ae2f7bca550 4033 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4034
Azure.IoT Build 0:6ae2f7bca550 4035 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4036 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4037 break;
Azure.IoT Build 0:6ae2f7bca550 4038 }
Azure.IoT Build 0:6ae2f7bca550 4039 /* Codes_SRS_AMQPVALUE_01_373: [<encoding name="vbin8" code="0xa0" category="variable" width="1" label="up to 2^8 - 1 octets of binary data"/>] */
Azure.IoT Build 0:6ae2f7bca550 4040 case 0xA0:
Azure.IoT Build 0:6ae2f7bca550 4041 /* Codes_SRS_AMQPVALUE_01_374: [<encoding name="vbin32" code="0xb0" category="variable" width="4" label="up to 2^32 - 1 octets of binary data"/>] */
Azure.IoT Build 0:6ae2f7bca550 4042 case 0xB0:
Azure.IoT Build 0:6ae2f7bca550 4043 {
Azure.IoT Build 0:6ae2f7bca550 4044 /* Codes_SRS_AMQPVALUE_01_372: [1.6.19 binary A sequence of octets.] */
Azure.IoT Build 0:6ae2f7bca550 4045 internal_decoder_data->decode_to_value->type = AMQP_TYPE_BINARY;
Azure.IoT Build 0:6ae2f7bca550 4046 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4047 internal_decoder_data->decode_to_value->value.binary_value.length = 0;
Azure.IoT Build 0:6ae2f7bca550 4048 internal_decoder_data->decode_to_value->value.binary_value.bytes = NULL;
Azure.IoT Build 0:6ae2f7bca550 4049 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4050
Azure.IoT Build 0:6ae2f7bca550 4051 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4052 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4053 break;
Azure.IoT Build 0:6ae2f7bca550 4054 }
Azure.IoT Build 0:6ae2f7bca550 4055 /* Codes_SRS_AMQPVALUE_01_376: [<encoding name="str8-utf8" code="0xa1" category="variable" width="1" label="up to 2^8 - 1 octets worth of UTF-8 Unicode (with no byte order mark)"/>] */
Azure.IoT Build 0:6ae2f7bca550 4056 case 0xA1:
Azure.IoT Build 0:6ae2f7bca550 4057 /* Codes_SRS_AMQPVALUE_01_377: [<encoding name="str32-utf8" code="0xb1" category="variable" width="4" label="up to 2^32 - 1 octets worth of UTF-8 Unicode (with no byte order mark)"/>] */
Azure.IoT Build 0:6ae2f7bca550 4058 case 0xB1:
Azure.IoT Build 0:6ae2f7bca550 4059 {
Azure.IoT Build 0:6ae2f7bca550 4060 /* Codes_SRS_AMQPVALUE_01_375: [1.6.20 string A sequence of Unicode characters.] */
Azure.IoT Build 0:6ae2f7bca550 4061 internal_decoder_data->decode_to_value->type = AMQP_TYPE_STRING;
Azure.IoT Build 0:6ae2f7bca550 4062 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4063 internal_decoder_data->decode_to_value->value.string_value.chars = NULL;
Azure.IoT Build 0:6ae2f7bca550 4064 internal_decoder_data->decode_value_state.string_value_state.length = 0;
Azure.IoT Build 0:6ae2f7bca550 4065 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4066
Azure.IoT Build 0:6ae2f7bca550 4067 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4068 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4069 break;
Azure.IoT Build 0:6ae2f7bca550 4070 }
Azure.IoT Build 0:6ae2f7bca550 4071 /* Codes_SRS_AMQPVALUE_01_379: [<encoding name="sym8" code="0xa3" category="variable" width="1" label="up to 2^8 - 1 seven bit ASCII characters representing a symbolic value"/>] */
Azure.IoT Build 0:6ae2f7bca550 4072 case 0xA3:
Azure.IoT Build 0:6ae2f7bca550 4073 /* Codes_SRS_AMQPVALUE_01_380: [<encoding name="sym32" code="0xb3" category="variable" width="4" label="up to 2^32 - 1 seven bit ASCII characters representing a symbolic value"/>] */
Azure.IoT Build 0:6ae2f7bca550 4074 case 0xB3:
Azure.IoT Build 0:6ae2f7bca550 4075 {
Azure.IoT Build 0:6ae2f7bca550 4076 /* Codes_SRS_AMQPVALUE_01_378: [1.6.21 symbol Symbolic values from a constrained domain.] */
Azure.IoT Build 0:6ae2f7bca550 4077 internal_decoder_data->decode_to_value->type = AMQP_TYPE_SYMBOL;
Azure.IoT Build 0:6ae2f7bca550 4078 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4079 internal_decoder_data->decode_to_value->value.symbol_value.chars = NULL;
Azure.IoT Build 0:6ae2f7bca550 4080 internal_decoder_data->decode_value_state.symbol_value_state.length = 0;
Azure.IoT Build 0:6ae2f7bca550 4081 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4082
Azure.IoT Build 0:6ae2f7bca550 4083 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4084 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4085 break;
Azure.IoT Build 0:6ae2f7bca550 4086 }
Azure.IoT Build 0:6ae2f7bca550 4087 /* Codes_SRS_AMQPVALUE_01_384: [<encoding name="list0" code="0x45" category="fixed" width="0" label="the empty list (i.e. the list with no elements)"/>] */
Azure.IoT Build 0:6ae2f7bca550 4088 case 0x45:
Azure.IoT Build 0:6ae2f7bca550 4089 /* Codes_SRS_AMQPVALUE_01_383: [1.6.22 list A sequence of polymorphic values.] */
Azure.IoT Build 0:6ae2f7bca550 4090 internal_decoder_data->decode_to_value->type = AMQP_TYPE_LIST;
Azure.IoT Build 0:6ae2f7bca550 4091 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4092 internal_decoder_data->decode_to_value->value.list_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 4093 internal_decoder_data->decode_to_value->value.list_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 4094
Azure.IoT Build 0:6ae2f7bca550 4095 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4096 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4097 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4098 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4099 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4100 break;
Azure.IoT Build 0:6ae2f7bca550 4101
Azure.IoT Build 0:6ae2f7bca550 4102 /* Codes_SRS_AMQPVALUE_01_385: [<encoding name="list8" code="0xc0" category="compound" width="1" label="up to 2^8 - 1 list elements with total size less than 2^8 octets"/>] */
Azure.IoT Build 0:6ae2f7bca550 4103 case 0xC0:
Azure.IoT Build 0:6ae2f7bca550 4104 case 0xD0:
Azure.IoT Build 0:6ae2f7bca550 4105 internal_decoder_data->decode_to_value->type = AMQP_TYPE_LIST;
Azure.IoT Build 0:6ae2f7bca550 4106 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4107 internal_decoder_data->decode_to_value->value.list_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 4108 internal_decoder_data->decode_to_value->value.list_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 4109 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4110 internal_decoder_data->decode_value_state.list_value_state.list_value_state = DECODE_LIST_STEP_SIZE;
Azure.IoT Build 0:6ae2f7bca550 4111
Azure.IoT Build 0:6ae2f7bca550 4112 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4113 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4114 break;
Azure.IoT Build 0:6ae2f7bca550 4115
Azure.IoT Build 0:6ae2f7bca550 4116 case 0xC1:
Azure.IoT Build 0:6ae2f7bca550 4117 case 0xD1:
Azure.IoT Build 0:6ae2f7bca550 4118 internal_decoder_data->decode_to_value->type = AMQP_TYPE_MAP;
Azure.IoT Build 0:6ae2f7bca550 4119 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
Azure.IoT Build 0:6ae2f7bca550 4120 internal_decoder_data->decode_to_value->value.map_value.pair_count = 0;
Azure.IoT Build 0:6ae2f7bca550 4121 internal_decoder_data->decode_to_value->value.map_value.pairs = NULL;
Azure.IoT Build 0:6ae2f7bca550 4122 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4123 internal_decoder_data->decode_value_state.map_value_state.map_value_state = DECODE_MAP_STEP_SIZE;
Azure.IoT Build 0:6ae2f7bca550 4124
Azure.IoT Build 0:6ae2f7bca550 4125 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4126 break;
Azure.IoT Build 0:6ae2f7bca550 4127
Azure.IoT Build 0:6ae2f7bca550 4128 case 0xE0:
Azure.IoT Build 0:6ae2f7bca550 4129 case 0xF0:
Azure.IoT Build 0:6ae2f7bca550 4130 internal_decoder_data->decode_to_value->type = AMQP_TYPE_ARRAY;
Azure.IoT Build 0:6ae2f7bca550 4131 internal_decoder_data->decoder_state = DECODER_STATE_TYPE_DATA;
AzureIoTClient 17:923575db8b2d 4132 internal_decoder_data->decode_to_value->value.array_value.count = 0;
AzureIoTClient 17:923575db8b2d 4133 internal_decoder_data->decode_to_value->value.array_value.items = NULL;
Azure.IoT Build 0:6ae2f7bca550 4134 internal_decoder_data->bytes_decoded = 0;
AzureIoTClient 17:923575db8b2d 4135 internal_decoder_data->decode_value_state.array_value_state.array_value_state = DECODE_ARRAY_STEP_SIZE;
Azure.IoT Build 0:6ae2f7bca550 4136
Azure.IoT Build 0:6ae2f7bca550 4137 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4138 break;
Azure.IoT Build 0:6ae2f7bca550 4139 }
Azure.IoT Build 0:6ae2f7bca550 4140 break;
Azure.IoT Build 0:6ae2f7bca550 4141 }
Azure.IoT Build 0:6ae2f7bca550 4142
Azure.IoT Build 0:6ae2f7bca550 4143 case DECODER_STATE_TYPE_DATA:
Azure.IoT Build 0:6ae2f7bca550 4144 {
Azure.IoT Build 0:6ae2f7bca550 4145 switch (internal_decoder_data->constructor_byte)
Azure.IoT Build 0:6ae2f7bca550 4146 {
Azure.IoT Build 0:6ae2f7bca550 4147 default:
AzureIoTClient 23:1111ee8bcba4 4148 LogError("Invalid constructor byte: 0x%02x", internal_decoder_data->constructor_byte);
AzureIoTClient 23:1111ee8bcba4 4149 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 4150 break;
Azure.IoT Build 0:6ae2f7bca550 4151
Azure.IoT Build 0:6ae2f7bca550 4152 case 0x00: /* descriptor */
Azure.IoT Build 0:6ae2f7bca550 4153 {
Azure.IoT Build 0:6ae2f7bca550 4154 DECODE_DESCRIBED_VALUE_STEP step = internal_decoder_data->decode_value_state.described_value_state.described_value_state;
Azure.IoT Build 0:6ae2f7bca550 4155 switch (step)
Azure.IoT Build 0:6ae2f7bca550 4156 {
Azure.IoT Build 0:6ae2f7bca550 4157 default:
AzureIoTClient 23:1111ee8bcba4 4158 LogError("Invalid described value decode step: %d", step);
AzureIoTClient 23:1111ee8bcba4 4159 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4160 break;
Azure.IoT Build 0:6ae2f7bca550 4161
Azure.IoT Build 0:6ae2f7bca550 4162 case DECODE_DESCRIBED_VALUE_STEP_DESCRIPTOR:
Azure.IoT Build 0:6ae2f7bca550 4163 {
AzureIoTClient 6:641a9672db08 4164 size_t inner_used_bytes;
AzureIoTClient 6:641a9672db08 4165 if (internal_decoder_decode_bytes(internal_decoder_data->inner_decoder, buffer, size, &inner_used_bytes) != 0)
Azure.IoT Build 0:6ae2f7bca550 4166 {
AzureIoTClient 23:1111ee8bcba4 4167 LogError("Decoding bytes for described value failed");
AzureIoTClient 23:1111ee8bcba4 4168 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4169 }
Azure.IoT Build 0:6ae2f7bca550 4170 else
Azure.IoT Build 0:6ae2f7bca550 4171 {
Azure.IoT Build 0:6ae2f7bca550 4172 INTERNAL_DECODER_DATA* inner_decoder = (INTERNAL_DECODER_DATA*)internal_decoder_data->inner_decoder;
AzureIoTClient 6:641a9672db08 4173 buffer += inner_used_bytes;
AzureIoTClient 6:641a9672db08 4174 size -= inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 4175
Azure.IoT Build 0:6ae2f7bca550 4176 if (inner_decoder->decoder_state == DECODER_STATE_DONE)
Azure.IoT Build 0:6ae2f7bca550 4177 {
Azure.IoT Build 0:6ae2f7bca550 4178 internal_decoder_destroy(inner_decoder);
Azure.IoT Build 0:6ae2f7bca550 4179
AzureIoTClient 21:f9c433d8e6ca 4180 AMQP_VALUE_DATA* described_value = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 4181 if (described_value == NULL)
Azure.IoT Build 0:6ae2f7bca550 4182 {
Azure.IoT Build 0:6ae2f7bca550 4183 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4184 LogError("Could not allocate memory for AMQP value");
AzureIoTClient 23:1111ee8bcba4 4185 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4186 }
Azure.IoT Build 0:6ae2f7bca550 4187 else
Azure.IoT Build 0:6ae2f7bca550 4188 {
Azure.IoT Build 0:6ae2f7bca550 4189 described_value->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 4190 internal_decoder_data->decode_to_value->value.described_value.value = (AMQP_VALUE)described_value;
Azure.IoT Build 0:6ae2f7bca550 4191 internal_decoder_data->inner_decoder = internal_decoder_create(inner_decoder_callback, internal_decoder_data, described_value);
Azure.IoT Build 0:6ae2f7bca550 4192 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 4193 {
Azure.IoT Build 0:6ae2f7bca550 4194 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4195 LogError("Could not create inner decoder");
AzureIoTClient 23:1111ee8bcba4 4196 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4197 }
Azure.IoT Build 0:6ae2f7bca550 4198 else
Azure.IoT Build 0:6ae2f7bca550 4199 {
Azure.IoT Build 0:6ae2f7bca550 4200 internal_decoder_data->decode_value_state.described_value_state.described_value_state = DECODE_DESCRIBED_VALUE_STEP_VALUE;
Azure.IoT Build 0:6ae2f7bca550 4201 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4202 }
Azure.IoT Build 0:6ae2f7bca550 4203 }
Azure.IoT Build 0:6ae2f7bca550 4204 }
Azure.IoT Build 0:6ae2f7bca550 4205 else
Azure.IoT Build 0:6ae2f7bca550 4206 {
Azure.IoT Build 0:6ae2f7bca550 4207 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4208 }
Azure.IoT Build 0:6ae2f7bca550 4209 }
Azure.IoT Build 0:6ae2f7bca550 4210 break;
Azure.IoT Build 0:6ae2f7bca550 4211 }
Azure.IoT Build 0:6ae2f7bca550 4212 case DECODE_DESCRIBED_VALUE_STEP_VALUE:
Azure.IoT Build 0:6ae2f7bca550 4213 {
AzureIoTClient 6:641a9672db08 4214 size_t inner_used_bytes;
AzureIoTClient 6:641a9672db08 4215 if (internal_decoder_decode_bytes(internal_decoder_data->inner_decoder, buffer, size, &inner_used_bytes) != 0)
Azure.IoT Build 0:6ae2f7bca550 4216 {
AzureIoTClient 23:1111ee8bcba4 4217 LogError("Decoding bytes for described value failed");
AzureIoTClient 23:1111ee8bcba4 4218 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4219 }
Azure.IoT Build 0:6ae2f7bca550 4220 else
Azure.IoT Build 0:6ae2f7bca550 4221 {
Azure.IoT Build 0:6ae2f7bca550 4222 INTERNAL_DECODER_DATA* inner_decoder = (INTERNAL_DECODER_DATA*)internal_decoder_data->inner_decoder;
AzureIoTClient 6:641a9672db08 4223 buffer += inner_used_bytes;
AzureIoTClient 6:641a9672db08 4224 size -= inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 4225
Azure.IoT Build 0:6ae2f7bca550 4226 if (inner_decoder->decoder_state == DECODER_STATE_DONE)
Azure.IoT Build 0:6ae2f7bca550 4227 {
Azure.IoT Build 0:6ae2f7bca550 4228 internal_decoder_destroy(inner_decoder);
Azure.IoT Build 0:6ae2f7bca550 4229 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 4230
Azure.IoT Build 0:6ae2f7bca550 4231 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4232 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4233 }
Azure.IoT Build 0:6ae2f7bca550 4234
Azure.IoT Build 0:6ae2f7bca550 4235 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4236 }
Azure.IoT Build 0:6ae2f7bca550 4237 break;
Azure.IoT Build 0:6ae2f7bca550 4238 }
Azure.IoT Build 0:6ae2f7bca550 4239 }
Azure.IoT Build 0:6ae2f7bca550 4240 break;
Azure.IoT Build 0:6ae2f7bca550 4241 }
Azure.IoT Build 0:6ae2f7bca550 4242 case 0x56:
Azure.IoT Build 0:6ae2f7bca550 4243 {
Azure.IoT Build 0:6ae2f7bca550 4244 /* Codes_SRS_AMQPVALUE_01_331: [<encoding code="0x56" category="fixed" width="1" label="boolean with the octet 0x00 being false and octet 0x01 being true"/>] */
Azure.IoT Build 0:6ae2f7bca550 4245 if (buffer[0] >= 2)
Azure.IoT Build 0:6ae2f7bca550 4246 {
AzureIoTClient 23:1111ee8bcba4 4247 LogError("Bad boolean value: %02X", buffer[0]);
AzureIoTClient 23:1111ee8bcba4 4248 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4249 }
Azure.IoT Build 0:6ae2f7bca550 4250 else
Azure.IoT Build 0:6ae2f7bca550 4251 {
Azure.IoT Build 0:6ae2f7bca550 4252 internal_decoder_data->decode_to_value->value.bool_value = (buffer[0] == 0) ? false : true;
Azure.IoT Build 0:6ae2f7bca550 4253
Azure.IoT Build 0:6ae2f7bca550 4254 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4255 size--;
Azure.IoT Build 0:6ae2f7bca550 4256 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4257
Azure.IoT Build 0:6ae2f7bca550 4258 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4259 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4260 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4261 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4262 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4263 }
Azure.IoT Build 0:6ae2f7bca550 4264
Azure.IoT Build 0:6ae2f7bca550 4265 break;
Azure.IoT Build 0:6ae2f7bca550 4266 }
Azure.IoT Build 0:6ae2f7bca550 4267 /* Codes_SRS_AMQPVALUE_01_335: [<encoding code="0x50" category="fixed" width="1" label="8-bit unsigned integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 4268 case 0x50:
Azure.IoT Build 0:6ae2f7bca550 4269 {
Azure.IoT Build 0:6ae2f7bca550 4270 internal_decoder_data->decode_to_value->value.ubyte_value = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4271 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4272 size--;
Azure.IoT Build 0:6ae2f7bca550 4273 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4274
Azure.IoT Build 0:6ae2f7bca550 4275 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4276 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4277 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4278 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4279 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4280 break;
Azure.IoT Build 0:6ae2f7bca550 4281 }
Azure.IoT Build 0:6ae2f7bca550 4282 /* Codes_SRS_AMQPVALUE_01_337: [<encoding code="0x60" category="fixed" width="2" label="16-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4283 case 0x60:
Azure.IoT Build 0:6ae2f7bca550 4284 {
Azure.IoT Build 0:6ae2f7bca550 4285 internal_decoder_data->decode_to_value->value.ushort_value += ((uint16_t)buffer[0]) << ((1 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 4286 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4287 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4288 size--;
Azure.IoT Build 0:6ae2f7bca550 4289 if (internal_decoder_data->bytes_decoded == 2)
Azure.IoT Build 0:6ae2f7bca550 4290 {
Azure.IoT Build 0:6ae2f7bca550 4291 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4292
Azure.IoT Build 0:6ae2f7bca550 4293 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4294 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4295 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4296 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4297 }
Azure.IoT Build 0:6ae2f7bca550 4298
Azure.IoT Build 0:6ae2f7bca550 4299 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4300 break;
Azure.IoT Build 0:6ae2f7bca550 4301 }
Azure.IoT Build 0:6ae2f7bca550 4302 /* Codes_SRS_AMQPVALUE_01_339: [<encoding code="0x70" category="fixed" width="4" label="32-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4303 case 0x70:
Azure.IoT Build 0:6ae2f7bca550 4304 {
Azure.IoT Build 0:6ae2f7bca550 4305 internal_decoder_data->decode_to_value->value.uint_value += ((uint32_t)buffer[0]) << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 4306 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4307 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4308 size--;
Azure.IoT Build 0:6ae2f7bca550 4309
Azure.IoT Build 0:6ae2f7bca550 4310 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4311 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 4312 {
Azure.IoT Build 0:6ae2f7bca550 4313 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4314
Azure.IoT Build 0:6ae2f7bca550 4315 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4316 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4317 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4318 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4319 }
Azure.IoT Build 0:6ae2f7bca550 4320
Azure.IoT Build 0:6ae2f7bca550 4321 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4322 break;
Azure.IoT Build 0:6ae2f7bca550 4323 }
Azure.IoT Build 0:6ae2f7bca550 4324 /* Codes_SRS_AMQPVALUE_01_340: [<encoding name="smalluint" code="0x52" category="fixed" width="1" label="unsigned integer value in the range 0 to 255 inclusive"/>] */
Azure.IoT Build 0:6ae2f7bca550 4325 case 0x52:
Azure.IoT Build 0:6ae2f7bca550 4326 {
Azure.IoT Build 0:6ae2f7bca550 4327 internal_decoder_data->decode_to_value->value.uint_value = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4328 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4329 size--;
Azure.IoT Build 0:6ae2f7bca550 4330 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4331
Azure.IoT Build 0:6ae2f7bca550 4332 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4333 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4334 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4335 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4336 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4337 break;
Azure.IoT Build 0:6ae2f7bca550 4338 }
Azure.IoT Build 0:6ae2f7bca550 4339 /* Codes_SRS_AMQPVALUE_01_343: [<encoding code="0x80" category="fixed" width="8" label="64-bit unsigned integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4340 case 0x80:
Azure.IoT Build 0:6ae2f7bca550 4341 {
Azure.IoT Build 0:6ae2f7bca550 4342 internal_decoder_data->decode_to_value->value.ulong_value += ((uint64_t)buffer[0]) << ((7 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 4343 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4344 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4345 size--;
Azure.IoT Build 0:6ae2f7bca550 4346
Azure.IoT Build 0:6ae2f7bca550 4347 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4348 if (internal_decoder_data->bytes_decoded == 8)
Azure.IoT Build 0:6ae2f7bca550 4349 {
Azure.IoT Build 0:6ae2f7bca550 4350 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4351
Azure.IoT Build 0:6ae2f7bca550 4352 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4353 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4354 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4355 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4356 }
Azure.IoT Build 0:6ae2f7bca550 4357
Azure.IoT Build 0:6ae2f7bca550 4358 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4359 break;
Azure.IoT Build 0:6ae2f7bca550 4360 }
Azure.IoT Build 0:6ae2f7bca550 4361 /* Codes_SRS_AMQPVALUE_01_344: [<encoding name="smallulong" code="0x53" category="fixed" width="1" label="unsigned long value in the range 0 to 255 inclusive"/>] */
Azure.IoT Build 0:6ae2f7bca550 4362 case 0x53:
Azure.IoT Build 0:6ae2f7bca550 4363 {
Azure.IoT Build 0:6ae2f7bca550 4364 internal_decoder_data->decode_to_value->value.ulong_value = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4365 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4366 size--;
Azure.IoT Build 0:6ae2f7bca550 4367 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4368
Azure.IoT Build 0:6ae2f7bca550 4369 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4370 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4371 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4372 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4373 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4374 break;
Azure.IoT Build 0:6ae2f7bca550 4375 }
Azure.IoT Build 0:6ae2f7bca550 4376 /* Codes_SRS_AMQPVALUE_01_347: [<encoding code="0x51" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 4377 case 0x51:
Azure.IoT Build 0:6ae2f7bca550 4378 {
Azure.IoT Build 0:6ae2f7bca550 4379 internal_decoder_data->decode_to_value->value.byte_value = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4380 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4381 size--;
Azure.IoT Build 0:6ae2f7bca550 4382 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4383
Azure.IoT Build 0:6ae2f7bca550 4384 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4385 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4386 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4387 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4388 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4389 break;
Azure.IoT Build 0:6ae2f7bca550 4390 }
Azure.IoT Build 0:6ae2f7bca550 4391 /* Codes_SRS_AMQPVALUE_01_349: [<encoding code="0x61" category="fixed" width="2" label="16-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4392 case 0x61:
Azure.IoT Build 0:6ae2f7bca550 4393 {
Azure.IoT Build 0:6ae2f7bca550 4394 internal_decoder_data->decode_to_value->value.short_value = (int16_t)((uint16_t)internal_decoder_data->decode_to_value->value.short_value + (((uint16_t)buffer[0]) << ((1 - internal_decoder_data->bytes_decoded) * 8)));
Azure.IoT Build 0:6ae2f7bca550 4395 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4396 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4397 size--;
Azure.IoT Build 0:6ae2f7bca550 4398
Azure.IoT Build 0:6ae2f7bca550 4399 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4400 if (internal_decoder_data->bytes_decoded == 2)
Azure.IoT Build 0:6ae2f7bca550 4401 {
Azure.IoT Build 0:6ae2f7bca550 4402 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4403
Azure.IoT Build 0:6ae2f7bca550 4404 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4405 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4406 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4407 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4408 }
Azure.IoT Build 0:6ae2f7bca550 4409
Azure.IoT Build 0:6ae2f7bca550 4410 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4411 break;
Azure.IoT Build 0:6ae2f7bca550 4412 }
Azure.IoT Build 0:6ae2f7bca550 4413 /* Codes_SRS_AMQPVALUE_01_351: [<encoding code="0x71" category="fixed" width="4" label="32-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4414 case 0x71:
Azure.IoT Build 0:6ae2f7bca550 4415 {
Azure.IoT Build 0:6ae2f7bca550 4416 internal_decoder_data->decode_to_value->value.int_value = (int32_t)((uint32_t)internal_decoder_data->decode_to_value->value.int_value + (((uint32_t)buffer[0]) << ((3 - internal_decoder_data->bytes_decoded) * 8)));
Azure.IoT Build 0:6ae2f7bca550 4417 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4418 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4419 size--;
Azure.IoT Build 0:6ae2f7bca550 4420
Azure.IoT Build 0:6ae2f7bca550 4421 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4422 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 4423 {
Azure.IoT Build 0:6ae2f7bca550 4424 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4425
Azure.IoT Build 0:6ae2f7bca550 4426 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4427 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4428 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4429 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4430 }
Azure.IoT Build 0:6ae2f7bca550 4431
Azure.IoT Build 0:6ae2f7bca550 4432 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4433 break;
Azure.IoT Build 0:6ae2f7bca550 4434 }
Azure.IoT Build 0:6ae2f7bca550 4435 /* Codes_SRS_AMQPVALUE_01_351: [<encoding code="0x71" category="fixed" width="4" label="32-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4436 case 0x54:
Azure.IoT Build 0:6ae2f7bca550 4437 {
Azure.IoT Build 0:6ae2f7bca550 4438 internal_decoder_data->decode_to_value->value.int_value = (int32_t)((int8_t)(buffer[0]));
Azure.IoT Build 0:6ae2f7bca550 4439 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4440 size--;
Azure.IoT Build 0:6ae2f7bca550 4441 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4442
Azure.IoT Build 0:6ae2f7bca550 4443 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4444 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4445 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4446 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4447 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4448 break;
Azure.IoT Build 0:6ae2f7bca550 4449 }
Azure.IoT Build 0:6ae2f7bca550 4450 /* Codes_SRS_AMQPVALUE_01_354: [<encoding code="0x81" category="fixed" width="8" label="64-bit two's-complement integer in network byte order"/>] */
Azure.IoT Build 0:6ae2f7bca550 4451 case 0x81:
Azure.IoT Build 0:6ae2f7bca550 4452 {
Azure.IoT Build 0:6ae2f7bca550 4453 internal_decoder_data->decode_to_value->value.long_value = (int64_t)((uint64_t)internal_decoder_data->decode_to_value->value.long_value + (((uint64_t)buffer[0]) << ((7 - internal_decoder_data->bytes_decoded) * 8)));
Azure.IoT Build 0:6ae2f7bca550 4454 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4455 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4456 size--;
Azure.IoT Build 0:6ae2f7bca550 4457
Azure.IoT Build 0:6ae2f7bca550 4458 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4459 if (internal_decoder_data->bytes_decoded == 8)
Azure.IoT Build 0:6ae2f7bca550 4460 {
Azure.IoT Build 0:6ae2f7bca550 4461 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4462
Azure.IoT Build 0:6ae2f7bca550 4463 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4464 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4465 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4466 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4467 }
Azure.IoT Build 0:6ae2f7bca550 4468
Azure.IoT Build 0:6ae2f7bca550 4469 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4470 break;
Azure.IoT Build 0:6ae2f7bca550 4471 }
Azure.IoT Build 0:6ae2f7bca550 4472 /* Codes_SRS_AMQPVALUE_01_355: [<encoding name="smalllong" code="0x55" category="fixed" width="1" label="8-bit two's-complement integer"/>] */
Azure.IoT Build 0:6ae2f7bca550 4473 case 0x55:
Azure.IoT Build 0:6ae2f7bca550 4474 {
Azure.IoT Build 0:6ae2f7bca550 4475 internal_decoder_data->decode_to_value->value.long_value = (int64_t)((int8_t)buffer[0]);
Azure.IoT Build 0:6ae2f7bca550 4476 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4477 size--;
Azure.IoT Build 0:6ae2f7bca550 4478 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4479
Azure.IoT Build 0:6ae2f7bca550 4480 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4481 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4482 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4483 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4484 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4485 break;
Azure.IoT Build 0:6ae2f7bca550 4486 }
AzureIoTClient 23:1111ee8bcba4 4487 /* Codes_SRS_AMQPVALUE_01_289: [\<encoding name="ieee-754" code="0x72" category="fixed" width="4" label="IEEE 754-2008 binary32"/>] */
AzureIoTClient 23:1111ee8bcba4 4488 case 0x72:
AzureIoTClient 23:1111ee8bcba4 4489 {
AzureIoTClient 23:1111ee8bcba4 4490 *((uint32_t*)&internal_decoder_data->decode_to_value->value.float_value) += ((uint32_t)buffer[0]) << ((3 - internal_decoder_data->bytes_decoded) * 8);
AzureIoTClient 23:1111ee8bcba4 4491 internal_decoder_data->bytes_decoded++;
AzureIoTClient 23:1111ee8bcba4 4492 buffer++;
AzureIoTClient 23:1111ee8bcba4 4493 size--;
AzureIoTClient 23:1111ee8bcba4 4494
AzureIoTClient 23:1111ee8bcba4 4495 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
AzureIoTClient 23:1111ee8bcba4 4496 if (internal_decoder_data->bytes_decoded == 4)
AzureIoTClient 23:1111ee8bcba4 4497 {
AzureIoTClient 23:1111ee8bcba4 4498 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4499
AzureIoTClient 23:1111ee8bcba4 4500 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
AzureIoTClient 23:1111ee8bcba4 4501 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
AzureIoTClient 23:1111ee8bcba4 4502 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
AzureIoTClient 23:1111ee8bcba4 4503 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
AzureIoTClient 23:1111ee8bcba4 4504 }
AzureIoTClient 23:1111ee8bcba4 4505
AzureIoTClient 23:1111ee8bcba4 4506 result = 0;
AzureIoTClient 23:1111ee8bcba4 4507 break;
AzureIoTClient 23:1111ee8bcba4 4508 }
AzureIoTClient 23:1111ee8bcba4 4509 /* Codes_SRS_AMQPVALUE_01_290: [\<encoding name="ieee-754" code="0x82" category="fixed" width="8" label="IEEE 754-2008 binary64"/>]*/
AzureIoTClient 23:1111ee8bcba4 4510 case 0x82:
AzureIoTClient 23:1111ee8bcba4 4511 {
AzureIoTClient 23:1111ee8bcba4 4512 *((uint64_t*)&internal_decoder_data->decode_to_value->value.double_value) += ((uint64_t)buffer[0]) << ((7 - internal_decoder_data->bytes_decoded) * 8);
AzureIoTClient 23:1111ee8bcba4 4513 internal_decoder_data->bytes_decoded++;
AzureIoTClient 23:1111ee8bcba4 4514 buffer++;
AzureIoTClient 23:1111ee8bcba4 4515 size--;
AzureIoTClient 23:1111ee8bcba4 4516
AzureIoTClient 23:1111ee8bcba4 4517 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
AzureIoTClient 23:1111ee8bcba4 4518 if (internal_decoder_data->bytes_decoded == 8)
AzureIoTClient 23:1111ee8bcba4 4519 {
AzureIoTClient 23:1111ee8bcba4 4520 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4521
AzureIoTClient 23:1111ee8bcba4 4522 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
AzureIoTClient 23:1111ee8bcba4 4523 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
AzureIoTClient 23:1111ee8bcba4 4524 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
AzureIoTClient 23:1111ee8bcba4 4525 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
AzureIoTClient 23:1111ee8bcba4 4526 }
AzureIoTClient 23:1111ee8bcba4 4527
AzureIoTClient 23:1111ee8bcba4 4528 result = 0;
AzureIoTClient 23:1111ee8bcba4 4529 break;
AzureIoTClient 23:1111ee8bcba4 4530 }
AzureIoTClient 23:1111ee8bcba4 4531 /* Codes_SRS_AMQPVALUE_01_369: [<encoding name="ms64" code="0x83" category="fixed" width="8" label="64-bit two's-complement integer representing milliseconds since the unix epoch"/>] */
Azure.IoT Build 0:6ae2f7bca550 4532 case 0x83:
Azure.IoT Build 0:6ae2f7bca550 4533 {
Azure.IoT Build 0:6ae2f7bca550 4534 internal_decoder_data->decode_to_value->value.timestamp_value = (int64_t)((uint64_t)internal_decoder_data->decode_to_value->value.timestamp_value + (((uint64_t)buffer[0]) << ((7 - internal_decoder_data->bytes_decoded) * 8)));
Azure.IoT Build 0:6ae2f7bca550 4535 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4536 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4537 size--;
Azure.IoT Build 0:6ae2f7bca550 4538
Azure.IoT Build 0:6ae2f7bca550 4539 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4540 if (internal_decoder_data->bytes_decoded == 8)
Azure.IoT Build 0:6ae2f7bca550 4541 {
Azure.IoT Build 0:6ae2f7bca550 4542 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4543
Azure.IoT Build 0:6ae2f7bca550 4544 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4545 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4546 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4547 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4548 }
Azure.IoT Build 0:6ae2f7bca550 4549
Azure.IoT Build 0:6ae2f7bca550 4550 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4551 break;
Azure.IoT Build 0:6ae2f7bca550 4552 }
Azure.IoT Build 0:6ae2f7bca550 4553 /* Codes_SRS_AMQPVALUE_01_369: [<encoding name="ms64" code="0x83" category="fixed" width="8" label="64-bit two's-complement integer representing milliseconds since the unix epoch"/>] */
Azure.IoT Build 0:6ae2f7bca550 4554 case 0x98:
Azure.IoT Build 0:6ae2f7bca550 4555 {
Azure.IoT Build 0:6ae2f7bca550 4556 size_t to_copy = 16 - internal_decoder_data->bytes_decoded;
Azure.IoT Build 0:6ae2f7bca550 4557 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4558 {
Azure.IoT Build 0:6ae2f7bca550 4559 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4560 }
Azure.IoT Build 0:6ae2f7bca550 4561
Azure.IoT Build 0:6ae2f7bca550 4562 (void)memcpy(&internal_decoder_data->decode_to_value->value.uuid_value[internal_decoder_data->bytes_decoded], buffer, to_copy);
Azure.IoT Build 0:6ae2f7bca550 4563 internal_decoder_data->bytes_decoded += to_copy;
Azure.IoT Build 0:6ae2f7bca550 4564 buffer += to_copy;
Azure.IoT Build 0:6ae2f7bca550 4565 size -= to_copy;
Azure.IoT Build 0:6ae2f7bca550 4566
Azure.IoT Build 0:6ae2f7bca550 4567 /* Codes_SRS_AMQPVALUE_01_327: [If not enough bytes have accumulated to decode a value, the on_value_decoded shall not be called.] */
Azure.IoT Build 0:6ae2f7bca550 4568 if (internal_decoder_data->bytes_decoded == 16)
Azure.IoT Build 0:6ae2f7bca550 4569 {
Azure.IoT Build 0:6ae2f7bca550 4570 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4571
Azure.IoT Build 0:6ae2f7bca550 4572 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4573 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4574 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4575 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4576 }
Azure.IoT Build 0:6ae2f7bca550 4577
Azure.IoT Build 0:6ae2f7bca550 4578 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4579 break;
Azure.IoT Build 0:6ae2f7bca550 4580 }
Azure.IoT Build 0:6ae2f7bca550 4581 /* Codes_SRS_AMQPVALUE_01_373: [<encoding name="vbin8" code="0xa0" category="variable" width="1" label="up to 2^8 - 1 octets of binary data"/>] */
Azure.IoT Build 0:6ae2f7bca550 4582 case 0xA0:
Azure.IoT Build 0:6ae2f7bca550 4583 {
Azure.IoT Build 0:6ae2f7bca550 4584 if (internal_decoder_data->bytes_decoded == 0)
Azure.IoT Build 0:6ae2f7bca550 4585 {
Azure.IoT Build 0:6ae2f7bca550 4586 internal_decoder_data->decode_to_value->value.binary_value.length = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4587 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4588 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4589 size--;
Azure.IoT Build 0:6ae2f7bca550 4590
Azure.IoT Build 0:6ae2f7bca550 4591 if (internal_decoder_data->decode_to_value->value.binary_value.length == 0)
Azure.IoT Build 0:6ae2f7bca550 4592 {
Azure.IoT Build 0:6ae2f7bca550 4593 internal_decoder_data->decode_to_value->value.binary_value.bytes = NULL;
Azure.IoT Build 0:6ae2f7bca550 4594
Azure.IoT Build 0:6ae2f7bca550 4595 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4596 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4597 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4598 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4599 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4600 }
Azure.IoT Build 0:6ae2f7bca550 4601 else
Azure.IoT Build 0:6ae2f7bca550 4602 {
AzureIoTClient 21:f9c433d8e6ca 4603 internal_decoder_data->decode_to_value->value.binary_value.bytes = (unsigned char*)malloc(internal_decoder_data->decode_to_value->value.binary_value.length);
Azure.IoT Build 0:6ae2f7bca550 4604 if (internal_decoder_data->decode_to_value->value.binary_value.bytes == NULL)
Azure.IoT Build 0:6ae2f7bca550 4605 {
AzureIoTClient 23:1111ee8bcba4 4606 /* Codes_SRS_AMQPVALUE_01_326: [If any allocation failure occurs during decoding, amqpvalue_decode_bytes shall fail and return a non-zero value.] */
AzureIoTClient 23:1111ee8bcba4 4607 LogError("Cannot allocate memory for decoded binary value");
AzureIoTClient 23:1111ee8bcba4 4608 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 19:000ab4e6a2c1 4609 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4610 }
Azure.IoT Build 0:6ae2f7bca550 4611 else
Azure.IoT Build 0:6ae2f7bca550 4612 {
Azure.IoT Build 0:6ae2f7bca550 4613 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4614 }
Azure.IoT Build 0:6ae2f7bca550 4615 }
Azure.IoT Build 0:6ae2f7bca550 4616 }
Azure.IoT Build 0:6ae2f7bca550 4617 else
Azure.IoT Build 0:6ae2f7bca550 4618 {
AzureIoTClient 6:641a9672db08 4619 size_t to_copy = internal_decoder_data->decode_to_value->value.binary_value.length - (internal_decoder_data->bytes_decoded - 1);
Azure.IoT Build 0:6ae2f7bca550 4620 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4621 {
Azure.IoT Build 0:6ae2f7bca550 4622 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4623 }
Azure.IoT Build 0:6ae2f7bca550 4624
Azure.IoT Build 0:6ae2f7bca550 4625 (void)memcpy((unsigned char*)(internal_decoder_data->decode_to_value->value.binary_value.bytes) + (internal_decoder_data->bytes_decoded - 1), buffer, to_copy);
Azure.IoT Build 0:6ae2f7bca550 4626
Azure.IoT Build 0:6ae2f7bca550 4627 buffer += to_copy;
Azure.IoT Build 0:6ae2f7bca550 4628 size -= to_copy;
Azure.IoT Build 0:6ae2f7bca550 4629 internal_decoder_data->bytes_decoded += to_copy;
Azure.IoT Build 0:6ae2f7bca550 4630
Azure.IoT Build 0:6ae2f7bca550 4631 if (internal_decoder_data->bytes_decoded == internal_decoder_data->decode_to_value->value.binary_value.length + 1)
Azure.IoT Build 0:6ae2f7bca550 4632 {
Azure.IoT Build 0:6ae2f7bca550 4633 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 4634
Azure.IoT Build 0:6ae2f7bca550 4635 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4636 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4637 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4638 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4639 }
Azure.IoT Build 0:6ae2f7bca550 4640
Azure.IoT Build 0:6ae2f7bca550 4641 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4642 }
Azure.IoT Build 0:6ae2f7bca550 4643
Azure.IoT Build 0:6ae2f7bca550 4644 break;
Azure.IoT Build 0:6ae2f7bca550 4645 }
Azure.IoT Build 0:6ae2f7bca550 4646 /* Codes_SRS_AMQPVALUE_01_374: [<encoding name="vbin32" code="0xb0" category="variable" width="4" label="up to 2^32 - 1 octets of binary data"/>] */
Azure.IoT Build 0:6ae2f7bca550 4647 case 0xB0:
Azure.IoT Build 0:6ae2f7bca550 4648 {
Azure.IoT Build 0:6ae2f7bca550 4649 if (internal_decoder_data->bytes_decoded < 4)
Azure.IoT Build 0:6ae2f7bca550 4650 {
Azure.IoT Build 0:6ae2f7bca550 4651 internal_decoder_data->decode_to_value->value.binary_value.length += buffer[0] << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 4652 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4653 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4654 size--;
Azure.IoT Build 0:6ae2f7bca550 4655
Azure.IoT Build 0:6ae2f7bca550 4656 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 4657 {
Azure.IoT Build 0:6ae2f7bca550 4658 if (internal_decoder_data->decode_to_value->value.binary_value.length == 0)
Azure.IoT Build 0:6ae2f7bca550 4659 {
Azure.IoT Build 0:6ae2f7bca550 4660 internal_decoder_data->decode_to_value->value.binary_value.bytes = NULL;
Azure.IoT Build 0:6ae2f7bca550 4661
Azure.IoT Build 0:6ae2f7bca550 4662 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4663 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4664 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4665 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4666 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4667 }
Azure.IoT Build 0:6ae2f7bca550 4668 else
Azure.IoT Build 0:6ae2f7bca550 4669 {
AzureIoTClient 21:f9c433d8e6ca 4670 internal_decoder_data->decode_to_value->value.binary_value.bytes = (unsigned char*)malloc(internal_decoder_data->decode_to_value->value.binary_value.length + 1);
Azure.IoT Build 0:6ae2f7bca550 4671 if (internal_decoder_data->decode_to_value->value.binary_value.bytes == NULL)
Azure.IoT Build 0:6ae2f7bca550 4672 {
Azure.IoT Build 0:6ae2f7bca550 4673 /* Codes_SRS_AMQPVALUE_01_326: [If any allocation failure occurs during decoding, amqpvalue_decode_bytes shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 4674 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4675 LogError("Cannot allocate memory for decoded binary value");
AzureIoTClient 23:1111ee8bcba4 4676 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4677 }
Azure.IoT Build 0:6ae2f7bca550 4678 else
Azure.IoT Build 0:6ae2f7bca550 4679 {
Azure.IoT Build 0:6ae2f7bca550 4680 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4681 }
Azure.IoT Build 0:6ae2f7bca550 4682 }
Azure.IoT Build 0:6ae2f7bca550 4683 }
Azure.IoT Build 0:6ae2f7bca550 4684 else
Azure.IoT Build 0:6ae2f7bca550 4685 {
Azure.IoT Build 0:6ae2f7bca550 4686 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4687 }
Azure.IoT Build 0:6ae2f7bca550 4688 }
Azure.IoT Build 0:6ae2f7bca550 4689 else
Azure.IoT Build 0:6ae2f7bca550 4690 {
AzureIoTClient 6:641a9672db08 4691 size_t to_copy = internal_decoder_data->decode_to_value->value.binary_value.length - (internal_decoder_data->bytes_decoded - 4);
Azure.IoT Build 0:6ae2f7bca550 4692 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4693 {
Azure.IoT Build 0:6ae2f7bca550 4694 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4695 }
Azure.IoT Build 0:6ae2f7bca550 4696
AzureIoTClient 23:1111ee8bcba4 4697 (void)memcpy((unsigned char*)(internal_decoder_data->decode_to_value->value.binary_value.bytes) + (internal_decoder_data->bytes_decoded - 4), buffer, to_copy);
AzureIoTClient 23:1111ee8bcba4 4698 buffer += to_copy;
AzureIoTClient 23:1111ee8bcba4 4699 size -= to_copy;
AzureIoTClient 23:1111ee8bcba4 4700 internal_decoder_data->bytes_decoded += to_copy;
AzureIoTClient 23:1111ee8bcba4 4701
AzureIoTClient 23:1111ee8bcba4 4702 if (internal_decoder_data->bytes_decoded == internal_decoder_data->decode_to_value->value.binary_value.length + 4)
Azure.IoT Build 0:6ae2f7bca550 4703 {
AzureIoTClient 23:1111ee8bcba4 4704 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4705 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4706 }
AzureIoTClient 23:1111ee8bcba4 4707
AzureIoTClient 23:1111ee8bcba4 4708 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4709 }
Azure.IoT Build 0:6ae2f7bca550 4710
Azure.IoT Build 0:6ae2f7bca550 4711 break;
Azure.IoT Build 0:6ae2f7bca550 4712 }
Azure.IoT Build 0:6ae2f7bca550 4713 /* Codes_SRS_AMQPVALUE_01_376: [<encoding name="str8-utf8" code="0xa1" category="variable" width="1" label="up to 2^8 - 1 octets worth of UTF-8 Unicode (with no byte order mark)"/>] */
Azure.IoT Build 0:6ae2f7bca550 4714 case 0xA1:
Azure.IoT Build 0:6ae2f7bca550 4715 {
Azure.IoT Build 0:6ae2f7bca550 4716 if (internal_decoder_data->bytes_decoded == 0)
Azure.IoT Build 0:6ae2f7bca550 4717 {
Azure.IoT Build 0:6ae2f7bca550 4718 internal_decoder_data->decode_value_state.string_value_state.length = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4719 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4720 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4721 size--;
Azure.IoT Build 0:6ae2f7bca550 4722
AzureIoTClient 21:f9c433d8e6ca 4723 internal_decoder_data->decode_to_value->value.string_value.chars = (char*)malloc(internal_decoder_data->decode_value_state.string_value_state.length + 1);
Azure.IoT Build 0:6ae2f7bca550 4724 if (internal_decoder_data->decode_to_value->value.string_value.chars == NULL)
Azure.IoT Build 0:6ae2f7bca550 4725 {
Azure.IoT Build 0:6ae2f7bca550 4726 /* Codes_SRS_AMQPVALUE_01_326: [If any allocation failure occurs during decoding, amqpvalue_decode_bytes shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 4727 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4728 LogError("Could not allocate memory for decoded string value");
AzureIoTClient 23:1111ee8bcba4 4729 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4730 }
Azure.IoT Build 0:6ae2f7bca550 4731 else
Azure.IoT Build 0:6ae2f7bca550 4732 {
Azure.IoT Build 0:6ae2f7bca550 4733 if (internal_decoder_data->decode_value_state.string_value_state.length == 0)
Azure.IoT Build 0:6ae2f7bca550 4734 {
Azure.IoT Build 0:6ae2f7bca550 4735 internal_decoder_data->decode_to_value->value.string_value.chars[0] = '\0';
Azure.IoT Build 0:6ae2f7bca550 4736
Azure.IoT Build 0:6ae2f7bca550 4737 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4738 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4739 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4740 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4741 }
Azure.IoT Build 0:6ae2f7bca550 4742
Azure.IoT Build 0:6ae2f7bca550 4743 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4744 }
Azure.IoT Build 0:6ae2f7bca550 4745 }
Azure.IoT Build 0:6ae2f7bca550 4746 else
Azure.IoT Build 0:6ae2f7bca550 4747 {
AzureIoTClient 6:641a9672db08 4748 size_t to_copy = internal_decoder_data->decode_value_state.string_value_state.length - (internal_decoder_data->bytes_decoded - 1);
Azure.IoT Build 0:6ae2f7bca550 4749 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4750 {
Azure.IoT Build 0:6ae2f7bca550 4751 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4752 }
Azure.IoT Build 0:6ae2f7bca550 4753
AzureIoTClient 23:1111ee8bcba4 4754 (void)memcpy(internal_decoder_data->decode_to_value->value.string_value.chars + (internal_decoder_data->bytes_decoded - 1), buffer, to_copy);
AzureIoTClient 23:1111ee8bcba4 4755 buffer += to_copy;
AzureIoTClient 23:1111ee8bcba4 4756 size -= to_copy;
AzureIoTClient 23:1111ee8bcba4 4757 internal_decoder_data->bytes_decoded += to_copy;
AzureIoTClient 23:1111ee8bcba4 4758
AzureIoTClient 23:1111ee8bcba4 4759 if (internal_decoder_data->bytes_decoded == internal_decoder_data->decode_value_state.string_value_state.length + 1)
Azure.IoT Build 0:6ae2f7bca550 4760 {
AzureIoTClient 23:1111ee8bcba4 4761 internal_decoder_data->decode_to_value->value.string_value.chars[internal_decoder_data->decode_value_state.string_value_state.length] = 0;
AzureIoTClient 23:1111ee8bcba4 4762 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4763
AzureIoTClient 23:1111ee8bcba4 4764 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
AzureIoTClient 23:1111ee8bcba4 4765 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
AzureIoTClient 23:1111ee8bcba4 4766 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
AzureIoTClient 23:1111ee8bcba4 4767 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4768 }
AzureIoTClient 23:1111ee8bcba4 4769
AzureIoTClient 23:1111ee8bcba4 4770 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4771 }
Azure.IoT Build 0:6ae2f7bca550 4772 break;
Azure.IoT Build 0:6ae2f7bca550 4773 }
Azure.IoT Build 0:6ae2f7bca550 4774 /* Codes_SRS_AMQPVALUE_01_377: [<encoding name="str32-utf8" code="0xb1" category="variable" width="4" label="up to 2^32 - 1 octets worth of UTF-8 Unicode (with no byte order mark)"/>] */
Azure.IoT Build 0:6ae2f7bca550 4775 case 0xB1:
Azure.IoT Build 0:6ae2f7bca550 4776 {
Azure.IoT Build 0:6ae2f7bca550 4777 if (internal_decoder_data->bytes_decoded < 4)
Azure.IoT Build 0:6ae2f7bca550 4778 {
Azure.IoT Build 0:6ae2f7bca550 4779 internal_decoder_data->decode_value_state.string_value_state.length += buffer[0] << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 4780 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4781 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4782 size--;
Azure.IoT Build 0:6ae2f7bca550 4783
Azure.IoT Build 0:6ae2f7bca550 4784 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 4785 {
AzureIoTClient 21:f9c433d8e6ca 4786 internal_decoder_data->decode_to_value->value.string_value.chars = (char*)malloc(internal_decoder_data->decode_value_state.string_value_state.length + 1);
Azure.IoT Build 0:6ae2f7bca550 4787 if (internal_decoder_data->decode_to_value->value.string_value.chars == NULL)
Azure.IoT Build 0:6ae2f7bca550 4788 {
Azure.IoT Build 0:6ae2f7bca550 4789 /* Codes_SRS_AMQPVALUE_01_326: [If any allocation failure occurs during decoding, amqpvalue_decode_bytes shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 4790 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4791 LogError("Could not allocate memory for decoded string value");
AzureIoTClient 23:1111ee8bcba4 4792 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4793 }
Azure.IoT Build 0:6ae2f7bca550 4794 else
Azure.IoT Build 0:6ae2f7bca550 4795 {
Azure.IoT Build 0:6ae2f7bca550 4796 if (internal_decoder_data->decode_value_state.string_value_state.length == 0)
Azure.IoT Build 0:6ae2f7bca550 4797 {
Azure.IoT Build 0:6ae2f7bca550 4798 internal_decoder_data->decode_to_value->value.string_value.chars[0] = '\0';
Azure.IoT Build 0:6ae2f7bca550 4799
Azure.IoT Build 0:6ae2f7bca550 4800 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4801 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4802 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4803 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4804 }
Azure.IoT Build 0:6ae2f7bca550 4805
Azure.IoT Build 0:6ae2f7bca550 4806 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4807 }
Azure.IoT Build 0:6ae2f7bca550 4808 }
Azure.IoT Build 0:6ae2f7bca550 4809 else
Azure.IoT Build 0:6ae2f7bca550 4810 {
Azure.IoT Build 0:6ae2f7bca550 4811 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4812 }
Azure.IoT Build 0:6ae2f7bca550 4813 }
Azure.IoT Build 0:6ae2f7bca550 4814 else
Azure.IoT Build 0:6ae2f7bca550 4815 {
AzureIoTClient 6:641a9672db08 4816 size_t to_copy = internal_decoder_data->decode_value_state.string_value_state.length - (internal_decoder_data->bytes_decoded - 4);
Azure.IoT Build 0:6ae2f7bca550 4817 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4818 {
Azure.IoT Build 0:6ae2f7bca550 4819 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4820 }
Azure.IoT Build 0:6ae2f7bca550 4821
AzureIoTClient 23:1111ee8bcba4 4822 (void)memcpy(internal_decoder_data->decode_to_value->value.string_value.chars + (internal_decoder_data->bytes_decoded - 4), buffer, to_copy);
AzureIoTClient 23:1111ee8bcba4 4823 buffer += to_copy;
AzureIoTClient 23:1111ee8bcba4 4824 size -= to_copy;
AzureIoTClient 23:1111ee8bcba4 4825 internal_decoder_data->bytes_decoded += to_copy;
AzureIoTClient 23:1111ee8bcba4 4826
AzureIoTClient 23:1111ee8bcba4 4827 if (internal_decoder_data->bytes_decoded == internal_decoder_data->decode_value_state.string_value_state.length + 4)
Azure.IoT Build 0:6ae2f7bca550 4828 {
AzureIoTClient 23:1111ee8bcba4 4829 internal_decoder_data->decode_to_value->value.string_value.chars[internal_decoder_data->decode_value_state.string_value_state.length] = '\0';
AzureIoTClient 23:1111ee8bcba4 4830 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4831
AzureIoTClient 23:1111ee8bcba4 4832 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
AzureIoTClient 23:1111ee8bcba4 4833 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
AzureIoTClient 23:1111ee8bcba4 4834 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
AzureIoTClient 23:1111ee8bcba4 4835 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4836 }
AzureIoTClient 23:1111ee8bcba4 4837
AzureIoTClient 23:1111ee8bcba4 4838 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4839 }
Azure.IoT Build 0:6ae2f7bca550 4840 break;
Azure.IoT Build 0:6ae2f7bca550 4841 }
Azure.IoT Build 0:6ae2f7bca550 4842 /* Codes_SRS_AMQPVALUE_01_379: [<encoding name="sym8" code="0xa3" category="variable" width="1" label="up to 2^8 - 1 seven bit ASCII characters representing a symbolic value"/>] */
Azure.IoT Build 0:6ae2f7bca550 4843 case 0xA3:
Azure.IoT Build 0:6ae2f7bca550 4844 {
Azure.IoT Build 0:6ae2f7bca550 4845 if (internal_decoder_data->bytes_decoded == 0)
Azure.IoT Build 0:6ae2f7bca550 4846 {
Azure.IoT Build 0:6ae2f7bca550 4847 internal_decoder_data->decode_value_state.symbol_value_state.length = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 4848 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4849 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4850 size--;
Azure.IoT Build 0:6ae2f7bca550 4851
AzureIoTClient 21:f9c433d8e6ca 4852 internal_decoder_data->decode_to_value->value.symbol_value.chars = (char*)malloc(internal_decoder_data->decode_value_state.symbol_value_state.length + 1);
Azure.IoT Build 0:6ae2f7bca550 4853 if (internal_decoder_data->decode_to_value->value.symbol_value.chars == NULL)
Azure.IoT Build 0:6ae2f7bca550 4854 {
Azure.IoT Build 0:6ae2f7bca550 4855 /* Codes_SRS_AMQPVALUE_01_326: [If any allocation failure occurs during decoding, amqpvalue_decode_bytes shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 4856 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4857 LogError("Could not allocate memory for decoded symbol value");
AzureIoTClient 23:1111ee8bcba4 4858 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4859 }
Azure.IoT Build 0:6ae2f7bca550 4860 else
Azure.IoT Build 0:6ae2f7bca550 4861 {
Azure.IoT Build 0:6ae2f7bca550 4862 if (internal_decoder_data->decode_value_state.symbol_value_state.length == 0)
Azure.IoT Build 0:6ae2f7bca550 4863 {
Azure.IoT Build 0:6ae2f7bca550 4864 internal_decoder_data->decode_to_value->value.symbol_value.chars[0] = '\0';
Azure.IoT Build 0:6ae2f7bca550 4865
Azure.IoT Build 0:6ae2f7bca550 4866 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4867 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4868 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4869 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4870 }
Azure.IoT Build 0:6ae2f7bca550 4871
Azure.IoT Build 0:6ae2f7bca550 4872 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4873 }
Azure.IoT Build 0:6ae2f7bca550 4874 }
Azure.IoT Build 0:6ae2f7bca550 4875 else
Azure.IoT Build 0:6ae2f7bca550 4876 {
AzureIoTClient 6:641a9672db08 4877 size_t to_copy = internal_decoder_data->decode_value_state.symbol_value_state.length - (internal_decoder_data->bytes_decoded - 1);
Azure.IoT Build 0:6ae2f7bca550 4878 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4879 {
Azure.IoT Build 0:6ae2f7bca550 4880 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4881 }
Azure.IoT Build 0:6ae2f7bca550 4882
AzureIoTClient 23:1111ee8bcba4 4883 (void)memcpy(internal_decoder_data->decode_to_value->value.symbol_value.chars + (internal_decoder_data->bytes_decoded - 1), buffer, to_copy);
AzureIoTClient 23:1111ee8bcba4 4884 buffer += to_copy;
AzureIoTClient 23:1111ee8bcba4 4885 size -= to_copy;
AzureIoTClient 23:1111ee8bcba4 4886 internal_decoder_data->bytes_decoded += to_copy;
AzureIoTClient 23:1111ee8bcba4 4887
AzureIoTClient 23:1111ee8bcba4 4888 if (internal_decoder_data->bytes_decoded == internal_decoder_data->decode_value_state.symbol_value_state.length + 1)
Azure.IoT Build 0:6ae2f7bca550 4889 {
AzureIoTClient 23:1111ee8bcba4 4890 internal_decoder_data->decode_to_value->value.symbol_value.chars[internal_decoder_data->decode_value_state.symbol_value_state.length] = 0;
AzureIoTClient 23:1111ee8bcba4 4891 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4892
AzureIoTClient 23:1111ee8bcba4 4893 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
AzureIoTClient 23:1111ee8bcba4 4894 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
AzureIoTClient 23:1111ee8bcba4 4895 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
AzureIoTClient 23:1111ee8bcba4 4896 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4897 }
AzureIoTClient 23:1111ee8bcba4 4898
AzureIoTClient 23:1111ee8bcba4 4899 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4900 }
Azure.IoT Build 0:6ae2f7bca550 4901 break;
Azure.IoT Build 0:6ae2f7bca550 4902 }
Azure.IoT Build 0:6ae2f7bca550 4903 /* Codes_SRS_AMQPVALUE_01_380: [<encoding name="sym32" code="0xb3" category="variable" width="4" label="up to 2^32 - 1 seven bit ASCII characters representing a symbolic value"/>] */
Azure.IoT Build 0:6ae2f7bca550 4904 case 0xB3:
Azure.IoT Build 0:6ae2f7bca550 4905 {
Azure.IoT Build 0:6ae2f7bca550 4906 if (internal_decoder_data->bytes_decoded < 4)
Azure.IoT Build 0:6ae2f7bca550 4907 {
Azure.IoT Build 0:6ae2f7bca550 4908 internal_decoder_data->decode_value_state.symbol_value_state.length += buffer[0] << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 4909 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4910 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4911 size--;
Azure.IoT Build 0:6ae2f7bca550 4912
Azure.IoT Build 0:6ae2f7bca550 4913 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 4914 {
AzureIoTClient 21:f9c433d8e6ca 4915 internal_decoder_data->decode_to_value->value.symbol_value.chars = (char*)malloc(internal_decoder_data->decode_value_state.symbol_value_state.length + 1);
Azure.IoT Build 0:6ae2f7bca550 4916 if (internal_decoder_data->decode_to_value->value.symbol_value.chars == NULL)
Azure.IoT Build 0:6ae2f7bca550 4917 {
Azure.IoT Build 0:6ae2f7bca550 4918 /* Codes_SRS_AMQPVALUE_01_326: [If any allocation failure occurs during decoding, amqpvalue_decode_bytes shall fail and return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 4919 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 4920 LogError("Could not allocate memory for decoded symbol value");
AzureIoTClient 23:1111ee8bcba4 4921 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4922 }
Azure.IoT Build 0:6ae2f7bca550 4923 else
Azure.IoT Build 0:6ae2f7bca550 4924 {
Azure.IoT Build 0:6ae2f7bca550 4925 if (internal_decoder_data->decode_value_state.symbol_value_state.length == 0)
Azure.IoT Build 0:6ae2f7bca550 4926 {
Azure.IoT Build 0:6ae2f7bca550 4927 internal_decoder_data->decode_to_value->value.symbol_value.chars[0] = '\0';
Azure.IoT Build 0:6ae2f7bca550 4928
Azure.IoT Build 0:6ae2f7bca550 4929 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 4930 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 4931 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 4932 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4933 }
Azure.IoT Build 0:6ae2f7bca550 4934
Azure.IoT Build 0:6ae2f7bca550 4935 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4936 }
Azure.IoT Build 0:6ae2f7bca550 4937 }
Azure.IoT Build 0:6ae2f7bca550 4938 else
Azure.IoT Build 0:6ae2f7bca550 4939 {
Azure.IoT Build 0:6ae2f7bca550 4940 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4941 }
Azure.IoT Build 0:6ae2f7bca550 4942 }
Azure.IoT Build 0:6ae2f7bca550 4943 else
Azure.IoT Build 0:6ae2f7bca550 4944 {
AzureIoTClient 6:641a9672db08 4945 size_t to_copy = internal_decoder_data->decode_value_state.symbol_value_state.length - (internal_decoder_data->bytes_decoded - 4);
Azure.IoT Build 0:6ae2f7bca550 4946 if (to_copy > size)
Azure.IoT Build 0:6ae2f7bca550 4947 {
Azure.IoT Build 0:6ae2f7bca550 4948 to_copy = size;
Azure.IoT Build 0:6ae2f7bca550 4949 }
Azure.IoT Build 0:6ae2f7bca550 4950
AzureIoTClient 23:1111ee8bcba4 4951 (void)memcpy(internal_decoder_data->decode_to_value->value.symbol_value.chars + (internal_decoder_data->bytes_decoded - 4), buffer, to_copy);
AzureIoTClient 23:1111ee8bcba4 4952 buffer += to_copy;
AzureIoTClient 23:1111ee8bcba4 4953 size -= to_copy;
AzureIoTClient 23:1111ee8bcba4 4954 internal_decoder_data->bytes_decoded += to_copy;
AzureIoTClient 23:1111ee8bcba4 4955
AzureIoTClient 23:1111ee8bcba4 4956 if (internal_decoder_data->bytes_decoded == internal_decoder_data->decode_value_state.symbol_value_state.length + 4)
Azure.IoT Build 0:6ae2f7bca550 4957 {
AzureIoTClient 23:1111ee8bcba4 4958 internal_decoder_data->decode_to_value->value.symbol_value.chars[internal_decoder_data->decode_value_state.symbol_value_state.length] = '\0';
AzureIoTClient 23:1111ee8bcba4 4959 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
AzureIoTClient 23:1111ee8bcba4 4960
AzureIoTClient 23:1111ee8bcba4 4961 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
AzureIoTClient 23:1111ee8bcba4 4962 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
AzureIoTClient 23:1111ee8bcba4 4963 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
AzureIoTClient 23:1111ee8bcba4 4964 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 4965 }
AzureIoTClient 23:1111ee8bcba4 4966
AzureIoTClient 23:1111ee8bcba4 4967 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4968 }
Azure.IoT Build 0:6ae2f7bca550 4969 break;
Azure.IoT Build 0:6ae2f7bca550 4970 }
Azure.IoT Build 0:6ae2f7bca550 4971 /* Codes_SRS_AMQPVALUE_01_385: [<encoding name="list8" code="0xc0" category="compound" width="1" label="up to 2^8 - 1 list elements with total size less than 2^8 octets"/>] */
Azure.IoT Build 0:6ae2f7bca550 4972 case 0xC0:
Azure.IoT Build 0:6ae2f7bca550 4973 /* Codes_SRS_AMQPVALUE_01_386: [<encoding name="list32" code="0xd0" category="compound" width="4" label="up to 2^32 - 1 list elements with total size less than 2^32 octets"/>] */
Azure.IoT Build 0:6ae2f7bca550 4974 case 0xD0:
Azure.IoT Build 0:6ae2f7bca550 4975 {
Azure.IoT Build 0:6ae2f7bca550 4976 DECODE_LIST_STEP step = internal_decoder_data->decode_value_state.list_value_state.list_value_state;
Azure.IoT Build 0:6ae2f7bca550 4977
Azure.IoT Build 0:6ae2f7bca550 4978 switch (step)
Azure.IoT Build 0:6ae2f7bca550 4979 {
Azure.IoT Build 0:6ae2f7bca550 4980 default:
AzureIoTClient 23:1111ee8bcba4 4981 LogError("Invalid step in decoding list value: %d", step);
AzureIoTClient 23:1111ee8bcba4 4982 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 4983 break;
Azure.IoT Build 0:6ae2f7bca550 4984
Azure.IoT Build 0:6ae2f7bca550 4985 case DECODE_LIST_STEP_SIZE:
Azure.IoT Build 0:6ae2f7bca550 4986 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 4987 buffer++;
Azure.IoT Build 0:6ae2f7bca550 4988 size--;
Azure.IoT Build 0:6ae2f7bca550 4989
Azure.IoT Build 0:6ae2f7bca550 4990 if (internal_decoder_data->constructor_byte == 0xC0)
Azure.IoT Build 0:6ae2f7bca550 4991 {
Azure.IoT Build 0:6ae2f7bca550 4992 internal_decoder_data->decode_value_state.list_value_state.list_value_state = DECODE_LIST_STEP_COUNT;
Azure.IoT Build 0:6ae2f7bca550 4993 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 4994 internal_decoder_data->decode_to_value->value.list_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 4995 result = 0;
Azure.IoT Build 0:6ae2f7bca550 4996 }
Azure.IoT Build 0:6ae2f7bca550 4997 else
Azure.IoT Build 0:6ae2f7bca550 4998 {
Azure.IoT Build 0:6ae2f7bca550 4999 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 5000 {
Azure.IoT Build 0:6ae2f7bca550 5001 internal_decoder_data->decode_value_state.list_value_state.list_value_state = DECODE_LIST_STEP_COUNT;
Azure.IoT Build 0:6ae2f7bca550 5002 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5003 internal_decoder_data->decode_to_value->value.list_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 5004 }
AzureIoTClient 23:1111ee8bcba4 5005
Azure.IoT Build 0:6ae2f7bca550 5006 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5007 }
Azure.IoT Build 0:6ae2f7bca550 5008
Azure.IoT Build 0:6ae2f7bca550 5009 break;
Azure.IoT Build 0:6ae2f7bca550 5010
Azure.IoT Build 0:6ae2f7bca550 5011 case DECODE_LIST_STEP_COUNT:
Azure.IoT Build 0:6ae2f7bca550 5012 if (internal_decoder_data->constructor_byte == 0xC0)
Azure.IoT Build 0:6ae2f7bca550 5013 {
Azure.IoT Build 0:6ae2f7bca550 5014 internal_decoder_data->decode_to_value->value.list_value.count = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 5015 }
Azure.IoT Build 0:6ae2f7bca550 5016 else
Azure.IoT Build 0:6ae2f7bca550 5017 {
Azure.IoT Build 0:6ae2f7bca550 5018 internal_decoder_data->decode_to_value->value.list_value.count += buffer[0] << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 5019 }
AzureIoTClient 23:1111ee8bcba4 5020
Azure.IoT Build 0:6ae2f7bca550 5021 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 5022 buffer++;
Azure.IoT Build 0:6ae2f7bca550 5023 size--;
Azure.IoT Build 0:6ae2f7bca550 5024
Azure.IoT Build 0:6ae2f7bca550 5025 if (internal_decoder_data->constructor_byte == 0xC0)
Azure.IoT Build 0:6ae2f7bca550 5026 {
Azure.IoT Build 0:6ae2f7bca550 5027 if (internal_decoder_data->decode_to_value->value.list_value.count == 0)
Azure.IoT Build 0:6ae2f7bca550 5028 {
Azure.IoT Build 0:6ae2f7bca550 5029 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5030
Azure.IoT Build 0:6ae2f7bca550 5031 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 5032 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 5033 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 5034 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5035 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5036 }
Azure.IoT Build 0:6ae2f7bca550 5037 else
Azure.IoT Build 0:6ae2f7bca550 5038 {
Azure.IoT Build 0:6ae2f7bca550 5039 uint32_t i;
AzureIoTClient 21:f9c433d8e6ca 5040 internal_decoder_data->decode_to_value->value.list_value.items = (AMQP_VALUE*)malloc(sizeof(AMQP_VALUE) * internal_decoder_data->decode_to_value->value.list_value.count);
Azure.IoT Build 0:6ae2f7bca550 5041 if (internal_decoder_data->decode_to_value->value.list_value.items == NULL)
Azure.IoT Build 0:6ae2f7bca550 5042 {
AzureIoTClient 23:1111ee8bcba4 5043 LogError("Could not allocate memory for decoded list value");
AzureIoTClient 23:1111ee8bcba4 5044 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5045 }
Azure.IoT Build 0:6ae2f7bca550 5046 else
Azure.IoT Build 0:6ae2f7bca550 5047 {
Azure.IoT Build 0:6ae2f7bca550 5048 for (i = 0; i < internal_decoder_data->decode_to_value->value.list_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 5049 {
Azure.IoT Build 0:6ae2f7bca550 5050 internal_decoder_data->decode_to_value->value.list_value.items[i] = NULL;
Azure.IoT Build 0:6ae2f7bca550 5051 }
Azure.IoT Build 0:6ae2f7bca550 5052
Azure.IoT Build 0:6ae2f7bca550 5053 internal_decoder_data->decode_value_state.list_value_state.list_value_state = DECODE_LIST_STEP_ITEMS;
Azure.IoT Build 0:6ae2f7bca550 5054 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5055 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5056 internal_decoder_data->decode_value_state.list_value_state.item = 0;
Azure.IoT Build 0:6ae2f7bca550 5057 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5058 }
Azure.IoT Build 0:6ae2f7bca550 5059 }
Azure.IoT Build 0:6ae2f7bca550 5060 }
Azure.IoT Build 0:6ae2f7bca550 5061 else
Azure.IoT Build 0:6ae2f7bca550 5062 {
Azure.IoT Build 0:6ae2f7bca550 5063 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 5064 {
Azure.IoT Build 0:6ae2f7bca550 5065 if (internal_decoder_data->decode_to_value->value.list_value.count == 0)
Azure.IoT Build 0:6ae2f7bca550 5066 {
Azure.IoT Build 0:6ae2f7bca550 5067 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5068
Azure.IoT Build 0:6ae2f7bca550 5069 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 5070 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 5071 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 5072 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5073 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5074 }
Azure.IoT Build 0:6ae2f7bca550 5075 else
Azure.IoT Build 0:6ae2f7bca550 5076 {
Azure.IoT Build 0:6ae2f7bca550 5077 uint32_t i;
AzureIoTClient 23:1111ee8bcba4 5078
AzureIoTClient 21:f9c433d8e6ca 5079 internal_decoder_data->decode_to_value->value.list_value.items = (AMQP_VALUE*)malloc(sizeof(AMQP_VALUE) * internal_decoder_data->decode_to_value->value.list_value.count);
Azure.IoT Build 0:6ae2f7bca550 5080 if (internal_decoder_data->decode_to_value->value.list_value.items == NULL)
Azure.IoT Build 0:6ae2f7bca550 5081 {
AzureIoTClient 23:1111ee8bcba4 5082 LogError("Could not allocate memory for decoded list value");
AzureIoTClient 23:1111ee8bcba4 5083 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5084 }
Azure.IoT Build 0:6ae2f7bca550 5085 else
Azure.IoT Build 0:6ae2f7bca550 5086 {
Azure.IoT Build 0:6ae2f7bca550 5087 for (i = 0; i < internal_decoder_data->decode_to_value->value.list_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 5088 {
Azure.IoT Build 0:6ae2f7bca550 5089 internal_decoder_data->decode_to_value->value.list_value.items[i] = NULL;
Azure.IoT Build 0:6ae2f7bca550 5090 }
AzureIoTClient 23:1111ee8bcba4 5091
Azure.IoT Build 0:6ae2f7bca550 5092 internal_decoder_data->decode_value_state.list_value_state.list_value_state = DECODE_LIST_STEP_ITEMS;
Azure.IoT Build 0:6ae2f7bca550 5093 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5094 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5095 internal_decoder_data->decode_value_state.list_value_state.item = 0;
Azure.IoT Build 0:6ae2f7bca550 5096 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5097 }
Azure.IoT Build 0:6ae2f7bca550 5098 }
Azure.IoT Build 0:6ae2f7bca550 5099 }
Azure.IoT Build 0:6ae2f7bca550 5100 else
Azure.IoT Build 0:6ae2f7bca550 5101 {
Azure.IoT Build 0:6ae2f7bca550 5102 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5103 }
Azure.IoT Build 0:6ae2f7bca550 5104 }
Azure.IoT Build 0:6ae2f7bca550 5105 break;
Azure.IoT Build 0:6ae2f7bca550 5106
Azure.IoT Build 0:6ae2f7bca550 5107 case DECODE_LIST_STEP_ITEMS:
Azure.IoT Build 0:6ae2f7bca550 5108 {
AzureIoTClient 6:641a9672db08 5109 size_t inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5110
Azure.IoT Build 0:6ae2f7bca550 5111 if (internal_decoder_data->bytes_decoded == 0)
Azure.IoT Build 0:6ae2f7bca550 5112 {
AzureIoTClient 21:f9c433d8e6ca 5113 AMQP_VALUE_DATA* list_item = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 5114 if (list_item == NULL)
Azure.IoT Build 0:6ae2f7bca550 5115 {
Azure.IoT Build 0:6ae2f7bca550 5116 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 19:000ab4e6a2c1 5117 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5118 }
Azure.IoT Build 0:6ae2f7bca550 5119 else
Azure.IoT Build 0:6ae2f7bca550 5120 {
Azure.IoT Build 0:6ae2f7bca550 5121 list_item->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 5122 internal_decoder_data->decode_to_value->value.list_value.items[internal_decoder_data->decode_value_state.list_value_state.item] = list_item;
Azure.IoT Build 0:6ae2f7bca550 5123 internal_decoder_data->inner_decoder = internal_decoder_create(inner_decoder_callback, internal_decoder_data, list_item);
Azure.IoT Build 0:6ae2f7bca550 5124 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5125 {
AzureIoTClient 23:1111ee8bcba4 5126 LogError("Could not create inner decoder for list items");
AzureIoTClient 23:1111ee8bcba4 5127 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 5128 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5129 }
Azure.IoT Build 0:6ae2f7bca550 5130 else
Azure.IoT Build 0:6ae2f7bca550 5131 {
Azure.IoT Build 0:6ae2f7bca550 5132 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5133 }
Azure.IoT Build 0:6ae2f7bca550 5134 }
Azure.IoT Build 0:6ae2f7bca550 5135 }
Azure.IoT Build 0:6ae2f7bca550 5136
Azure.IoT Build 0:6ae2f7bca550 5137 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5138 {
AzureIoTClient 23:1111ee8bcba4 5139 LogError("NULL inner decoder. This should not happen under normal circumstances");
AzureIoTClient 23:1111ee8bcba4 5140 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5141 }
AzureIoTClient 6:641a9672db08 5142 else if (internal_decoder_decode_bytes(internal_decoder_data->inner_decoder, buffer, size, &inner_used_bytes) != 0)
Azure.IoT Build 0:6ae2f7bca550 5143 {
AzureIoTClient 23:1111ee8bcba4 5144 LogError("Decoding list items failed");
AzureIoTClient 23:1111ee8bcba4 5145 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5146 }
Azure.IoT Build 0:6ae2f7bca550 5147 else
Azure.IoT Build 0:6ae2f7bca550 5148 {
Azure.IoT Build 0:6ae2f7bca550 5149 INTERNAL_DECODER_DATA* inner_decoder = (INTERNAL_DECODER_DATA*)internal_decoder_data->inner_decoder;
AzureIoTClient 6:641a9672db08 5150 internal_decoder_data->bytes_decoded += inner_used_bytes;
AzureIoTClient 6:641a9672db08 5151 buffer += inner_used_bytes;
AzureIoTClient 6:641a9672db08 5152 size -= inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5153
Azure.IoT Build 0:6ae2f7bca550 5154 if (inner_decoder->decoder_state == DECODER_STATE_DONE)
Azure.IoT Build 0:6ae2f7bca550 5155 {
Azure.IoT Build 0:6ae2f7bca550 5156 internal_decoder_destroy(inner_decoder);
Azure.IoT Build 0:6ae2f7bca550 5157 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5158 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5159
Azure.IoT Build 0:6ae2f7bca550 5160 internal_decoder_data->decode_value_state.list_value_state.item++;
Azure.IoT Build 0:6ae2f7bca550 5161 if (internal_decoder_data->decode_value_state.list_value_state.item == internal_decoder_data->decode_to_value->value.list_value.count)
Azure.IoT Build 0:6ae2f7bca550 5162 {
Azure.IoT Build 0:6ae2f7bca550 5163 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5164
Azure.IoT Build 0:6ae2f7bca550 5165 /* Codes_SRS_AMQPVALUE_01_323: [When enough bytes have been processed for a valid amqp value, the on_value_decoded passed in amqpvalue_decoder_create shall be called.] */
Azure.IoT Build 0:6ae2f7bca550 5166 /* Codes_SRS_AMQPVALUE_01_324: [The decoded amqp value shall be passed to on_value_decoded.] */
Azure.IoT Build 0:6ae2f7bca550 5167 /* Codes_SRS_AMQPVALUE_01_325: [Also the context stored in amqpvalue_decoder_create shall be passed to the on_value_decoded callback.] */
Azure.IoT Build 0:6ae2f7bca550 5168 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5169 }
Azure.IoT Build 0:6ae2f7bca550 5170
Azure.IoT Build 0:6ae2f7bca550 5171 }
Azure.IoT Build 0:6ae2f7bca550 5172
Azure.IoT Build 0:6ae2f7bca550 5173 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5174 }
Azure.IoT Build 0:6ae2f7bca550 5175
Azure.IoT Build 0:6ae2f7bca550 5176 break;
Azure.IoT Build 0:6ae2f7bca550 5177 }
Azure.IoT Build 0:6ae2f7bca550 5178 }
Azure.IoT Build 0:6ae2f7bca550 5179
Azure.IoT Build 0:6ae2f7bca550 5180 break;
Azure.IoT Build 0:6ae2f7bca550 5181 }
Azure.IoT Build 0:6ae2f7bca550 5182 case 0xC1:
Azure.IoT Build 0:6ae2f7bca550 5183 case 0xD1:
Azure.IoT Build 0:6ae2f7bca550 5184 {
Azure.IoT Build 0:6ae2f7bca550 5185 DECODE_MAP_STEP step = internal_decoder_data->decode_value_state.map_value_state.map_value_state;
Azure.IoT Build 0:6ae2f7bca550 5186
Azure.IoT Build 0:6ae2f7bca550 5187 switch (step)
Azure.IoT Build 0:6ae2f7bca550 5188 {
Azure.IoT Build 0:6ae2f7bca550 5189 default:
AzureIoTClient 23:1111ee8bcba4 5190 LogError("Invalid step in decoding map value: %d", step);
AzureIoTClient 23:1111ee8bcba4 5191 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5192 break;
Azure.IoT Build 0:6ae2f7bca550 5193
Azure.IoT Build 0:6ae2f7bca550 5194 case DECODE_MAP_STEP_SIZE:
Azure.IoT Build 0:6ae2f7bca550 5195 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 5196 buffer++;
Azure.IoT Build 0:6ae2f7bca550 5197 size--;
Azure.IoT Build 0:6ae2f7bca550 5198
Azure.IoT Build 0:6ae2f7bca550 5199 if (internal_decoder_data->constructor_byte == 0xC1)
Azure.IoT Build 0:6ae2f7bca550 5200 {
Azure.IoT Build 0:6ae2f7bca550 5201 internal_decoder_data->decode_value_state.map_value_state.map_value_state = DECODE_MAP_STEP_COUNT;
Azure.IoT Build 0:6ae2f7bca550 5202 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5203 internal_decoder_data->decode_to_value->value.map_value.pair_count = 0;
Azure.IoT Build 0:6ae2f7bca550 5204 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5205 }
Azure.IoT Build 0:6ae2f7bca550 5206 else
Azure.IoT Build 0:6ae2f7bca550 5207 {
Azure.IoT Build 0:6ae2f7bca550 5208 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 5209 {
Azure.IoT Build 0:6ae2f7bca550 5210 internal_decoder_data->decode_value_state.map_value_state.map_value_state = DECODE_MAP_STEP_COUNT;
Azure.IoT Build 0:6ae2f7bca550 5211 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5212 internal_decoder_data->decode_to_value->value.map_value.pair_count = 0;
Azure.IoT Build 0:6ae2f7bca550 5213 }
Azure.IoT Build 0:6ae2f7bca550 5214 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5215 }
Azure.IoT Build 0:6ae2f7bca550 5216
Azure.IoT Build 0:6ae2f7bca550 5217 break;
Azure.IoT Build 0:6ae2f7bca550 5218
Azure.IoT Build 0:6ae2f7bca550 5219 case DECODE_MAP_STEP_COUNT:
Azure.IoT Build 0:6ae2f7bca550 5220 if (internal_decoder_data->constructor_byte == 0xC1)
Azure.IoT Build 0:6ae2f7bca550 5221 {
Azure.IoT Build 0:6ae2f7bca550 5222 internal_decoder_data->decode_to_value->value.map_value.pair_count = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 5223 }
Azure.IoT Build 0:6ae2f7bca550 5224 else
Azure.IoT Build 0:6ae2f7bca550 5225 {
Azure.IoT Build 0:6ae2f7bca550 5226 internal_decoder_data->decode_to_value->value.map_value.pair_count += buffer[0] << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 5227 }
Azure.IoT Build 0:6ae2f7bca550 5228 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 5229 buffer++;
Azure.IoT Build 0:6ae2f7bca550 5230 size--;
Azure.IoT Build 0:6ae2f7bca550 5231
Azure.IoT Build 0:6ae2f7bca550 5232 if (internal_decoder_data->constructor_byte == 0xC1)
Azure.IoT Build 0:6ae2f7bca550 5233 {
Azure.IoT Build 0:6ae2f7bca550 5234 if (internal_decoder_data->decode_to_value->value.map_value.pair_count == 0)
Azure.IoT Build 0:6ae2f7bca550 5235 {
Azure.IoT Build 0:6ae2f7bca550 5236 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5237
Azure.IoT Build 0:6ae2f7bca550 5238 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5239 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5240 }
Azure.IoT Build 0:6ae2f7bca550 5241 else
Azure.IoT Build 0:6ae2f7bca550 5242 {
Azure.IoT Build 0:6ae2f7bca550 5243 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 5244
Azure.IoT Build 0:6ae2f7bca550 5245 internal_decoder_data->decode_to_value->value.map_value.pair_count /= 2;
Azure.IoT Build 0:6ae2f7bca550 5246
AzureIoTClient 21:f9c433d8e6ca 5247 internal_decoder_data->decode_to_value->value.map_value.pairs = (AMQP_MAP_KEY_VALUE_PAIR*)malloc(sizeof(AMQP_MAP_KEY_VALUE_PAIR) * (internal_decoder_data->decode_to_value->value.map_value.pair_count * 2));
Azure.IoT Build 0:6ae2f7bca550 5248 if (internal_decoder_data->decode_to_value->value.map_value.pairs == NULL)
Azure.IoT Build 0:6ae2f7bca550 5249 {
AzureIoTClient 23:1111ee8bcba4 5250 LogError("Could not allocate memory for map value items");
AzureIoTClient 23:1111ee8bcba4 5251 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5252 }
Azure.IoT Build 0:6ae2f7bca550 5253 else
Azure.IoT Build 0:6ae2f7bca550 5254 {
Azure.IoT Build 0:6ae2f7bca550 5255 for (i = 0; i < internal_decoder_data->decode_to_value->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 5256 {
Azure.IoT Build 0:6ae2f7bca550 5257 internal_decoder_data->decode_to_value->value.map_value.pairs[i].key = NULL;
Azure.IoT Build 0:6ae2f7bca550 5258 internal_decoder_data->decode_to_value->value.map_value.pairs[i].value = NULL;
Azure.IoT Build 0:6ae2f7bca550 5259 }
Azure.IoT Build 0:6ae2f7bca550 5260
Azure.IoT Build 0:6ae2f7bca550 5261 internal_decoder_data->decode_value_state.map_value_state.map_value_state = DECODE_MAP_STEP_PAIRS;
Azure.IoT Build 0:6ae2f7bca550 5262 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5263 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5264 internal_decoder_data->decode_value_state.map_value_state.item = 0;
Azure.IoT Build 0:6ae2f7bca550 5265 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5266 }
Azure.IoT Build 0:6ae2f7bca550 5267 }
Azure.IoT Build 0:6ae2f7bca550 5268 }
Azure.IoT Build 0:6ae2f7bca550 5269 else
Azure.IoT Build 0:6ae2f7bca550 5270 {
Azure.IoT Build 0:6ae2f7bca550 5271 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 5272 {
Azure.IoT Build 0:6ae2f7bca550 5273 if (internal_decoder_data->decode_to_value->value.map_value.pair_count == 0)
Azure.IoT Build 0:6ae2f7bca550 5274 {
Azure.IoT Build 0:6ae2f7bca550 5275 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5276
Azure.IoT Build 0:6ae2f7bca550 5277 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5278 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5279 }
Azure.IoT Build 0:6ae2f7bca550 5280 else
Azure.IoT Build 0:6ae2f7bca550 5281 {
Azure.IoT Build 0:6ae2f7bca550 5282 uint32_t i;
Azure.IoT Build 0:6ae2f7bca550 5283
Azure.IoT Build 0:6ae2f7bca550 5284 internal_decoder_data->decode_to_value->value.map_value.pair_count /= 2;
Azure.IoT Build 0:6ae2f7bca550 5285
AzureIoTClient 21:f9c433d8e6ca 5286 internal_decoder_data->decode_to_value->value.map_value.pairs = (AMQP_MAP_KEY_VALUE_PAIR*)malloc(sizeof(AMQP_MAP_KEY_VALUE_PAIR) * (internal_decoder_data->decode_to_value->value.map_value.pair_count * 2));
Azure.IoT Build 0:6ae2f7bca550 5287 if (internal_decoder_data->decode_to_value->value.map_value.pairs == NULL)
Azure.IoT Build 0:6ae2f7bca550 5288 {
AzureIoTClient 23:1111ee8bcba4 5289 LogError("Could not allocate memory for map value items");
AzureIoTClient 23:1111ee8bcba4 5290 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5291 }
Azure.IoT Build 0:6ae2f7bca550 5292 else
Azure.IoT Build 0:6ae2f7bca550 5293 {
Azure.IoT Build 0:6ae2f7bca550 5294 for (i = 0; i < internal_decoder_data->decode_to_value->value.map_value.pair_count; i++)
Azure.IoT Build 0:6ae2f7bca550 5295 {
Azure.IoT Build 0:6ae2f7bca550 5296 internal_decoder_data->decode_to_value->value.map_value.pairs[i].key = NULL;
Azure.IoT Build 0:6ae2f7bca550 5297 internal_decoder_data->decode_to_value->value.map_value.pairs[i].value = NULL;
Azure.IoT Build 0:6ae2f7bca550 5298 }
AzureIoTClient 23:1111ee8bcba4 5299
Azure.IoT Build 0:6ae2f7bca550 5300 internal_decoder_data->decode_value_state.map_value_state.map_value_state = DECODE_MAP_STEP_PAIRS;
Azure.IoT Build 0:6ae2f7bca550 5301 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5302 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5303 internal_decoder_data->decode_value_state.map_value_state.item = 0;
Azure.IoT Build 0:6ae2f7bca550 5304 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5305 }
Azure.IoT Build 0:6ae2f7bca550 5306 }
Azure.IoT Build 0:6ae2f7bca550 5307 }
Azure.IoT Build 0:6ae2f7bca550 5308 else
Azure.IoT Build 0:6ae2f7bca550 5309 {
Azure.IoT Build 0:6ae2f7bca550 5310 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5311 }
Azure.IoT Build 0:6ae2f7bca550 5312 }
Azure.IoT Build 0:6ae2f7bca550 5313 break;
Azure.IoT Build 0:6ae2f7bca550 5314
Azure.IoT Build 0:6ae2f7bca550 5315 case DECODE_MAP_STEP_PAIRS:
Azure.IoT Build 0:6ae2f7bca550 5316 {
AzureIoTClient 6:641a9672db08 5317 size_t inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5318
Azure.IoT Build 0:6ae2f7bca550 5319 if (internal_decoder_data->bytes_decoded == 0)
Azure.IoT Build 0:6ae2f7bca550 5320 {
AzureIoTClient 21:f9c433d8e6ca 5321 AMQP_VALUE_DATA* map_item = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 5322 if (map_item == NULL)
Azure.IoT Build 0:6ae2f7bca550 5323 {
AzureIoTClient 23:1111ee8bcba4 5324 LogError("Could not allocate memory for map item");
AzureIoTClient 23:1111ee8bcba4 5325 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 19:000ab4e6a2c1 5326 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5327 }
Azure.IoT Build 0:6ae2f7bca550 5328 else
Azure.IoT Build 0:6ae2f7bca550 5329 {
Azure.IoT Build 0:6ae2f7bca550 5330 map_item->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 5331 if (internal_decoder_data->decode_to_value->value.map_value.pairs[internal_decoder_data->decode_value_state.map_value_state.item].key == NULL)
Azure.IoT Build 0:6ae2f7bca550 5332 {
Azure.IoT Build 0:6ae2f7bca550 5333 internal_decoder_data->decode_to_value->value.map_value.pairs[internal_decoder_data->decode_value_state.map_value_state.item].key = map_item;
Azure.IoT Build 0:6ae2f7bca550 5334 }
Azure.IoT Build 0:6ae2f7bca550 5335 else
Azure.IoT Build 0:6ae2f7bca550 5336 {
Azure.IoT Build 0:6ae2f7bca550 5337 internal_decoder_data->decode_to_value->value.map_value.pairs[internal_decoder_data->decode_value_state.map_value_state.item].value = map_item;
Azure.IoT Build 0:6ae2f7bca550 5338 }
Azure.IoT Build 0:6ae2f7bca550 5339 internal_decoder_data->inner_decoder = internal_decoder_create(inner_decoder_callback, internal_decoder_data, map_item);
Azure.IoT Build 0:6ae2f7bca550 5340 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5341 {
AzureIoTClient 23:1111ee8bcba4 5342 LogError("Could not create inner decoder for map item");
AzureIoTClient 23:1111ee8bcba4 5343 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 19:000ab4e6a2c1 5344 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5345 }
Azure.IoT Build 0:6ae2f7bca550 5346 else
Azure.IoT Build 0:6ae2f7bca550 5347 {
Azure.IoT Build 0:6ae2f7bca550 5348 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5349 }
Azure.IoT Build 0:6ae2f7bca550 5350 }
Azure.IoT Build 0:6ae2f7bca550 5351 }
Azure.IoT Build 0:6ae2f7bca550 5352
Azure.IoT Build 0:6ae2f7bca550 5353 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5354 {
AzureIoTClient 23:1111ee8bcba4 5355 LogError("NULL inner decoder. This should not happen under normal circumstances");
AzureIoTClient 23:1111ee8bcba4 5356 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5357 }
AzureIoTClient 6:641a9672db08 5358 else if (internal_decoder_decode_bytes(internal_decoder_data->inner_decoder, buffer, size, &inner_used_bytes) != 0)
Azure.IoT Build 0:6ae2f7bca550 5359 {
AzureIoTClient 23:1111ee8bcba4 5360 LogError("Could not decode map item");
AzureIoTClient 23:1111ee8bcba4 5361 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5362 }
Azure.IoT Build 0:6ae2f7bca550 5363 else
Azure.IoT Build 0:6ae2f7bca550 5364 {
Azure.IoT Build 0:6ae2f7bca550 5365 INTERNAL_DECODER_DATA* inner_decoder = (INTERNAL_DECODER_DATA*)internal_decoder_data->inner_decoder;
AzureIoTClient 6:641a9672db08 5366 internal_decoder_data->bytes_decoded += inner_used_bytes;
AzureIoTClient 6:641a9672db08 5367 buffer += inner_used_bytes;
AzureIoTClient 6:641a9672db08 5368 size -= inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5369
Azure.IoT Build 0:6ae2f7bca550 5370 if (inner_decoder->decoder_state == DECODER_STATE_DONE)
Azure.IoT Build 0:6ae2f7bca550 5371 {
Azure.IoT Build 0:6ae2f7bca550 5372 internal_decoder_destroy(inner_decoder);
Azure.IoT Build 0:6ae2f7bca550 5373 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5374 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5375
Azure.IoT Build 0:6ae2f7bca550 5376 if (internal_decoder_data->decode_to_value->value.map_value.pairs[internal_decoder_data->decode_value_state.map_value_state.item].value != NULL)
Azure.IoT Build 0:6ae2f7bca550 5377 {
Azure.IoT Build 0:6ae2f7bca550 5378 internal_decoder_data->decode_value_state.map_value_state.item++;
Azure.IoT Build 0:6ae2f7bca550 5379 if (internal_decoder_data->decode_value_state.map_value_state.item == internal_decoder_data->decode_to_value->value.map_value.pair_count)
Azure.IoT Build 0:6ae2f7bca550 5380 {
Azure.IoT Build 0:6ae2f7bca550 5381 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5382
Azure.IoT Build 0:6ae2f7bca550 5383 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5384 }
Azure.IoT Build 0:6ae2f7bca550 5385 }
Azure.IoT Build 0:6ae2f7bca550 5386 }
Azure.IoT Build 0:6ae2f7bca550 5387
Azure.IoT Build 0:6ae2f7bca550 5388 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5389 }
Azure.IoT Build 0:6ae2f7bca550 5390
Azure.IoT Build 0:6ae2f7bca550 5391 break;
Azure.IoT Build 0:6ae2f7bca550 5392 }
Azure.IoT Build 0:6ae2f7bca550 5393 }
Azure.IoT Build 0:6ae2f7bca550 5394
Azure.IoT Build 0:6ae2f7bca550 5395 break;
Azure.IoT Build 0:6ae2f7bca550 5396 }
Azure.IoT Build 0:6ae2f7bca550 5397 case 0xE0:
Azure.IoT Build 0:6ae2f7bca550 5398 case 0xF0:
Azure.IoT Build 0:6ae2f7bca550 5399 {
Azure.IoT Build 0:6ae2f7bca550 5400 DECODE_ARRAY_STEP step = internal_decoder_data->decode_value_state.array_value_state.array_value_state;
Azure.IoT Build 0:6ae2f7bca550 5401
Azure.IoT Build 0:6ae2f7bca550 5402 switch (step)
Azure.IoT Build 0:6ae2f7bca550 5403 {
Azure.IoT Build 0:6ae2f7bca550 5404 default:
AzureIoTClient 23:1111ee8bcba4 5405 LogError("Invalid step in decoding array value: %d", step);
AzureIoTClient 23:1111ee8bcba4 5406 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5407 break;
Azure.IoT Build 0:6ae2f7bca550 5408
Azure.IoT Build 0:6ae2f7bca550 5409 case DECODE_ARRAY_STEP_SIZE:
Azure.IoT Build 0:6ae2f7bca550 5410 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 5411 buffer++;
Azure.IoT Build 0:6ae2f7bca550 5412 size--;
Azure.IoT Build 0:6ae2f7bca550 5413
Azure.IoT Build 0:6ae2f7bca550 5414 if (internal_decoder_data->constructor_byte == 0xE0)
Azure.IoT Build 0:6ae2f7bca550 5415 {
Azure.IoT Build 0:6ae2f7bca550 5416 internal_decoder_data->decode_value_state.array_value_state.array_value_state = DECODE_ARRAY_STEP_COUNT;
Azure.IoT Build 0:6ae2f7bca550 5417 internal_decoder_data->bytes_decoded = 0;
AzureIoTClient 17:923575db8b2d 5418 internal_decoder_data->decode_to_value->value.array_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 5419 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5420 }
Azure.IoT Build 0:6ae2f7bca550 5421 else
Azure.IoT Build 0:6ae2f7bca550 5422 {
Azure.IoT Build 0:6ae2f7bca550 5423 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 5424 {
Azure.IoT Build 0:6ae2f7bca550 5425 internal_decoder_data->decode_value_state.array_value_state.array_value_state = DECODE_ARRAY_STEP_COUNT;
Azure.IoT Build 0:6ae2f7bca550 5426 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5427 internal_decoder_data->decode_to_value->value.array_value.count = 0;
Azure.IoT Build 0:6ae2f7bca550 5428 }
Azure.IoT Build 0:6ae2f7bca550 5429 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5430 }
Azure.IoT Build 0:6ae2f7bca550 5431
Azure.IoT Build 0:6ae2f7bca550 5432 break;
Azure.IoT Build 0:6ae2f7bca550 5433
Azure.IoT Build 0:6ae2f7bca550 5434 case DECODE_ARRAY_STEP_COUNT:
Azure.IoT Build 0:6ae2f7bca550 5435 if (internal_decoder_data->constructor_byte == 0xE0)
Azure.IoT Build 0:6ae2f7bca550 5436 {
Azure.IoT Build 0:6ae2f7bca550 5437 internal_decoder_data->decode_to_value->value.array_value.count = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 5438 }
Azure.IoT Build 0:6ae2f7bca550 5439 else
Azure.IoT Build 0:6ae2f7bca550 5440 {
Azure.IoT Build 0:6ae2f7bca550 5441 internal_decoder_data->decode_to_value->value.array_value.count += buffer[0] << ((3 - internal_decoder_data->bytes_decoded) * 8);
Azure.IoT Build 0:6ae2f7bca550 5442 }
AzureIoTClient 23:1111ee8bcba4 5443
Azure.IoT Build 0:6ae2f7bca550 5444 internal_decoder_data->bytes_decoded++;
Azure.IoT Build 0:6ae2f7bca550 5445 buffer++;
Azure.IoT Build 0:6ae2f7bca550 5446 size--;
Azure.IoT Build 0:6ae2f7bca550 5447
Azure.IoT Build 0:6ae2f7bca550 5448 if (internal_decoder_data->constructor_byte == 0xE0)
Azure.IoT Build 0:6ae2f7bca550 5449 {
Azure.IoT Build 0:6ae2f7bca550 5450 if (internal_decoder_data->decode_to_value->value.array_value.count == 0)
Azure.IoT Build 0:6ae2f7bca550 5451 {
Azure.IoT Build 0:6ae2f7bca550 5452 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5453
Azure.IoT Build 0:6ae2f7bca550 5454 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5455 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5456 }
Azure.IoT Build 0:6ae2f7bca550 5457 else
Azure.IoT Build 0:6ae2f7bca550 5458 {
Azure.IoT Build 0:6ae2f7bca550 5459 uint32_t i;
AzureIoTClient 21:f9c433d8e6ca 5460 internal_decoder_data->decode_to_value->value.array_value.items = (AMQP_VALUE*)malloc(sizeof(AMQP_VALUE) * internal_decoder_data->decode_to_value->value.array_value.count);
Azure.IoT Build 0:6ae2f7bca550 5461 if (internal_decoder_data->decode_to_value->value.array_value.items == NULL)
Azure.IoT Build 0:6ae2f7bca550 5462 {
AzureIoTClient 23:1111ee8bcba4 5463 LogError("Could not allocate memory for array items");
AzureIoTClient 23:1111ee8bcba4 5464 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5465 }
Azure.IoT Build 0:6ae2f7bca550 5466 else
Azure.IoT Build 0:6ae2f7bca550 5467 {
Azure.IoT Build 0:6ae2f7bca550 5468 for (i = 0; i < internal_decoder_data->decode_to_value->value.array_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 5469 {
Azure.IoT Build 0:6ae2f7bca550 5470 internal_decoder_data->decode_to_value->value.array_value.items[i] = NULL;
Azure.IoT Build 0:6ae2f7bca550 5471 }
Azure.IoT Build 0:6ae2f7bca550 5472
Azure.IoT Build 0:6ae2f7bca550 5473 internal_decoder_data->decode_value_state.array_value_state.array_value_state = DECODE_ARRAY_STEP_ITEMS;
Azure.IoT Build 0:6ae2f7bca550 5474 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5475 internal_decoder_data->inner_decoder = NULL;
AzureIoTClient 17:923575db8b2d 5476 internal_decoder_data->decode_value_state.array_value_state.item = 0;
Azure.IoT Build 0:6ae2f7bca550 5477 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5478 }
Azure.IoT Build 0:6ae2f7bca550 5479 }
Azure.IoT Build 0:6ae2f7bca550 5480 }
Azure.IoT Build 0:6ae2f7bca550 5481 else
Azure.IoT Build 0:6ae2f7bca550 5482 {
Azure.IoT Build 0:6ae2f7bca550 5483 if (internal_decoder_data->bytes_decoded == 4)
Azure.IoT Build 0:6ae2f7bca550 5484 {
Azure.IoT Build 0:6ae2f7bca550 5485 if (internal_decoder_data->decode_to_value->value.array_value.count == 0)
Azure.IoT Build 0:6ae2f7bca550 5486 {
Azure.IoT Build 0:6ae2f7bca550 5487 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5488 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5489 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5490 }
Azure.IoT Build 0:6ae2f7bca550 5491 else
Azure.IoT Build 0:6ae2f7bca550 5492 {
Azure.IoT Build 0:6ae2f7bca550 5493 uint32_t i;
AzureIoTClient 21:f9c433d8e6ca 5494 internal_decoder_data->decode_to_value->value.array_value.items = (AMQP_VALUE*)malloc(sizeof(AMQP_VALUE) * internal_decoder_data->decode_to_value->value.array_value.count);
Azure.IoT Build 0:6ae2f7bca550 5495 if (internal_decoder_data->decode_to_value->value.array_value.items == NULL)
Azure.IoT Build 0:6ae2f7bca550 5496 {
AzureIoTClient 23:1111ee8bcba4 5497 LogError("Could not allocate memory for array items");
AzureIoTClient 23:1111ee8bcba4 5498 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5499 }
Azure.IoT Build 0:6ae2f7bca550 5500 else
Azure.IoT Build 0:6ae2f7bca550 5501 {
Azure.IoT Build 0:6ae2f7bca550 5502 for (i = 0; i < internal_decoder_data->decode_to_value->value.array_value.count; i++)
Azure.IoT Build 0:6ae2f7bca550 5503 {
Azure.IoT Build 0:6ae2f7bca550 5504 internal_decoder_data->decode_to_value->value.array_value.items[i] = NULL;
Azure.IoT Build 0:6ae2f7bca550 5505 }
Azure.IoT Build 0:6ae2f7bca550 5506 internal_decoder_data->decode_value_state.array_value_state.array_value_state = DECODE_ARRAY_STEP_ITEMS;
Azure.IoT Build 0:6ae2f7bca550 5507 internal_decoder_data->bytes_decoded = 0;
Azure.IoT Build 0:6ae2f7bca550 5508 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5509 internal_decoder_data->decode_value_state.array_value_state.item = 0;
Azure.IoT Build 0:6ae2f7bca550 5510 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5511 }
Azure.IoT Build 0:6ae2f7bca550 5512 }
Azure.IoT Build 0:6ae2f7bca550 5513 }
Azure.IoT Build 0:6ae2f7bca550 5514 else
Azure.IoT Build 0:6ae2f7bca550 5515 {
Azure.IoT Build 0:6ae2f7bca550 5516 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5517 }
Azure.IoT Build 0:6ae2f7bca550 5518 }
Azure.IoT Build 0:6ae2f7bca550 5519 break;
Azure.IoT Build 0:6ae2f7bca550 5520
Azure.IoT Build 0:6ae2f7bca550 5521 case DECODE_ARRAY_STEP_ITEMS:
Azure.IoT Build 0:6ae2f7bca550 5522 {
AzureIoTClient 6:641a9672db08 5523 size_t inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5524
Azure.IoT Build 0:6ae2f7bca550 5525 if (internal_decoder_data->bytes_decoded == 0)
Azure.IoT Build 0:6ae2f7bca550 5526 {
Azure.IoT Build 0:6ae2f7bca550 5527 internal_decoder_data->decode_value_state.array_value_state.constructor_byte = buffer[0];
Azure.IoT Build 0:6ae2f7bca550 5528
AzureIoTClient 21:f9c433d8e6ca 5529 AMQP_VALUE_DATA* array_item = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 5530 if (array_item == NULL)
Azure.IoT Build 0:6ae2f7bca550 5531 {
AzureIoTClient 23:1111ee8bcba4 5532 LogError("Could not allocate memory for array item to be decoded");
AzureIoTClient 23:1111ee8bcba4 5533 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 5534 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5535 }
Azure.IoT Build 0:6ae2f7bca550 5536 else
Azure.IoT Build 0:6ae2f7bca550 5537 {
Azure.IoT Build 0:6ae2f7bca550 5538 array_item->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 5539 internal_decoder_data->decode_to_value->value.array_value.items[internal_decoder_data->decode_value_state.array_value_state.item] = array_item;
Azure.IoT Build 0:6ae2f7bca550 5540 internal_decoder_data->inner_decoder = internal_decoder_create(inner_decoder_callback, internal_decoder_data, array_item);
Azure.IoT Build 0:6ae2f7bca550 5541 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5542 {
Azure.IoT Build 0:6ae2f7bca550 5543 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 23:1111ee8bcba4 5544 LogError("Could not create inner decoder for array items");
AzureIoTClient 23:1111ee8bcba4 5545 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5546 }
Azure.IoT Build 0:6ae2f7bca550 5547 else
Azure.IoT Build 0:6ae2f7bca550 5548 {
Azure.IoT Build 0:6ae2f7bca550 5549 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5550 }
Azure.IoT Build 0:6ae2f7bca550 5551 }
Azure.IoT Build 0:6ae2f7bca550 5552 }
Azure.IoT Build 0:6ae2f7bca550 5553
Azure.IoT Build 0:6ae2f7bca550 5554 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5555 {
AzureIoTClient 23:1111ee8bcba4 5556 LogError("NULL inner decoder. This should not happen under normal circumstances");
AzureIoTClient 23:1111ee8bcba4 5557 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5558 }
AzureIoTClient 6:641a9672db08 5559 else if (internal_decoder_decode_bytes(internal_decoder_data->inner_decoder, buffer, size, &inner_used_bytes) != 0)
Azure.IoT Build 0:6ae2f7bca550 5560 {
AzureIoTClient 23:1111ee8bcba4 5561 LogError("Could not decode array item");
AzureIoTClient 23:1111ee8bcba4 5562 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5563 }
Azure.IoT Build 0:6ae2f7bca550 5564 else
Azure.IoT Build 0:6ae2f7bca550 5565 {
Azure.IoT Build 0:6ae2f7bca550 5566 INTERNAL_DECODER_DATA* inner_decoder = (INTERNAL_DECODER_DATA*)internal_decoder_data->inner_decoder;
AzureIoTClient 6:641a9672db08 5567 internal_decoder_data->bytes_decoded += inner_used_bytes;
AzureIoTClient 6:641a9672db08 5568 buffer += inner_used_bytes;
AzureIoTClient 6:641a9672db08 5569 size -= inner_used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5570
Azure.IoT Build 0:6ae2f7bca550 5571 if (inner_decoder->decoder_state == DECODER_STATE_DONE)
Azure.IoT Build 0:6ae2f7bca550 5572 {
Azure.IoT Build 0:6ae2f7bca550 5573 internal_decoder_destroy(inner_decoder);
Azure.IoT Build 0:6ae2f7bca550 5574 internal_decoder_data->inner_decoder = NULL;
Azure.IoT Build 0:6ae2f7bca550 5575
Azure.IoT Build 0:6ae2f7bca550 5576 internal_decoder_data->decode_value_state.array_value_state.item++;
Azure.IoT Build 0:6ae2f7bca550 5577 if (internal_decoder_data->decode_value_state.array_value_state.item == internal_decoder_data->decode_to_value->value.array_value.count)
Azure.IoT Build 0:6ae2f7bca550 5578 {
Azure.IoT Build 0:6ae2f7bca550 5579 internal_decoder_data->decoder_state = DECODER_STATE_CONSTRUCTOR;
Azure.IoT Build 0:6ae2f7bca550 5580 internal_decoder_data->on_value_decoded(internal_decoder_data->on_value_decoded_context, internal_decoder_data->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5581
Azure.IoT Build 0:6ae2f7bca550 5582 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5583 }
Azure.IoT Build 0:6ae2f7bca550 5584 else
Azure.IoT Build 0:6ae2f7bca550 5585 {
AzureIoTClient 21:f9c433d8e6ca 5586 AMQP_VALUE_DATA* array_item = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 5587 if (array_item == NULL)
Azure.IoT Build 0:6ae2f7bca550 5588 {
AzureIoTClient 23:1111ee8bcba4 5589 LogError("Could not allocate memory for array item");
AzureIoTClient 23:1111ee8bcba4 5590 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 19:000ab4e6a2c1 5591 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5592 }
Azure.IoT Build 0:6ae2f7bca550 5593 else
Azure.IoT Build 0:6ae2f7bca550 5594 {
Azure.IoT Build 0:6ae2f7bca550 5595 array_item->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 5596 internal_decoder_data->decode_to_value->value.array_value.items[internal_decoder_data->decode_value_state.array_value_state.item] = array_item;
Azure.IoT Build 0:6ae2f7bca550 5597 internal_decoder_data->inner_decoder = internal_decoder_create(inner_decoder_callback, internal_decoder_data, array_item);
Azure.IoT Build 0:6ae2f7bca550 5598 if (internal_decoder_data->inner_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5599 {
AzureIoTClient 23:1111ee8bcba4 5600 LogError("Could not create inner decoder for array item");
AzureIoTClient 23:1111ee8bcba4 5601 internal_decoder_data->decoder_state = DECODER_STATE_ERROR;
AzureIoTClient 19:000ab4e6a2c1 5602 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5603 }
Azure.IoT Build 0:6ae2f7bca550 5604 else
Azure.IoT Build 0:6ae2f7bca550 5605 {
Azure.IoT Build 0:6ae2f7bca550 5606 if (internal_decoder_decode_bytes(internal_decoder_data->inner_decoder, &internal_decoder_data->decode_value_state.array_value_state.constructor_byte, 1, NULL) != 0)
Azure.IoT Build 0:6ae2f7bca550 5607 {
AzureIoTClient 23:1111ee8bcba4 5608 LogError("Could not decode array item data");
AzureIoTClient 23:1111ee8bcba4 5609 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5610 }
Azure.IoT Build 0:6ae2f7bca550 5611 else
Azure.IoT Build 0:6ae2f7bca550 5612 {
Azure.IoT Build 0:6ae2f7bca550 5613 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5614 }
Azure.IoT Build 0:6ae2f7bca550 5615 }
Azure.IoT Build 0:6ae2f7bca550 5616 }
Azure.IoT Build 0:6ae2f7bca550 5617 }
Azure.IoT Build 0:6ae2f7bca550 5618 }
Azure.IoT Build 0:6ae2f7bca550 5619 else
Azure.IoT Build 0:6ae2f7bca550 5620 {
Azure.IoT Build 0:6ae2f7bca550 5621 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5622 }
Azure.IoT Build 0:6ae2f7bca550 5623 }
Azure.IoT Build 0:6ae2f7bca550 5624
Azure.IoT Build 0:6ae2f7bca550 5625 break;
Azure.IoT Build 0:6ae2f7bca550 5626 }
Azure.IoT Build 0:6ae2f7bca550 5627 }
Azure.IoT Build 0:6ae2f7bca550 5628
Azure.IoT Build 0:6ae2f7bca550 5629 break;
Azure.IoT Build 0:6ae2f7bca550 5630 }
Azure.IoT Build 0:6ae2f7bca550 5631 }
Azure.IoT Build 0:6ae2f7bca550 5632 break;
Azure.IoT Build 0:6ae2f7bca550 5633 }
Azure.IoT Build 0:6ae2f7bca550 5634 }
Azure.IoT Build 0:6ae2f7bca550 5635
Azure.IoT Build 0:6ae2f7bca550 5636 if (result != 0)
Azure.IoT Build 0:6ae2f7bca550 5637 {
Azure.IoT Build 0:6ae2f7bca550 5638 break;
Azure.IoT Build 0:6ae2f7bca550 5639 }
Azure.IoT Build 0:6ae2f7bca550 5640 }
Azure.IoT Build 0:6ae2f7bca550 5641 }
Azure.IoT Build 0:6ae2f7bca550 5642
Azure.IoT Build 0:6ae2f7bca550 5643 if (used_bytes != NULL)
Azure.IoT Build 0:6ae2f7bca550 5644 {
Azure.IoT Build 0:6ae2f7bca550 5645 *used_bytes = initial_size - size;
Azure.IoT Build 0:6ae2f7bca550 5646 }
Azure.IoT Build 0:6ae2f7bca550 5647
Azure.IoT Build 0:6ae2f7bca550 5648 return result;
Azure.IoT Build 0:6ae2f7bca550 5649 }
Azure.IoT Build 0:6ae2f7bca550 5650
Azure.IoT Build 0:6ae2f7bca550 5651 AMQPVALUE_DECODER_HANDLE amqpvalue_decoder_create(ON_VALUE_DECODED on_value_decoded, void* callback_context)
Azure.IoT Build 0:6ae2f7bca550 5652 {
AzureIoTClient 7:9e9ab3b0efef 5653 AMQPVALUE_DECODER_HANDLE_DATA* decoder_instance;
Azure.IoT Build 0:6ae2f7bca550 5654
Azure.IoT Build 0:6ae2f7bca550 5655 /* Codes_SRS_AMQPVALUE_01_312: [If the on_value_decoded argument is NULL, amqpvalue_decoder_create shall return NULL.] */
Azure.IoT Build 0:6ae2f7bca550 5656 if (on_value_decoded == NULL)
Azure.IoT Build 0:6ae2f7bca550 5657 {
AzureIoTClient 23:1111ee8bcba4 5658 LogError("NULL on_value_decoded");
AzureIoTClient 23:1111ee8bcba4 5659 decoder_instance = NULL;
Azure.IoT Build 0:6ae2f7bca550 5660 }
Azure.IoT Build 0:6ae2f7bca550 5661 else
Azure.IoT Build 0:6ae2f7bca550 5662 {
AzureIoTClient 21:f9c433d8e6ca 5663 decoder_instance = (AMQPVALUE_DECODER_HANDLE_DATA*)malloc(sizeof(AMQPVALUE_DECODER_HANDLE_DATA));
Azure.IoT Build 0:6ae2f7bca550 5664 /* Codes_SRS_AMQPVALUE_01_313: [If creating the decoder fails, amqpvalue_decoder_create shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 5665 if (decoder_instance == NULL)
AzureIoTClient 23:1111ee8bcba4 5666 {
AzureIoTClient 23:1111ee8bcba4 5667 LogError("Could not allocate memory for AMQP value decoder");
AzureIoTClient 23:1111ee8bcba4 5668 }
AzureIoTClient 23:1111ee8bcba4 5669 else
AzureIoTClient 23:1111ee8bcba4 5670 {
AzureIoTClient 21:f9c433d8e6ca 5671 decoder_instance->decode_to_value = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
Azure.IoT Build 0:6ae2f7bca550 5672 if (decoder_instance->decode_to_value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5673 {
Azure.IoT Build 0:6ae2f7bca550 5674 /* Codes_SRS_AMQPVALUE_01_313: [If creating the decoder fails, amqpvalue_decoder_create shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 5675 LogError("Could not allocate memory for decoded AMQP value");
AzureIoTClient 23:1111ee8bcba4 5676 free(decoder_instance);
Azure.IoT Build 0:6ae2f7bca550 5677 decoder_instance = NULL;
Azure.IoT Build 0:6ae2f7bca550 5678 }
Azure.IoT Build 0:6ae2f7bca550 5679 else
Azure.IoT Build 0:6ae2f7bca550 5680 {
Azure.IoT Build 0:6ae2f7bca550 5681 decoder_instance->decode_to_value->type = AMQP_TYPE_UNKNOWN;
Azure.IoT Build 0:6ae2f7bca550 5682 decoder_instance->internal_decoder = internal_decoder_create(on_value_decoded, callback_context, decoder_instance->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5683 if (decoder_instance->internal_decoder == NULL)
Azure.IoT Build 0:6ae2f7bca550 5684 {
Azure.IoT Build 0:6ae2f7bca550 5685 /* Codes_SRS_AMQPVALUE_01_313: [If creating the decoder fails, amqpvalue_decoder_create shall return NULL.] */
AzureIoTClient 23:1111ee8bcba4 5686 LogError("Could not create the internal decoder");
AzureIoTClient 23:1111ee8bcba4 5687 free(decoder_instance->decode_to_value);
AzureIoTClient 21:f9c433d8e6ca 5688 free(decoder_instance);
Azure.IoT Build 0:6ae2f7bca550 5689 decoder_instance = NULL;
Azure.IoT Build 0:6ae2f7bca550 5690 }
Azure.IoT Build 0:6ae2f7bca550 5691 }
Azure.IoT Build 0:6ae2f7bca550 5692 }
Azure.IoT Build 0:6ae2f7bca550 5693 }
Azure.IoT Build 0:6ae2f7bca550 5694
Azure.IoT Build 0:6ae2f7bca550 5695 /* Codes_SRS_AMQPVALUE_01_311: [amqpvalue_decoder_create shall create a new amqp value decoder and return a non-NULL handle to it.] */
Azure.IoT Build 0:6ae2f7bca550 5696 return decoder_instance;
Azure.IoT Build 0:6ae2f7bca550 5697 }
Azure.IoT Build 0:6ae2f7bca550 5698
Azure.IoT Build 0:6ae2f7bca550 5699 void amqpvalue_decoder_destroy(AMQPVALUE_DECODER_HANDLE handle)
Azure.IoT Build 0:6ae2f7bca550 5700 {
AzureIoTClient 23:1111ee8bcba4 5701 if (handle == NULL)
AzureIoTClient 23:1111ee8bcba4 5702 {
AzureIoTClient 23:1111ee8bcba4 5703 /* Codes_SRS_AMQPVALUE_01_317: [If handle is NULL, amqpvalue_decoder_destroy shall do nothing.] */
AzureIoTClient 23:1111ee8bcba4 5704 LogError("NULL handle");
AzureIoTClient 23:1111ee8bcba4 5705 }
AzureIoTClient 23:1111ee8bcba4 5706 else
AzureIoTClient 23:1111ee8bcba4 5707 {
AzureIoTClient 23:1111ee8bcba4 5708 AMQPVALUE_DECODER_HANDLE_DATA* decoder_instance = (AMQPVALUE_DECODER_HANDLE_DATA*)handle;
Azure.IoT Build 0:6ae2f7bca550 5709 /* Codes_SRS_AMQPVALUE_01_316: [amqpvalue_decoder_destroy shall free all resources associated with the amqpvalue_decoder.] */
Azure.IoT Build 0:6ae2f7bca550 5710 amqpvalue_destroy(decoder_instance->decode_to_value);
Azure.IoT Build 0:6ae2f7bca550 5711 internal_decoder_destroy(decoder_instance->internal_decoder);
AzureIoTClient 21:f9c433d8e6ca 5712 free(handle);
Azure.IoT Build 0:6ae2f7bca550 5713 }
Azure.IoT Build 0:6ae2f7bca550 5714 }
Azure.IoT Build 0:6ae2f7bca550 5715
Azure.IoT Build 0:6ae2f7bca550 5716 /* Codes_SRS_AMQPVALUE_01_318: [amqpvalue_decode_bytes shall decode size bytes that are passed in the buffer argument.] */
Azure.IoT Build 0:6ae2f7bca550 5717 int amqpvalue_decode_bytes(AMQPVALUE_DECODER_HANDLE handle, const unsigned char* buffer, size_t size)
Azure.IoT Build 0:6ae2f7bca550 5718 {
Azure.IoT Build 0:6ae2f7bca550 5719 int result;
Azure.IoT Build 0:6ae2f7bca550 5720
AzureIoTClient 7:9e9ab3b0efef 5721 AMQPVALUE_DECODER_HANDLE_DATA* decoder_instance = (AMQPVALUE_DECODER_HANDLE_DATA*)handle;
Azure.IoT Build 0:6ae2f7bca550 5722 /* Codes_SRS_AMQPVALUE_01_320: [If handle or buffer are NULL, amqpvalue_decode_bytes shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 5723 if ((decoder_instance == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 5724 (buffer == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 5725 /* Codes_SRS_AMQPVALUE_01_321: [If size is 0, amqpvalue_decode_bytes shall return a non-zero value.] */
Azure.IoT Build 0:6ae2f7bca550 5726 (size == 0))
Azure.IoT Build 0:6ae2f7bca550 5727 {
AzureIoTClient 23:1111ee8bcba4 5728 LogError("Bad arguments: decoder_instance = %p, buffer = %p, size = %u",
AzureIoTClient 23:1111ee8bcba4 5729 decoder_instance, buffer, size);
AzureIoTClient 23:1111ee8bcba4 5730 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5731 }
Azure.IoT Build 0:6ae2f7bca550 5732 else
Azure.IoT Build 0:6ae2f7bca550 5733 {
Azure.IoT Build 0:6ae2f7bca550 5734 size_t used_bytes;
Azure.IoT Build 0:6ae2f7bca550 5735
Azure.IoT Build 0:6ae2f7bca550 5736 /* Codes_SRS_AMQPVALUE_01_318: [amqpvalue_decode_bytes shall decode size bytes that are passed in the buffer argument.] */
Azure.IoT Build 0:6ae2f7bca550 5737 if (internal_decoder_decode_bytes(decoder_instance->internal_decoder, buffer, size, &used_bytes) != 0)
Azure.IoT Build 0:6ae2f7bca550 5738 {
AzureIoTClient 23:1111ee8bcba4 5739 LogError("Failed decoding bytes");
AzureIoTClient 23:1111ee8bcba4 5740 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5741 }
Azure.IoT Build 0:6ae2f7bca550 5742 else
Azure.IoT Build 0:6ae2f7bca550 5743 {
Azure.IoT Build 0:6ae2f7bca550 5744 /* Codes_SRS_AMQPVALUE_01_319: [On success, amqpvalue_decode_bytes shall return 0.] */
Azure.IoT Build 0:6ae2f7bca550 5745 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5746 }
Azure.IoT Build 0:6ae2f7bca550 5747 }
Azure.IoT Build 0:6ae2f7bca550 5748
Azure.IoT Build 0:6ae2f7bca550 5749 return result;
Azure.IoT Build 0:6ae2f7bca550 5750 }
Azure.IoT Build 0:6ae2f7bca550 5751
Azure.IoT Build 0:6ae2f7bca550 5752 AMQP_VALUE amqpvalue_get_inplace_descriptor(AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 5753 {
Azure.IoT Build 0:6ae2f7bca550 5754 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 5755
Azure.IoT Build 0:6ae2f7bca550 5756 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5757 {
AzureIoTClient 23:1111ee8bcba4 5758 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 5759 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5760 }
Azure.IoT Build 0:6ae2f7bca550 5761 else
Azure.IoT Build 0:6ae2f7bca550 5762 {
Azure.IoT Build 0:6ae2f7bca550 5763 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 5764 if ((value_data->type != AMQP_TYPE_DESCRIBED) &&
Azure.IoT Build 0:6ae2f7bca550 5765 (value_data->type != AMQP_TYPE_COMPOSITE))
Azure.IoT Build 0:6ae2f7bca550 5766 {
AzureIoTClient 23:1111ee8bcba4 5767 LogError("Type is not described or composite");
AzureIoTClient 23:1111ee8bcba4 5768 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5769 }
Azure.IoT Build 0:6ae2f7bca550 5770 else
Azure.IoT Build 0:6ae2f7bca550 5771 {
Azure.IoT Build 0:6ae2f7bca550 5772 result = value_data->value.described_value.descriptor;
Azure.IoT Build 0:6ae2f7bca550 5773 }
Azure.IoT Build 0:6ae2f7bca550 5774 }
Azure.IoT Build 0:6ae2f7bca550 5775
Azure.IoT Build 0:6ae2f7bca550 5776 return result;
Azure.IoT Build 0:6ae2f7bca550 5777 }
Azure.IoT Build 0:6ae2f7bca550 5778
Azure.IoT Build 0:6ae2f7bca550 5779 AMQP_VALUE amqpvalue_get_inplace_described_value(AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 5780 {
Azure.IoT Build 0:6ae2f7bca550 5781 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 5782
Azure.IoT Build 0:6ae2f7bca550 5783 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5784 {
AzureIoTClient 23:1111ee8bcba4 5785 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 5786 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5787 }
Azure.IoT Build 0:6ae2f7bca550 5788 else
Azure.IoT Build 0:6ae2f7bca550 5789 {
Azure.IoT Build 0:6ae2f7bca550 5790 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 5791 if ((value_data->type != AMQP_TYPE_DESCRIBED) &&
Azure.IoT Build 0:6ae2f7bca550 5792 (value_data->type != AMQP_TYPE_COMPOSITE))
Azure.IoT Build 0:6ae2f7bca550 5793 {
AzureIoTClient 23:1111ee8bcba4 5794 LogError("Type is not described or composite");
AzureIoTClient 23:1111ee8bcba4 5795 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5796 }
Azure.IoT Build 0:6ae2f7bca550 5797 else
Azure.IoT Build 0:6ae2f7bca550 5798 {
Azure.IoT Build 0:6ae2f7bca550 5799 result = value_data->value.described_value.value;
Azure.IoT Build 0:6ae2f7bca550 5800 }
Azure.IoT Build 0:6ae2f7bca550 5801 }
Azure.IoT Build 0:6ae2f7bca550 5802
Azure.IoT Build 0:6ae2f7bca550 5803 return result;
Azure.IoT Build 0:6ae2f7bca550 5804 }
Azure.IoT Build 0:6ae2f7bca550 5805
Azure.IoT Build 0:6ae2f7bca550 5806 AMQP_VALUE amqpvalue_create_described(AMQP_VALUE descriptor, AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 5807 {
AzureIoTClient 21:f9c433d8e6ca 5808 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 5809 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 5810 {
AzureIoTClient 23:1111ee8bcba4 5811 LogError("Cannot allocate memory for described type");
AzureIoTClient 23:1111ee8bcba4 5812 }
AzureIoTClient 23:1111ee8bcba4 5813 else
AzureIoTClient 23:1111ee8bcba4 5814 {
Azure.IoT Build 0:6ae2f7bca550 5815 result->type = AMQP_TYPE_DESCRIBED;
Azure.IoT Build 0:6ae2f7bca550 5816 result->value.described_value.descriptor = descriptor;
Azure.IoT Build 0:6ae2f7bca550 5817 result->value.described_value.value = value;
Azure.IoT Build 0:6ae2f7bca550 5818 }
AzureIoTClient 23:1111ee8bcba4 5819
Azure.IoT Build 0:6ae2f7bca550 5820 return result;
Azure.IoT Build 0:6ae2f7bca550 5821 }
Azure.IoT Build 0:6ae2f7bca550 5822
Azure.IoT Build 0:6ae2f7bca550 5823 AMQP_VALUE amqpvalue_create_composite(AMQP_VALUE descriptor, uint32_t list_size)
Azure.IoT Build 0:6ae2f7bca550 5824 {
AzureIoTClient 21:f9c433d8e6ca 5825 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 5826 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 5827 {
AzureIoTClient 23:1111ee8bcba4 5828 LogError("Cannot allocate memory for composite type");
AzureIoTClient 23:1111ee8bcba4 5829 }
AzureIoTClient 23:1111ee8bcba4 5830 else
AzureIoTClient 23:1111ee8bcba4 5831 {
Azure.IoT Build 0:6ae2f7bca550 5832 result->type = AMQP_TYPE_COMPOSITE;
Azure.IoT Build 0:6ae2f7bca550 5833 result->value.described_value.descriptor = amqpvalue_clone(descriptor);
Azure.IoT Build 0:6ae2f7bca550 5834 if (result->value.described_value.descriptor == NULL)
Azure.IoT Build 0:6ae2f7bca550 5835 {
AzureIoTClient 23:1111ee8bcba4 5836 LogError("Cannot clone descriptor for composite type");
AzureIoTClient 23:1111ee8bcba4 5837 free(result);
Azure.IoT Build 0:6ae2f7bca550 5838 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5839 }
Azure.IoT Build 0:6ae2f7bca550 5840 else
Azure.IoT Build 0:6ae2f7bca550 5841 {
Azure.IoT Build 0:6ae2f7bca550 5842 result->value.described_value.value = amqpvalue_create_list();
Azure.IoT Build 0:6ae2f7bca550 5843 if (result->value.described_value.value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5844 {
AzureIoTClient 23:1111ee8bcba4 5845 LogError("Cannot create list for composite type");
AzureIoTClient 23:1111ee8bcba4 5846 amqpvalue_destroy(result->value.described_value.descriptor);
AzureIoTClient 21:f9c433d8e6ca 5847 free(result);
Azure.IoT Build 0:6ae2f7bca550 5848 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5849 }
Azure.IoT Build 0:6ae2f7bca550 5850 else
Azure.IoT Build 0:6ae2f7bca550 5851 {
Azure.IoT Build 0:6ae2f7bca550 5852 if (amqpvalue_set_list_item_count(result->value.described_value.value, list_size) != 0)
Azure.IoT Build 0:6ae2f7bca550 5853 {
AzureIoTClient 23:1111ee8bcba4 5854 LogError("Cannot set list item count for composite type");
AzureIoTClient 23:1111ee8bcba4 5855 amqpvalue_destroy(result->value.described_value.descriptor);
Azure.IoT Build 0:6ae2f7bca550 5856 amqpvalue_destroy(result->value.described_value.value);
AzureIoTClient 21:f9c433d8e6ca 5857 free(result);
Azure.IoT Build 0:6ae2f7bca550 5858 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5859 }
Azure.IoT Build 0:6ae2f7bca550 5860 }
Azure.IoT Build 0:6ae2f7bca550 5861 }
Azure.IoT Build 0:6ae2f7bca550 5862 }
Azure.IoT Build 0:6ae2f7bca550 5863
Azure.IoT Build 0:6ae2f7bca550 5864 return result;
Azure.IoT Build 0:6ae2f7bca550 5865 }
Azure.IoT Build 0:6ae2f7bca550 5866
Azure.IoT Build 0:6ae2f7bca550 5867 AMQP_VALUE amqpvalue_create_composite_with_ulong_descriptor(uint64_t descriptor)
Azure.IoT Build 0:6ae2f7bca550 5868 {
AzureIoTClient 21:f9c433d8e6ca 5869 AMQP_VALUE_DATA* result = (AMQP_VALUE_DATA*)malloc(sizeof(AMQP_VALUE_DATA));
AzureIoTClient 23:1111ee8bcba4 5870 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 5871 {
AzureIoTClient 23:1111ee8bcba4 5872 LogError("Cannot allocate memory for composite type");
AzureIoTClient 23:1111ee8bcba4 5873 }
AzureIoTClient 23:1111ee8bcba4 5874 else
AzureIoTClient 23:1111ee8bcba4 5875 {
Azure.IoT Build 0:6ae2f7bca550 5876 AMQP_VALUE descriptor_ulong_value = amqpvalue_create_ulong(descriptor);
Azure.IoT Build 0:6ae2f7bca550 5877 if (descriptor_ulong_value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5878 {
AzureIoTClient 23:1111ee8bcba4 5879 LogError("Cannot create ulong descriptor for composite type");
AzureIoTClient 23:1111ee8bcba4 5880 free(result);
Azure.IoT Build 0:6ae2f7bca550 5881 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5882 }
Azure.IoT Build 0:6ae2f7bca550 5883 else
Azure.IoT Build 0:6ae2f7bca550 5884 {
Azure.IoT Build 0:6ae2f7bca550 5885 result->type = AMQP_TYPE_COMPOSITE;
Azure.IoT Build 0:6ae2f7bca550 5886 result->value.described_value.descriptor = descriptor_ulong_value;
AzureIoTClient 23:1111ee8bcba4 5887 result->value.described_value.value = amqpvalue_create_list();
AzureIoTClient 23:1111ee8bcba4 5888 if (result->value.described_value.value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5889 {
AzureIoTClient 23:1111ee8bcba4 5890 LogError("Cannot create list for composite type");
AzureIoTClient 23:1111ee8bcba4 5891 amqpvalue_destroy(descriptor_ulong_value);
AzureIoTClient 21:f9c433d8e6ca 5892 free(result);
Azure.IoT Build 0:6ae2f7bca550 5893 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5894 }
Azure.IoT Build 0:6ae2f7bca550 5895 }
Azure.IoT Build 0:6ae2f7bca550 5896 }
Azure.IoT Build 0:6ae2f7bca550 5897
Azure.IoT Build 0:6ae2f7bca550 5898 return result;
Azure.IoT Build 0:6ae2f7bca550 5899 }
Azure.IoT Build 0:6ae2f7bca550 5900
AzureIoTClient 6:641a9672db08 5901 int amqpvalue_set_composite_item(AMQP_VALUE value, uint32_t index, AMQP_VALUE item_value)
Azure.IoT Build 0:6ae2f7bca550 5902 {
Azure.IoT Build 0:6ae2f7bca550 5903 int result;
Azure.IoT Build 0:6ae2f7bca550 5904
Azure.IoT Build 0:6ae2f7bca550 5905 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5906 {
AzureIoTClient 23:1111ee8bcba4 5907 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 5908 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5909 }
Azure.IoT Build 0:6ae2f7bca550 5910 else
Azure.IoT Build 0:6ae2f7bca550 5911 {
Azure.IoT Build 0:6ae2f7bca550 5912 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 5913 if (value_data->type != AMQP_TYPE_COMPOSITE)
Azure.IoT Build 0:6ae2f7bca550 5914 {
AzureIoTClient 23:1111ee8bcba4 5915 LogError("Attempt to set composite item on a non-composite type");
AzureIoTClient 23:1111ee8bcba4 5916 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5917 }
Azure.IoT Build 0:6ae2f7bca550 5918 else
Azure.IoT Build 0:6ae2f7bca550 5919 {
Azure.IoT Build 0:6ae2f7bca550 5920 if (amqpvalue_set_list_item(value_data->value.described_value.value, index, item_value) != 0)
Azure.IoT Build 0:6ae2f7bca550 5921 {
AzureIoTClient 23:1111ee8bcba4 5922 LogError("amqpvalue_set_list_item failed for composite item");
AzureIoTClient 23:1111ee8bcba4 5923 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 5924 }
Azure.IoT Build 0:6ae2f7bca550 5925 else
Azure.IoT Build 0:6ae2f7bca550 5926 {
Azure.IoT Build 0:6ae2f7bca550 5927 result = 0;
Azure.IoT Build 0:6ae2f7bca550 5928 }
Azure.IoT Build 0:6ae2f7bca550 5929 }
Azure.IoT Build 0:6ae2f7bca550 5930 }
Azure.IoT Build 0:6ae2f7bca550 5931
Azure.IoT Build 0:6ae2f7bca550 5932 return result;
Azure.IoT Build 0:6ae2f7bca550 5933 }
Azure.IoT Build 0:6ae2f7bca550 5934
Azure.IoT Build 0:6ae2f7bca550 5935 AMQP_VALUE amqpvalue_get_composite_item(AMQP_VALUE value, size_t index)
Azure.IoT Build 0:6ae2f7bca550 5936 {
Azure.IoT Build 0:6ae2f7bca550 5937 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 5938
Azure.IoT Build 0:6ae2f7bca550 5939 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5940 {
AzureIoTClient 23:1111ee8bcba4 5941 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 5942 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5943 }
Azure.IoT Build 0:6ae2f7bca550 5944 else
Azure.IoT Build 0:6ae2f7bca550 5945 {
Azure.IoT Build 0:6ae2f7bca550 5946 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 5947 if ((value_data->type != AMQP_TYPE_COMPOSITE) &&
Azure.IoT Build 0:6ae2f7bca550 5948 (value_data->type != AMQP_TYPE_DESCRIBED))
Azure.IoT Build 0:6ae2f7bca550 5949 {
AzureIoTClient 23:1111ee8bcba4 5950 LogError("Attempt to get composite item on a non-composite type");
AzureIoTClient 23:1111ee8bcba4 5951 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5952 }
Azure.IoT Build 0:6ae2f7bca550 5953 else
Azure.IoT Build 0:6ae2f7bca550 5954 {
Azure.IoT Build 0:6ae2f7bca550 5955 result = amqpvalue_get_list_item(value_data->value.described_value.value, index);
AzureIoTClient 23:1111ee8bcba4 5956 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 5957 {
AzureIoTClient 23:1111ee8bcba4 5958 LogError("amqpvalue_get_list_item failed for composite item");
AzureIoTClient 23:1111ee8bcba4 5959 }
Azure.IoT Build 0:6ae2f7bca550 5960 }
Azure.IoT Build 0:6ae2f7bca550 5961 }
Azure.IoT Build 0:6ae2f7bca550 5962
Azure.IoT Build 0:6ae2f7bca550 5963 return result;
Azure.IoT Build 0:6ae2f7bca550 5964 }
Azure.IoT Build 0:6ae2f7bca550 5965
Azure.IoT Build 0:6ae2f7bca550 5966 AMQP_VALUE amqpvalue_get_composite_item_in_place(AMQP_VALUE value, size_t index)
Azure.IoT Build 0:6ae2f7bca550 5967 {
Azure.IoT Build 0:6ae2f7bca550 5968 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 5969
Azure.IoT Build 0:6ae2f7bca550 5970 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 5971 {
AzureIoTClient 23:1111ee8bcba4 5972 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 5973 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5974 }
Azure.IoT Build 0:6ae2f7bca550 5975 else
Azure.IoT Build 0:6ae2f7bca550 5976 {
Azure.IoT Build 0:6ae2f7bca550 5977 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 5978 if ((value_data->type != AMQP_TYPE_COMPOSITE) &&
Azure.IoT Build 0:6ae2f7bca550 5979 (value_data->type != AMQP_TYPE_DESCRIBED))
Azure.IoT Build 0:6ae2f7bca550 5980 {
AzureIoTClient 23:1111ee8bcba4 5981 LogError("Attempt to get composite item in place on a non-composite type");
AzureIoTClient 23:1111ee8bcba4 5982 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 5983 }
Azure.IoT Build 0:6ae2f7bca550 5984 else
Azure.IoT Build 0:6ae2f7bca550 5985 {
Azure.IoT Build 0:6ae2f7bca550 5986 result = amqpvalue_get_list_item_in_place(value_data->value.described_value.value, index);
AzureIoTClient 23:1111ee8bcba4 5987 if (result == NULL)
AzureIoTClient 23:1111ee8bcba4 5988 {
AzureIoTClient 23:1111ee8bcba4 5989 LogError("amqpvalue_get_list_item_in_place failed for composite item");
AzureIoTClient 23:1111ee8bcba4 5990 }
Azure.IoT Build 0:6ae2f7bca550 5991 }
Azure.IoT Build 0:6ae2f7bca550 5992 }
Azure.IoT Build 0:6ae2f7bca550 5993
Azure.IoT Build 0:6ae2f7bca550 5994 return result;
Azure.IoT Build 0:6ae2f7bca550 5995 }
Azure.IoT Build 0:6ae2f7bca550 5996
AzureIoTClient 23:1111ee8bcba4 5997 int amqpvalue_get_composite_item_count(AMQP_VALUE value, uint32_t* item_count)
AzureIoTClient 23:1111ee8bcba4 5998 {
AzureIoTClient 23:1111ee8bcba4 5999 int result;
AzureIoTClient 23:1111ee8bcba4 6000
AzureIoTClient 23:1111ee8bcba4 6001 if (value == NULL)
AzureIoTClient 23:1111ee8bcba4 6002 {
AzureIoTClient 23:1111ee8bcba4 6003 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 6004 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 6005 }
AzureIoTClient 23:1111ee8bcba4 6006 else
AzureIoTClient 23:1111ee8bcba4 6007 {
AzureIoTClient 23:1111ee8bcba4 6008 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
AzureIoTClient 23:1111ee8bcba4 6009 if ((value_data->type != AMQP_TYPE_COMPOSITE) &&
AzureIoTClient 23:1111ee8bcba4 6010 (value_data->type != AMQP_TYPE_DESCRIBED))
AzureIoTClient 23:1111ee8bcba4 6011 {
AzureIoTClient 23:1111ee8bcba4 6012 LogError("Attempt to get composite item in place on a non-composite type");
AzureIoTClient 23:1111ee8bcba4 6013 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 6014 }
AzureIoTClient 23:1111ee8bcba4 6015 else
AzureIoTClient 23:1111ee8bcba4 6016 {
AzureIoTClient 23:1111ee8bcba4 6017 if (amqpvalue_get_list_item_count(value_data->value.described_value.value, item_count) != 0)
AzureIoTClient 23:1111ee8bcba4 6018 {
AzureIoTClient 23:1111ee8bcba4 6019 LogError("amqpvalue_get_list_item_in_place failed for composite item");
AzureIoTClient 23:1111ee8bcba4 6020 result = __FAILURE__;
AzureIoTClient 23:1111ee8bcba4 6021 }
AzureIoTClient 23:1111ee8bcba4 6022 else
AzureIoTClient 23:1111ee8bcba4 6023 {
AzureIoTClient 23:1111ee8bcba4 6024 result = 0;
AzureIoTClient 23:1111ee8bcba4 6025 }
AzureIoTClient 23:1111ee8bcba4 6026 }
AzureIoTClient 23:1111ee8bcba4 6027 }
AzureIoTClient 23:1111ee8bcba4 6028
AzureIoTClient 23:1111ee8bcba4 6029 return result;
AzureIoTClient 23:1111ee8bcba4 6030 }
AzureIoTClient 23:1111ee8bcba4 6031
Azure.IoT Build 0:6ae2f7bca550 6032 AMQP_VALUE amqpvalue_get_list_item_in_place(AMQP_VALUE value, size_t index)
Azure.IoT Build 0:6ae2f7bca550 6033 {
Azure.IoT Build 0:6ae2f7bca550 6034 AMQP_VALUE result;
Azure.IoT Build 0:6ae2f7bca550 6035
Azure.IoT Build 0:6ae2f7bca550 6036 if (value == NULL)
Azure.IoT Build 0:6ae2f7bca550 6037 {
AzureIoTClient 23:1111ee8bcba4 6038 LogError("NULL value");
AzureIoTClient 23:1111ee8bcba4 6039 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 6040 }
Azure.IoT Build 0:6ae2f7bca550 6041 else
Azure.IoT Build 0:6ae2f7bca550 6042 {
Azure.IoT Build 0:6ae2f7bca550 6043 AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;
Azure.IoT Build 0:6ae2f7bca550 6044
Azure.IoT Build 0:6ae2f7bca550 6045 if ((value_data->type != AMQP_TYPE_LIST) ||
Azure.IoT Build 0:6ae2f7bca550 6046 (value_data->value.list_value.count <= index))
Azure.IoT Build 0:6ae2f7bca550 6047 {
AzureIoTClient 23:1111ee8bcba4 6048 LogError("Attempt to get list item in place on a non-list type");
AzureIoTClient 23:1111ee8bcba4 6049 result = NULL;
Azure.IoT Build 0:6ae2f7bca550 6050 }
Azure.IoT Build 0:6ae2f7bca550 6051 else
Azure.IoT Build 0:6ae2f7bca550 6052 {
Azure.IoT Build 0:6ae2f7bca550 6053 result = value_data->value.list_value.items[index];
Azure.IoT Build 0:6ae2f7bca550 6054 }
Azure.IoT Build 0:6ae2f7bca550 6055 }
Azure.IoT Build 0:6ae2f7bca550 6056
Azure.IoT Build 0:6ae2f7bca550 6057 return result;
Azure.IoT Build 0:6ae2f7bca550 6058 }