Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

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