A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Feb 24 14:00:58 2017 -0800
Revision:
19:000ab4e6a2c1
Parent:
17:923575db8b2d
Child:
21:f9c433d8e6ca
1.1.8

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