A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Jun 30 10:41:22 2017 -0700
Revision:
28:add19eb7defa
Parent:
26:64f1113cb959
Child:
29:4a11413cf217
1.1.18

Who changed what in which revision?

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