Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Committer:
markrad
Date:
Thu Jan 05 00:20:03 2017 +0000
Revision:
58:f50b97b08851
Sample using MBED TLS

Who changed what in which revision?

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