A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Wed May 24 09:46:35 2017 -0700
Revision:
26:64f1113cb959
Parent:
25:1101516ee67d
Child:
28:add19eb7defa
1.1.15

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