A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Thu Oct 04 09:16:13 2018 -0700
Revision:
47:365a93fdb5bb
Parent:
46:01f7ca900e07
1.2.10

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