Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Sat Jan 28 09:35:22 2017 -0800
Revision:
19:2e0811512ceb
Parent:
6:c55b013dfc2a
Child:
21:b92006c5b9ff
1.1.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 5 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 6 #include "azure_c_shared_utility/map.h"
Azure.IoT Build 6:c55b013dfc2a 7 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 8 #include "azure_c_shared_utility/strings.h"
Azure.IoT Build 0:fa2de1b79154 9
Azure.IoT Build 0:fa2de1b79154 10 DEFINE_ENUM_STRINGS(MAP_RESULT, MAP_RESULT_VALUES);
Azure.IoT Build 0:fa2de1b79154 11
Azure.IoT Build 0:fa2de1b79154 12 typedef struct MAP_HANDLE_DATA_TAG
Azure.IoT Build 0:fa2de1b79154 13 {
Azure.IoT Build 0:fa2de1b79154 14 char** keys;
Azure.IoT Build 0:fa2de1b79154 15 char** values;
Azure.IoT Build 0:fa2de1b79154 16 size_t count;
Azure.IoT Build 0:fa2de1b79154 17 MAP_FILTER_CALLBACK mapFilterCallback;
Azure.IoT Build 0:fa2de1b79154 18 }MAP_HANDLE_DATA;
Azure.IoT Build 0:fa2de1b79154 19
AzureIoTClient 1:9190c0f4d23a 20 #define LOG_MAP_ERROR LogError("result = %s", ENUM_TO_STRING(MAP_RESULT, result));
Azure.IoT Build 0:fa2de1b79154 21
Azure.IoT Build 0:fa2de1b79154 22 MAP_HANDLE Map_Create(MAP_FILTER_CALLBACK mapFilterFunc)
Azure.IoT Build 0:fa2de1b79154 23 {
Azure.IoT Build 0:fa2de1b79154 24 /*Codes_SRS_MAP_02_001: [Map_Create shall create a new, empty map.]*/
Azure.IoT Build 0:fa2de1b79154 25 MAP_HANDLE_DATA* result = (MAP_HANDLE_DATA*)malloc(sizeof(MAP_HANDLE_DATA));
Azure.IoT Build 0:fa2de1b79154 26 /*Codes_SRS_MAP_02_002: [If during creation there are any error, then Map_Create shall return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 27 if (result != NULL)
Azure.IoT Build 0:fa2de1b79154 28 {
Azure.IoT Build 0:fa2de1b79154 29 /*Codes_SRS_MAP_02_003: [Otherwise, it shall return a non-NULL handle that can be used in subsequent calls.] */
Azure.IoT Build 0:fa2de1b79154 30 result->keys = NULL;
Azure.IoT Build 0:fa2de1b79154 31 result->values = NULL;
Azure.IoT Build 0:fa2de1b79154 32 result->count = 0;
Azure.IoT Build 0:fa2de1b79154 33 result->mapFilterCallback = mapFilterFunc;
Azure.IoT Build 0:fa2de1b79154 34 }
Azure.IoT Build 0:fa2de1b79154 35 return (MAP_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 36 }
Azure.IoT Build 0:fa2de1b79154 37
Azure.IoT Build 0:fa2de1b79154 38 void Map_Destroy(MAP_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 39 {
Azure.IoT Build 0:fa2de1b79154 40 /*Codes_SRS_MAP_02_005: [If parameter handle is NULL then Map_Destroy shall take no action.] */
Azure.IoT Build 0:fa2de1b79154 41 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 42 {
Azure.IoT Build 0:fa2de1b79154 43 /*Codes_SRS_MAP_02_004: [Map_Destroy shall release all resources associated with the map.] */
Azure.IoT Build 0:fa2de1b79154 44 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle;
Azure.IoT Build 0:fa2de1b79154 45 size_t i;
Azure.IoT Build 0:fa2de1b79154 46
Azure.IoT Build 0:fa2de1b79154 47 for (i = 0; i < handleData->count; i++)
Azure.IoT Build 0:fa2de1b79154 48 {
Azure.IoT Build 0:fa2de1b79154 49 free(handleData->keys[i]);
Azure.IoT Build 0:fa2de1b79154 50 free(handleData->values[i]);
Azure.IoT Build 0:fa2de1b79154 51 }
Azure.IoT Build 0:fa2de1b79154 52 free(handleData->keys);
Azure.IoT Build 0:fa2de1b79154 53 free(handleData->values);
Azure.IoT Build 0:fa2de1b79154 54 free(handleData);
Azure.IoT Build 0:fa2de1b79154 55 }
Azure.IoT Build 0:fa2de1b79154 56 }
Azure.IoT Build 0:fa2de1b79154 57
Azure.IoT Build 0:fa2de1b79154 58 /*makes a copy of a vector of const char*, having size "size". source cannot be NULL*/
Azure.IoT Build 0:fa2de1b79154 59 /*returns NULL if it fails*/
Azure.IoT Build 0:fa2de1b79154 60 static char** Map_CloneVector(const char*const * source, size_t count)
Azure.IoT Build 0:fa2de1b79154 61 {
Azure.IoT Build 0:fa2de1b79154 62 char** result;
Azure.IoT Build 0:fa2de1b79154 63 result = (char**)malloc(count *sizeof(char*));
Azure.IoT Build 0:fa2de1b79154 64 if (result == NULL)
Azure.IoT Build 0:fa2de1b79154 65 {
Azure.IoT Build 0:fa2de1b79154 66 /*do nothing, just return it (NULL)*/
Azure.IoT Build 0:fa2de1b79154 67 }
Azure.IoT Build 0:fa2de1b79154 68 else
Azure.IoT Build 0:fa2de1b79154 69 {
Azure.IoT Build 0:fa2de1b79154 70 size_t i;
Azure.IoT Build 0:fa2de1b79154 71 for (i = 0; i < count; i++)
Azure.IoT Build 0:fa2de1b79154 72 {
Azure.IoT Build 0:fa2de1b79154 73 if (mallocAndStrcpy_s(result + i, source[i]) != 0)
Azure.IoT Build 0:fa2de1b79154 74 {
Azure.IoT Build 0:fa2de1b79154 75 break;
Azure.IoT Build 0:fa2de1b79154 76 }
Azure.IoT Build 0:fa2de1b79154 77 }
Azure.IoT Build 0:fa2de1b79154 78
Azure.IoT Build 0:fa2de1b79154 79 if (i == count)
Azure.IoT Build 0:fa2de1b79154 80 {
Azure.IoT Build 0:fa2de1b79154 81 /*it is all good, proceed to return result*/
Azure.IoT Build 0:fa2de1b79154 82 }
Azure.IoT Build 0:fa2de1b79154 83 else
Azure.IoT Build 0:fa2de1b79154 84 {
Azure.IoT Build 0:fa2de1b79154 85 size_t j;
Azure.IoT Build 0:fa2de1b79154 86 for (j = 0; j < i; j++)
Azure.IoT Build 0:fa2de1b79154 87 {
Azure.IoT Build 0:fa2de1b79154 88 free(result[j]);
Azure.IoT Build 0:fa2de1b79154 89 }
Azure.IoT Build 0:fa2de1b79154 90 free(result);
Azure.IoT Build 0:fa2de1b79154 91 result = NULL;
Azure.IoT Build 0:fa2de1b79154 92 }
Azure.IoT Build 0:fa2de1b79154 93 }
Azure.IoT Build 0:fa2de1b79154 94 return result;
Azure.IoT Build 0:fa2de1b79154 95 }
Azure.IoT Build 0:fa2de1b79154 96
Azure.IoT Build 0:fa2de1b79154 97 /*Codes_SRS_MAP_02_039: [Map_Clone shall make a copy of the map indicated by parameter handle and return a non-NULL handle to it.]*/
Azure.IoT Build 0:fa2de1b79154 98 MAP_HANDLE Map_Clone(MAP_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 99 {
Azure.IoT Build 0:fa2de1b79154 100 MAP_HANDLE_DATA* result;
Azure.IoT Build 0:fa2de1b79154 101 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 102 {
Azure.IoT Build 0:fa2de1b79154 103 /*Codes_SRS_MAP_02_038: [Map_Clone returns NULL if parameter handle is NULL.]*/
Azure.IoT Build 0:fa2de1b79154 104 result = NULL;
AzureIoTClient 1:9190c0f4d23a 105 LogError("invalid arg to Map_Clone (NULL)");
Azure.IoT Build 0:fa2de1b79154 106 }
Azure.IoT Build 0:fa2de1b79154 107 else
Azure.IoT Build 0:fa2de1b79154 108 {
Azure.IoT Build 0:fa2de1b79154 109 MAP_HANDLE_DATA * handleData = (MAP_HANDLE_DATA *)handle;
Azure.IoT Build 0:fa2de1b79154 110 result = (MAP_HANDLE_DATA*)malloc(sizeof(MAP_HANDLE_DATA));
Azure.IoT Build 0:fa2de1b79154 111 if (result == NULL)
Azure.IoT Build 0:fa2de1b79154 112 {
Azure.IoT Build 0:fa2de1b79154 113 /*Codes_SRS_MAP_02_047: [If during cloning, any operation fails, then Map_Clone shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 114 /*do nothing, proceed to return it, this is an error case*/
AzureIoTClient 1:9190c0f4d23a 115 LogError("unable to malloc");
Azure.IoT Build 0:fa2de1b79154 116 }
Azure.IoT Build 0:fa2de1b79154 117 else
Azure.IoT Build 0:fa2de1b79154 118 {
Azure.IoT Build 0:fa2de1b79154 119 if (handleData->count == 0)
Azure.IoT Build 0:fa2de1b79154 120 {
Azure.IoT Build 0:fa2de1b79154 121 result->count = 0;
Azure.IoT Build 0:fa2de1b79154 122 result->keys = NULL;
Azure.IoT Build 0:fa2de1b79154 123 result->values = NULL;
Azure.IoT Build 0:fa2de1b79154 124 result->mapFilterCallback = NULL;
Azure.IoT Build 0:fa2de1b79154 125 }
Azure.IoT Build 0:fa2de1b79154 126 else
Azure.IoT Build 0:fa2de1b79154 127 {
Azure.IoT Build 0:fa2de1b79154 128 result->mapFilterCallback = handleData->mapFilterCallback;
Azure.IoT Build 0:fa2de1b79154 129 result->count = handleData->count;
Azure.IoT Build 0:fa2de1b79154 130 if( (result->keys = Map_CloneVector((const char* const*)handleData->keys, handleData->count))==NULL)
Azure.IoT Build 0:fa2de1b79154 131 {
Azure.IoT Build 0:fa2de1b79154 132 /*Codes_SRS_MAP_02_047: [If during cloning, any operation fails, then Map_Clone shall return NULL.] */
AzureIoTClient 1:9190c0f4d23a 133 LogError("unable to clone keys");
Azure.IoT Build 0:fa2de1b79154 134 free(result);
Azure.IoT Build 0:fa2de1b79154 135 result = NULL;
Azure.IoT Build 0:fa2de1b79154 136 }
Azure.IoT Build 0:fa2de1b79154 137 else if ((result->values = Map_CloneVector((const char* const*)handleData->values, handleData->count)) == NULL)
Azure.IoT Build 0:fa2de1b79154 138 {
Azure.IoT Build 0:fa2de1b79154 139 /*Codes_SRS_MAP_02_047: [If during cloning, any operation fails, then Map_Clone shall return NULL.] */
AzureIoTClient 1:9190c0f4d23a 140 LogError("unable to clone values");
Azure.IoT Build 0:fa2de1b79154 141 size_t i;
Azure.IoT Build 0:fa2de1b79154 142 for (i = 0; i < result->count; i++)
Azure.IoT Build 0:fa2de1b79154 143 {
Azure.IoT Build 0:fa2de1b79154 144 free(result->keys[i]);
Azure.IoT Build 0:fa2de1b79154 145 }
Azure.IoT Build 0:fa2de1b79154 146 free(result->keys);
Azure.IoT Build 0:fa2de1b79154 147 free(result);
Azure.IoT Build 0:fa2de1b79154 148 result = NULL;
Azure.IoT Build 0:fa2de1b79154 149 }
Azure.IoT Build 0:fa2de1b79154 150 else
Azure.IoT Build 0:fa2de1b79154 151 {
Azure.IoT Build 0:fa2de1b79154 152 /*all fine, return it*/
Azure.IoT Build 0:fa2de1b79154 153 }
Azure.IoT Build 0:fa2de1b79154 154 }
Azure.IoT Build 0:fa2de1b79154 155 }
Azure.IoT Build 0:fa2de1b79154 156 }
Azure.IoT Build 0:fa2de1b79154 157 return (MAP_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 158 }
Azure.IoT Build 0:fa2de1b79154 159
Azure.IoT Build 0:fa2de1b79154 160 static int Map_IncreaseStorageKeysValues(MAP_HANDLE_DATA* handleData)
Azure.IoT Build 0:fa2de1b79154 161 {
Azure.IoT Build 0:fa2de1b79154 162 int result;
Azure.IoT Build 0:fa2de1b79154 163 char** newKeys = (char**)realloc(handleData->keys, (handleData->count + 1) * sizeof(char*));
Azure.IoT Build 0:fa2de1b79154 164 if (newKeys == NULL)
Azure.IoT Build 0:fa2de1b79154 165 {
AzureIoTClient 1:9190c0f4d23a 166 LogError("realloc error");
Azure.IoT Build 0:fa2de1b79154 167 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 168 }
Azure.IoT Build 0:fa2de1b79154 169 else
Azure.IoT Build 0:fa2de1b79154 170 {
Azure.IoT Build 0:fa2de1b79154 171 char** newValues;
Azure.IoT Build 0:fa2de1b79154 172 handleData->keys = newKeys;
Azure.IoT Build 0:fa2de1b79154 173 handleData->keys[handleData->count] = NULL;
Azure.IoT Build 0:fa2de1b79154 174 newValues = (char**)realloc(handleData->values, (handleData->count + 1) * sizeof(char*));
Azure.IoT Build 0:fa2de1b79154 175 if (newValues == NULL)
Azure.IoT Build 0:fa2de1b79154 176 {
AzureIoTClient 1:9190c0f4d23a 177 LogError("realloc error");
Azure.IoT Build 0:fa2de1b79154 178 if (handleData->count == 0) /*avoiding an implementation defined behavior */
Azure.IoT Build 0:fa2de1b79154 179 {
Azure.IoT Build 0:fa2de1b79154 180 free(handleData->keys);
Azure.IoT Build 0:fa2de1b79154 181 handleData->keys = NULL;
Azure.IoT Build 0:fa2de1b79154 182 }
Azure.IoT Build 0:fa2de1b79154 183 else
Azure.IoT Build 0:fa2de1b79154 184 {
Azure.IoT Build 0:fa2de1b79154 185 char** undoneKeys = (char**)realloc(handleData->keys, (handleData->count) * sizeof(char*));
Azure.IoT Build 0:fa2de1b79154 186 if (undoneKeys == NULL)
Azure.IoT Build 0:fa2de1b79154 187 {
AzureIoTClient 1:9190c0f4d23a 188 LogError("CATASTROPHIC error, unable to undo through realloc to a smaller size");
Azure.IoT Build 0:fa2de1b79154 189 }
Azure.IoT Build 0:fa2de1b79154 190 else
Azure.IoT Build 0:fa2de1b79154 191 {
Azure.IoT Build 0:fa2de1b79154 192 handleData->keys = undoneKeys;
Azure.IoT Build 0:fa2de1b79154 193 }
Azure.IoT Build 0:fa2de1b79154 194 }
Azure.IoT Build 0:fa2de1b79154 195 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 196 }
Azure.IoT Build 0:fa2de1b79154 197 else
Azure.IoT Build 0:fa2de1b79154 198 {
Azure.IoT Build 0:fa2de1b79154 199 handleData->values = newValues;
Azure.IoT Build 0:fa2de1b79154 200 handleData->values[handleData->count] = NULL;
Azure.IoT Build 0:fa2de1b79154 201 handleData->count++;
Azure.IoT Build 0:fa2de1b79154 202 result = 0;
Azure.IoT Build 0:fa2de1b79154 203 }
Azure.IoT Build 0:fa2de1b79154 204 }
Azure.IoT Build 0:fa2de1b79154 205 return result;
Azure.IoT Build 0:fa2de1b79154 206 }
Azure.IoT Build 0:fa2de1b79154 207
Azure.IoT Build 0:fa2de1b79154 208 static void Map_DecreaseStorageKeysValues(MAP_HANDLE_DATA* handleData)
Azure.IoT Build 0:fa2de1b79154 209 {
Azure.IoT Build 0:fa2de1b79154 210 if (handleData->count == 1)
Azure.IoT Build 0:fa2de1b79154 211 {
Azure.IoT Build 0:fa2de1b79154 212 free(handleData->keys);
Azure.IoT Build 0:fa2de1b79154 213 handleData->keys = NULL;
Azure.IoT Build 0:fa2de1b79154 214 free(handleData->values);
Azure.IoT Build 0:fa2de1b79154 215 handleData->values = NULL;
Azure.IoT Build 0:fa2de1b79154 216 handleData->count = 0;
Azure.IoT Build 0:fa2de1b79154 217 handleData->mapFilterCallback = NULL;
Azure.IoT Build 0:fa2de1b79154 218 }
Azure.IoT Build 0:fa2de1b79154 219 else
Azure.IoT Build 0:fa2de1b79154 220 {
Azure.IoT Build 0:fa2de1b79154 221 /*certainly > 1...*/
Azure.IoT Build 0:fa2de1b79154 222 char** undoneValues;
Azure.IoT Build 0:fa2de1b79154 223 char** undoneKeys = (char**)realloc(handleData->keys, sizeof(char*)* (handleData->count - 1));
Azure.IoT Build 0:fa2de1b79154 224 if (undoneKeys == NULL)
Azure.IoT Build 0:fa2de1b79154 225 {
AzureIoTClient 1:9190c0f4d23a 226 LogError("CATASTROPHIC error, unable to undo through realloc to a smaller size");
Azure.IoT Build 0:fa2de1b79154 227 }
Azure.IoT Build 0:fa2de1b79154 228 else
Azure.IoT Build 0:fa2de1b79154 229 {
Azure.IoT Build 0:fa2de1b79154 230 handleData->keys = undoneKeys;
Azure.IoT Build 0:fa2de1b79154 231 }
Azure.IoT Build 0:fa2de1b79154 232
Azure.IoT Build 0:fa2de1b79154 233 undoneValues = (char**)realloc(handleData->values, sizeof(char*)* (handleData->count - 1));
Azure.IoT Build 0:fa2de1b79154 234 if (undoneValues == NULL)
Azure.IoT Build 0:fa2de1b79154 235 {
AzureIoTClient 1:9190c0f4d23a 236 LogError("CATASTROPHIC error, unable to undo through realloc to a smaller size");
Azure.IoT Build 0:fa2de1b79154 237 }
Azure.IoT Build 0:fa2de1b79154 238 else
Azure.IoT Build 0:fa2de1b79154 239 {
Azure.IoT Build 0:fa2de1b79154 240 handleData->values = undoneValues;
Azure.IoT Build 0:fa2de1b79154 241 }
Azure.IoT Build 0:fa2de1b79154 242
Azure.IoT Build 0:fa2de1b79154 243 handleData->count--;
Azure.IoT Build 0:fa2de1b79154 244 }
Azure.IoT Build 0:fa2de1b79154 245 }
Azure.IoT Build 0:fa2de1b79154 246
Azure.IoT Build 0:fa2de1b79154 247 static char** findKey(MAP_HANDLE_DATA* handleData, const char* key)
Azure.IoT Build 0:fa2de1b79154 248 {
Azure.IoT Build 0:fa2de1b79154 249 char** result;
Azure.IoT Build 0:fa2de1b79154 250 if (handleData->keys == NULL)
Azure.IoT Build 0:fa2de1b79154 251 {
Azure.IoT Build 0:fa2de1b79154 252 result = NULL;
Azure.IoT Build 0:fa2de1b79154 253 }
Azure.IoT Build 0:fa2de1b79154 254 else
Azure.IoT Build 0:fa2de1b79154 255 {
Azure.IoT Build 0:fa2de1b79154 256 size_t i;
Azure.IoT Build 0:fa2de1b79154 257 result = NULL;
Azure.IoT Build 0:fa2de1b79154 258 for (i = 0; i < handleData->count; i++)
Azure.IoT Build 0:fa2de1b79154 259 {
Azure.IoT Build 0:fa2de1b79154 260 if (strcmp(handleData->keys[i], key) == 0)
Azure.IoT Build 0:fa2de1b79154 261 {
Azure.IoT Build 0:fa2de1b79154 262 result = handleData->keys + i;
Azure.IoT Build 0:fa2de1b79154 263 break;
Azure.IoT Build 0:fa2de1b79154 264 }
Azure.IoT Build 0:fa2de1b79154 265 }
Azure.IoT Build 0:fa2de1b79154 266 }
Azure.IoT Build 0:fa2de1b79154 267 return result;
Azure.IoT Build 0:fa2de1b79154 268 }
Azure.IoT Build 0:fa2de1b79154 269
Azure.IoT Build 0:fa2de1b79154 270 static char** findValue(MAP_HANDLE_DATA* handleData, const char* value)
Azure.IoT Build 0:fa2de1b79154 271 {
Azure.IoT Build 0:fa2de1b79154 272 char** result;
Azure.IoT Build 0:fa2de1b79154 273 if (handleData->values == NULL)
Azure.IoT Build 0:fa2de1b79154 274 {
Azure.IoT Build 0:fa2de1b79154 275 result = NULL;
Azure.IoT Build 0:fa2de1b79154 276 }
Azure.IoT Build 0:fa2de1b79154 277 else
Azure.IoT Build 0:fa2de1b79154 278 {
Azure.IoT Build 0:fa2de1b79154 279 size_t i;
Azure.IoT Build 0:fa2de1b79154 280 result = NULL;
Azure.IoT Build 0:fa2de1b79154 281 for (i = 0; i < handleData->count; i++)
Azure.IoT Build 0:fa2de1b79154 282 {
Azure.IoT Build 0:fa2de1b79154 283 if (strcmp(handleData->values[i], value) == 0)
Azure.IoT Build 0:fa2de1b79154 284 {
Azure.IoT Build 0:fa2de1b79154 285 result = handleData->values + i;
Azure.IoT Build 0:fa2de1b79154 286 break;
Azure.IoT Build 0:fa2de1b79154 287 }
Azure.IoT Build 0:fa2de1b79154 288 }
Azure.IoT Build 0:fa2de1b79154 289 }
Azure.IoT Build 0:fa2de1b79154 290 return result;
Azure.IoT Build 0:fa2de1b79154 291 }
Azure.IoT Build 0:fa2de1b79154 292
Azure.IoT Build 0:fa2de1b79154 293 static int insertNewKeyValue(MAP_HANDLE_DATA* handleData, const char* key, const char* value)
Azure.IoT Build 0:fa2de1b79154 294 {
Azure.IoT Build 0:fa2de1b79154 295 int result;
Azure.IoT Build 0:fa2de1b79154 296 if (Map_IncreaseStorageKeysValues(handleData) != 0) /*this increases handleData->count*/
Azure.IoT Build 0:fa2de1b79154 297 {
Azure.IoT Build 0:fa2de1b79154 298 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 299 }
Azure.IoT Build 0:fa2de1b79154 300 else
Azure.IoT Build 0:fa2de1b79154 301 {
Azure.IoT Build 0:fa2de1b79154 302 if (mallocAndStrcpy_s(&(handleData->keys[handleData->count - 1]), key) != 0)
Azure.IoT Build 0:fa2de1b79154 303 {
Azure.IoT Build 0:fa2de1b79154 304 Map_DecreaseStorageKeysValues(handleData);
AzureIoTClient 1:9190c0f4d23a 305 LogError("unable to mallocAndStrcpy_s");
Azure.IoT Build 0:fa2de1b79154 306 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 307 }
Azure.IoT Build 0:fa2de1b79154 308 else
Azure.IoT Build 0:fa2de1b79154 309 {
Azure.IoT Build 0:fa2de1b79154 310 if (mallocAndStrcpy_s(&(handleData->values[handleData->count - 1]), value) != 0)
Azure.IoT Build 0:fa2de1b79154 311 {
Azure.IoT Build 0:fa2de1b79154 312 free(handleData->keys[handleData->count - 1]);
Azure.IoT Build 0:fa2de1b79154 313 Map_DecreaseStorageKeysValues(handleData);
AzureIoTClient 1:9190c0f4d23a 314 LogError("unable to mallocAndStrcpy_s");
Azure.IoT Build 0:fa2de1b79154 315 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 316 }
Azure.IoT Build 0:fa2de1b79154 317 else
Azure.IoT Build 0:fa2de1b79154 318 {
Azure.IoT Build 0:fa2de1b79154 319 result = 0;
Azure.IoT Build 0:fa2de1b79154 320 }
Azure.IoT Build 0:fa2de1b79154 321 }
Azure.IoT Build 0:fa2de1b79154 322 }
Azure.IoT Build 0:fa2de1b79154 323 return result;
Azure.IoT Build 0:fa2de1b79154 324 }
Azure.IoT Build 0:fa2de1b79154 325
Azure.IoT Build 0:fa2de1b79154 326 MAP_RESULT Map_Add(MAP_HANDLE handle, const char* key, const char* value)
Azure.IoT Build 0:fa2de1b79154 327 {
Azure.IoT Build 0:fa2de1b79154 328 MAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 329 /*Codes_SRS_MAP_02_006: [If parameter handle is NULL then Map_Add shall return MAP_INVALID_ARG.] */
Azure.IoT Build 0:fa2de1b79154 330 /*Codes_SRS_MAP_02_007: [If parameter key is NULL then Map_Add shall return MAP_INVALID_ARG.]*/
Azure.IoT Build 0:fa2de1b79154 331 /*Codes_SRS_MAP_02_008: [If parameter value is NULL then Map_Add shall return MAP_INVALID_ARG.] */
Azure.IoT Build 0:fa2de1b79154 332 if (
Azure.IoT Build 0:fa2de1b79154 333 (handle == NULL) ||
Azure.IoT Build 0:fa2de1b79154 334 (key == NULL) ||
Azure.IoT Build 0:fa2de1b79154 335 (value == NULL)
Azure.IoT Build 0:fa2de1b79154 336 )
Azure.IoT Build 0:fa2de1b79154 337 {
Azure.IoT Build 0:fa2de1b79154 338 result = MAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 339 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 340 }
Azure.IoT Build 0:fa2de1b79154 341 else
Azure.IoT Build 0:fa2de1b79154 342 {
Azure.IoT Build 0:fa2de1b79154 343 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle;
Azure.IoT Build 0:fa2de1b79154 344 /*Codes_SRS_MAP_02_009: [If the key already exists, then Map_Add shall return MAP_KEYEXISTS.] */
Azure.IoT Build 0:fa2de1b79154 345 if (findKey(handleData, key) != NULL)
Azure.IoT Build 0:fa2de1b79154 346 {
Azure.IoT Build 0:fa2de1b79154 347 result = MAP_KEYEXISTS;
Azure.IoT Build 0:fa2de1b79154 348 }
Azure.IoT Build 0:fa2de1b79154 349 else
Azure.IoT Build 0:fa2de1b79154 350 {
Azure.IoT Build 0:fa2de1b79154 351 /* Codes_SRS_MAP_07_009: [If the mapFilterCallback function is not NULL, then the return value will be check and if it is not zero then Map_Add shall return MAP_FILTER_REJECT.] */
Azure.IoT Build 0:fa2de1b79154 352 if ( (handleData->mapFilterCallback != NULL) && (handleData->mapFilterCallback(key, value) != 0) )
Azure.IoT Build 0:fa2de1b79154 353 {
Azure.IoT Build 0:fa2de1b79154 354 result = MAP_FILTER_REJECT;
Azure.IoT Build 0:fa2de1b79154 355 }
Azure.IoT Build 0:fa2de1b79154 356 else
Azure.IoT Build 0:fa2de1b79154 357 {
Azure.IoT Build 0:fa2de1b79154 358 /*Codes_SRS_MAP_02_010: [Otherwise, Map_Add shall add the pair <key,value> to the map.] */
Azure.IoT Build 0:fa2de1b79154 359 if (insertNewKeyValue(handleData, key, value) != 0)
Azure.IoT Build 0:fa2de1b79154 360 {
Azure.IoT Build 0:fa2de1b79154 361 /*Codes_SRS_MAP_02_011: [If adding the pair <key,value> fails then Map_Add shall return MAP_ERROR.] */
Azure.IoT Build 0:fa2de1b79154 362 result = MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 363 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 364 }
Azure.IoT Build 0:fa2de1b79154 365 else
Azure.IoT Build 0:fa2de1b79154 366 {
Azure.IoT Build 0:fa2de1b79154 367 /*Codes_SRS_MAP_02_012: [Otherwise, Map_Add shall return MAP_OK.] */
Azure.IoT Build 0:fa2de1b79154 368 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 369 }
Azure.IoT Build 0:fa2de1b79154 370 }
Azure.IoT Build 0:fa2de1b79154 371 }
Azure.IoT Build 0:fa2de1b79154 372 }
Azure.IoT Build 0:fa2de1b79154 373 return result;
Azure.IoT Build 0:fa2de1b79154 374 }
Azure.IoT Build 0:fa2de1b79154 375
Azure.IoT Build 0:fa2de1b79154 376 MAP_RESULT Map_AddOrUpdate(MAP_HANDLE handle, const char* key, const char* value)
Azure.IoT Build 0:fa2de1b79154 377 {
Azure.IoT Build 0:fa2de1b79154 378 MAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 379 /*Codes_SRS_MAP_02_013: [If parameter handle is NULL then Map_AddOrUpdate shall return MAP_INVALID_ARG.]*/
Azure.IoT Build 0:fa2de1b79154 380 /*Codes_SRS_MAP_02_014: [If parameter key is NULL then Map_AddOrUpdate shall return MAP_INVALID_ARG.]*/
Azure.IoT Build 0:fa2de1b79154 381 /*Codes_SRS_MAP_02_015: [If parameter value is NULL then Map_AddOrUpdate shall return MAP_INVALID_ARG.] */
Azure.IoT Build 0:fa2de1b79154 382 if (
Azure.IoT Build 0:fa2de1b79154 383 (handle == NULL) ||
Azure.IoT Build 0:fa2de1b79154 384 (key == NULL) ||
Azure.IoT Build 0:fa2de1b79154 385 (value == NULL)
Azure.IoT Build 0:fa2de1b79154 386 )
Azure.IoT Build 0:fa2de1b79154 387 {
Azure.IoT Build 0:fa2de1b79154 388 result = MAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 389 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 390 }
Azure.IoT Build 0:fa2de1b79154 391 else
Azure.IoT Build 0:fa2de1b79154 392 {
Azure.IoT Build 0:fa2de1b79154 393 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle;
Azure.IoT Build 0:fa2de1b79154 394
Azure.IoT Build 0:fa2de1b79154 395 /* Codes_SRS_MAP_07_008: [If the mapFilterCallback function is not NULL, then the return value will be check and if it is not zero then Map_AddOrUpdate shall return MAP_FILTER_REJECT.] */
Azure.IoT Build 0:fa2de1b79154 396 if (handleData->mapFilterCallback != NULL && handleData->mapFilterCallback(key, value) != 0)
Azure.IoT Build 0:fa2de1b79154 397 {
Azure.IoT Build 0:fa2de1b79154 398 result = MAP_FILTER_REJECT;
Azure.IoT Build 0:fa2de1b79154 399 }
Azure.IoT Build 0:fa2de1b79154 400 else
Azure.IoT Build 0:fa2de1b79154 401 {
Azure.IoT Build 0:fa2de1b79154 402 char** whereIsIt = findKey(handleData, key);
Azure.IoT Build 0:fa2de1b79154 403 if (whereIsIt == NULL)
Azure.IoT Build 0:fa2de1b79154 404 {
Azure.IoT Build 0:fa2de1b79154 405 /*Codes_SRS_MAP_02_017: [Otherwise, Map_AddOrUpdate shall add the pair <key,value> to the map.]*/
Azure.IoT Build 0:fa2de1b79154 406 if (insertNewKeyValue(handleData, key, value) != 0)
Azure.IoT Build 0:fa2de1b79154 407 {
Azure.IoT Build 0:fa2de1b79154 408 result = MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 409 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 410 }
Azure.IoT Build 0:fa2de1b79154 411 else
Azure.IoT Build 0:fa2de1b79154 412 {
Azure.IoT Build 0:fa2de1b79154 413 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 414 }
Azure.IoT Build 0:fa2de1b79154 415 }
Azure.IoT Build 0:fa2de1b79154 416 else
Azure.IoT Build 0:fa2de1b79154 417 {
Azure.IoT Build 0:fa2de1b79154 418 /*Codes_SRS_MAP_02_016: [If the key already exists, then Map_AddOrUpdate shall overwrite the value of the existing key with parameter value.]*/
Azure.IoT Build 0:fa2de1b79154 419 size_t index = whereIsIt - handleData->keys;
Azure.IoT Build 0:fa2de1b79154 420 size_t valueLength = strlen(value);
Azure.IoT Build 0:fa2de1b79154 421 /*try to realloc value of this key*/
Azure.IoT Build 0:fa2de1b79154 422 char* newValue = (char*)realloc(handleData->values[index],valueLength + 1);
Azure.IoT Build 0:fa2de1b79154 423 if (newValue == NULL)
Azure.IoT Build 0:fa2de1b79154 424 {
Azure.IoT Build 0:fa2de1b79154 425 result = MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 426 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 427 }
Azure.IoT Build 0:fa2de1b79154 428 else
Azure.IoT Build 0:fa2de1b79154 429 {
AzureIoTClient 19:2e0811512ceb 430 (void)memcpy(newValue, value, valueLength + 1);
Azure.IoT Build 0:fa2de1b79154 431 handleData->values[index] = newValue;
Azure.IoT Build 0:fa2de1b79154 432 /*Codes_SRS_MAP_02_019: [Otherwise, Map_AddOrUpdate shall return MAP_OK.] */
Azure.IoT Build 0:fa2de1b79154 433 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 434 }
Azure.IoT Build 0:fa2de1b79154 435 }
Azure.IoT Build 0:fa2de1b79154 436 }
Azure.IoT Build 0:fa2de1b79154 437 }
Azure.IoT Build 0:fa2de1b79154 438 return result;
Azure.IoT Build 0:fa2de1b79154 439 }
Azure.IoT Build 0:fa2de1b79154 440
Azure.IoT Build 0:fa2de1b79154 441 MAP_RESULT Map_Delete(MAP_HANDLE handle, const char* key)
Azure.IoT Build 0:fa2de1b79154 442 {
Azure.IoT Build 0:fa2de1b79154 443 MAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 444 /*Codes_SRS_MAP_02_020: [If parameter handle is NULL then Map_Delete shall return MAP_INVALIDARG.]*/
Azure.IoT Build 0:fa2de1b79154 445 /*Codes_SRS_MAP_02_021: [If parameter key is NULL then Map_Delete shall return MAP_INVALIDARG.]*/
Azure.IoT Build 0:fa2de1b79154 446 if (
Azure.IoT Build 0:fa2de1b79154 447 (handle == NULL) ||
Azure.IoT Build 0:fa2de1b79154 448 (key == NULL)
Azure.IoT Build 0:fa2de1b79154 449 )
Azure.IoT Build 0:fa2de1b79154 450 {
Azure.IoT Build 0:fa2de1b79154 451 result = MAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 452 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 453 }
Azure.IoT Build 0:fa2de1b79154 454 else
Azure.IoT Build 0:fa2de1b79154 455 {
Azure.IoT Build 0:fa2de1b79154 456 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle;
Azure.IoT Build 0:fa2de1b79154 457 char** whereIsIt = findKey(handleData,key);
Azure.IoT Build 0:fa2de1b79154 458 if (whereIsIt == NULL)
Azure.IoT Build 0:fa2de1b79154 459 {
Azure.IoT Build 0:fa2de1b79154 460 /*Codes_SRS_MAP_02_022: [If key does not exist then Map_Delete shall return MAP_KEYNOTFOUND.]*/
Azure.IoT Build 0:fa2de1b79154 461 result = MAP_KEYNOTFOUND;
Azure.IoT Build 0:fa2de1b79154 462 }
Azure.IoT Build 0:fa2de1b79154 463 else
Azure.IoT Build 0:fa2de1b79154 464 {
Azure.IoT Build 0:fa2de1b79154 465 /*Codes_SRS_MAP_02_023: [Otherwise, Map_Delete shall remove the key and its associated value from the map and return MAP_OK.]*/
Azure.IoT Build 0:fa2de1b79154 466 size_t index = whereIsIt - handleData->keys;
Azure.IoT Build 0:fa2de1b79154 467 free(handleData->keys[index]);
Azure.IoT Build 0:fa2de1b79154 468 free(handleData->values[index]);
Azure.IoT Build 0:fa2de1b79154 469 memmove(handleData->keys + index, handleData->keys + index + 1, (handleData->count - index - 1)*sizeof(char*)); /*if order doesn't matter... then this can be optimized*/
Azure.IoT Build 0:fa2de1b79154 470 memmove(handleData->values + index, handleData->values + index + 1, (handleData->count - index - 1)*sizeof(char*));
Azure.IoT Build 0:fa2de1b79154 471 Map_DecreaseStorageKeysValues(handleData);
Azure.IoT Build 0:fa2de1b79154 472 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 473 }
Azure.IoT Build 0:fa2de1b79154 474
Azure.IoT Build 0:fa2de1b79154 475 }
Azure.IoT Build 0:fa2de1b79154 476 return result;
Azure.IoT Build 0:fa2de1b79154 477 }
Azure.IoT Build 0:fa2de1b79154 478
Azure.IoT Build 0:fa2de1b79154 479 MAP_RESULT Map_ContainsKey(MAP_HANDLE handle, const char* key, bool* keyExists)
Azure.IoT Build 0:fa2de1b79154 480 {
Azure.IoT Build 0:fa2de1b79154 481 MAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 482 /*Codes_SRS_MAP_02_024: [If parameter handle, key or keyExists are NULL then Map_ContainsKey shall return MAP_INVALIDARG.]*/
Azure.IoT Build 0:fa2de1b79154 483 if (
Azure.IoT Build 0:fa2de1b79154 484 (handle ==NULL) ||
Azure.IoT Build 0:fa2de1b79154 485 (key == NULL) ||
Azure.IoT Build 0:fa2de1b79154 486 (keyExists == NULL)
Azure.IoT Build 0:fa2de1b79154 487 )
Azure.IoT Build 0:fa2de1b79154 488 {
Azure.IoT Build 0:fa2de1b79154 489 result = MAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 490 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 491 }
Azure.IoT Build 0:fa2de1b79154 492 else
Azure.IoT Build 0:fa2de1b79154 493 {
Azure.IoT Build 0:fa2de1b79154 494 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle;
Azure.IoT Build 0:fa2de1b79154 495 /*Codes_SRS_MAP_02_025: [Otherwise if a key exists then Map_ContainsKey shall return MAP_OK and shall write in keyExists "true".]*/
Azure.IoT Build 0:fa2de1b79154 496 /*Codes_SRS_MAP_02_026: [If a key doesn't exist, then Map_ContainsKey shall return MAP_OK and write in keyExists "false".] */
Azure.IoT Build 0:fa2de1b79154 497 *keyExists = (findKey(handleData, key) != NULL) ? true: false;
Azure.IoT Build 0:fa2de1b79154 498 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 499 }
Azure.IoT Build 0:fa2de1b79154 500 return result;
Azure.IoT Build 0:fa2de1b79154 501 }
Azure.IoT Build 0:fa2de1b79154 502
Azure.IoT Build 0:fa2de1b79154 503 MAP_RESULT Map_ContainsValue(MAP_HANDLE handle, const char* value, bool* valueExists)
Azure.IoT Build 0:fa2de1b79154 504 {
Azure.IoT Build 0:fa2de1b79154 505 MAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 506 /*Codes_SRS_MAP_02_027: [If parameter handle, value or valueExists is NULL then Map_ContainsValue shall return MAP_INVALIDARG.] */
Azure.IoT Build 0:fa2de1b79154 507 if (
Azure.IoT Build 0:fa2de1b79154 508 (handle == NULL) ||
Azure.IoT Build 0:fa2de1b79154 509 (value == NULL) ||
Azure.IoT Build 0:fa2de1b79154 510 (valueExists == NULL)
Azure.IoT Build 0:fa2de1b79154 511 )
Azure.IoT Build 0:fa2de1b79154 512 {
Azure.IoT Build 0:fa2de1b79154 513 result = MAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 514 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 515 }
Azure.IoT Build 0:fa2de1b79154 516 else
Azure.IoT Build 0:fa2de1b79154 517 {
Azure.IoT Build 0:fa2de1b79154 518 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle;
Azure.IoT Build 0:fa2de1b79154 519 /*Codes_SRS_MAP_02_028: [Otherwise, if a pair <key, value> has its value equal to the parameter value, the Map_ContainsValue shall return MAP_OK and shall write in valueExists "true".]*/
Azure.IoT Build 0:fa2de1b79154 520 /*Codes_SRS_MAP_02_029: [Otherwise, if such a <key, value> does not exist, then Map_ContainsValue shall return MAP_OK and shall write in valueExists "false".] */
Azure.IoT Build 0:fa2de1b79154 521 *valueExists = (findValue(handleData, value) != NULL) ? true : false;
Azure.IoT Build 0:fa2de1b79154 522 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 523 }
Azure.IoT Build 0:fa2de1b79154 524 return result;
Azure.IoT Build 0:fa2de1b79154 525 }
Azure.IoT Build 0:fa2de1b79154 526
Azure.IoT Build 0:fa2de1b79154 527 const char* Map_GetValueFromKey(MAP_HANDLE handle, const char* key)
Azure.IoT Build 0:fa2de1b79154 528 {
Azure.IoT Build 0:fa2de1b79154 529 const char* result;
Azure.IoT Build 0:fa2de1b79154 530 /*Codes_SRS_MAP_02_040: [If parameter handle or key is NULL then Map_GetValueFromKey returns NULL.]*/
Azure.IoT Build 0:fa2de1b79154 531 if (
Azure.IoT Build 0:fa2de1b79154 532 (handle == NULL) ||
Azure.IoT Build 0:fa2de1b79154 533 (key == NULL)
Azure.IoT Build 0:fa2de1b79154 534 )
Azure.IoT Build 0:fa2de1b79154 535 {
Azure.IoT Build 0:fa2de1b79154 536 result = NULL;
AzureIoTClient 1:9190c0f4d23a 537 LogError("invalid parameter to Map_GetValueFromKey");
Azure.IoT Build 0:fa2de1b79154 538 }
Azure.IoT Build 0:fa2de1b79154 539 else
Azure.IoT Build 0:fa2de1b79154 540 {
Azure.IoT Build 0:fa2de1b79154 541 MAP_HANDLE_DATA * handleData = (MAP_HANDLE_DATA *)handle;
Azure.IoT Build 0:fa2de1b79154 542 char** whereIsIt = findKey(handleData, key);
Azure.IoT Build 0:fa2de1b79154 543 if(whereIsIt == NULL)
Azure.IoT Build 0:fa2de1b79154 544 {
Azure.IoT Build 0:fa2de1b79154 545 /*Codes_SRS_MAP_02_041: [If the key is not found, then Map_GetValueFromKey returns NULL.]*/
Azure.IoT Build 0:fa2de1b79154 546 result = NULL;
Azure.IoT Build 0:fa2de1b79154 547 }
Azure.IoT Build 0:fa2de1b79154 548 else
Azure.IoT Build 0:fa2de1b79154 549 {
Azure.IoT Build 0:fa2de1b79154 550 /*Codes_SRS_MAP_02_042: [Otherwise, Map_GetValueFromKey returns the key's value.] */
Azure.IoT Build 0:fa2de1b79154 551 size_t index = whereIsIt - handleData->keys;
Azure.IoT Build 0:fa2de1b79154 552 result = handleData->values[index];
Azure.IoT Build 0:fa2de1b79154 553 }
Azure.IoT Build 0:fa2de1b79154 554 }
Azure.IoT Build 0:fa2de1b79154 555 return result;
Azure.IoT Build 0:fa2de1b79154 556 }
Azure.IoT Build 0:fa2de1b79154 557
Azure.IoT Build 0:fa2de1b79154 558 MAP_RESULT Map_GetInternals(MAP_HANDLE handle, const char*const** keys, const char*const** values, size_t* count)
Azure.IoT Build 0:fa2de1b79154 559 {
Azure.IoT Build 0:fa2de1b79154 560 MAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 561 /*Codes_SRS_MAP_02_046: [If parameter handle, keys, values or count is NULL then Map_GetInternals shall return MAP_INVALIDARG.] */
Azure.IoT Build 0:fa2de1b79154 562 if (
Azure.IoT Build 0:fa2de1b79154 563 (handle == NULL) ||
Azure.IoT Build 0:fa2de1b79154 564 (keys == NULL) ||
Azure.IoT Build 0:fa2de1b79154 565 (values == NULL) ||
Azure.IoT Build 0:fa2de1b79154 566 (count == NULL)
Azure.IoT Build 0:fa2de1b79154 567 )
Azure.IoT Build 0:fa2de1b79154 568 {
Azure.IoT Build 0:fa2de1b79154 569 result = MAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 570 LOG_MAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 571 }
Azure.IoT Build 0:fa2de1b79154 572 else
Azure.IoT Build 0:fa2de1b79154 573 {
Azure.IoT Build 0:fa2de1b79154 574 /*Codes_SRS_MAP_02_043: [Map_GetInternals shall produce in *keys an pointer to an array of const char* having all the keys stored so far by the map.]*/
Azure.IoT Build 0:fa2de1b79154 575 /*Codes_SRS_MAP_02_044: [Map_GetInternals shall produce in *values a pointer to an array of const char* having all the values stored so far by the map.]*/
Azure.IoT Build 0:fa2de1b79154 576 /*Codes_SRS_MAP_02_045: [ Map_GetInternals shall produce in *count the number of stored keys and values.]*/
Azure.IoT Build 0:fa2de1b79154 577 MAP_HANDLE_DATA * handleData = (MAP_HANDLE_DATA *)handle;
Azure.IoT Build 0:fa2de1b79154 578 *keys =(const char* const*)(handleData->keys);
Azure.IoT Build 0:fa2de1b79154 579 *values = (const char* const*)(handleData->values);
Azure.IoT Build 0:fa2de1b79154 580 *count = handleData->count;
Azure.IoT Build 0:fa2de1b79154 581 result = MAP_OK;
Azure.IoT Build 0:fa2de1b79154 582 }
Azure.IoT Build 0:fa2de1b79154 583 return result;
Azure.IoT Build 0:fa2de1b79154 584 }
Azure.IoT Build 0:fa2de1b79154 585
Azure.IoT Build 0:fa2de1b79154 586 STRING_HANDLE Map_ToJSON(MAP_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 587 {
Azure.IoT Build 0:fa2de1b79154 588 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 589 /*Codes_SRS_MAP_02_052: [If parameter handle is NULL then Map_ToJSON shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 590 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 591 {
Azure.IoT Build 0:fa2de1b79154 592 result = NULL;
Azure.IoT Build 0:fa2de1b79154 593 LogError("invalid arg (NULL)");
Azure.IoT Build 0:fa2de1b79154 594 }
Azure.IoT Build 0:fa2de1b79154 595 else
Azure.IoT Build 0:fa2de1b79154 596 {
Azure.IoT Build 0:fa2de1b79154 597 /*Codes_SRS_MAP_02_048: [Map_ToJSON shall produce a STRING_HANDLE representing the content of the MAP.] */
Azure.IoT Build 0:fa2de1b79154 598 result = STRING_construct("{");
Azure.IoT Build 0:fa2de1b79154 599 if (result == NULL)
Azure.IoT Build 0:fa2de1b79154 600 {
Azure.IoT Build 0:fa2de1b79154 601 LogError("STRING_construct failed");
Azure.IoT Build 0:fa2de1b79154 602 }
Azure.IoT Build 0:fa2de1b79154 603 else
Azure.IoT Build 0:fa2de1b79154 604 {
Azure.IoT Build 0:fa2de1b79154 605 size_t i;
Azure.IoT Build 0:fa2de1b79154 606 MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA *)handle;
Azure.IoT Build 0:fa2de1b79154 607 /*Codes_SRS_MAP_02_049: [If the MAP is empty, then Map_ToJSON shall produce the string "{}".*/
Azure.IoT Build 0:fa2de1b79154 608 bool breakFor = false; /*used to break out of for*/
Azure.IoT Build 0:fa2de1b79154 609 for (i = 0; (i < handleData->count) && (!breakFor); i++)
Azure.IoT Build 0:fa2de1b79154 610 {
Azure.IoT Build 0:fa2de1b79154 611 /*add one entry to the JSON*/
Azure.IoT Build 0:fa2de1b79154 612 /*Codes_SRS_MAP_02_050: [If the map has properties then Map_ToJSON shall produce the following string:{"name1":"value1", "name2":"value2" ...}]*/
Azure.IoT Build 0:fa2de1b79154 613 STRING_HANDLE key = STRING_new_JSON(handleData->keys[i]);
Azure.IoT Build 0:fa2de1b79154 614 if (key == NULL)
Azure.IoT Build 0:fa2de1b79154 615 {
Azure.IoT Build 0:fa2de1b79154 616 LogError("STRING_new_JSON failed");
Azure.IoT Build 0:fa2de1b79154 617 STRING_delete(result);
Azure.IoT Build 0:fa2de1b79154 618 result = NULL;
Azure.IoT Build 0:fa2de1b79154 619 breakFor = true;
Azure.IoT Build 0:fa2de1b79154 620 }
Azure.IoT Build 0:fa2de1b79154 621 else
Azure.IoT Build 0:fa2de1b79154 622 {
Azure.IoT Build 0:fa2de1b79154 623 STRING_HANDLE value = STRING_new_JSON(handleData->values[i]);
Azure.IoT Build 0:fa2de1b79154 624 if (value == NULL)
Azure.IoT Build 0:fa2de1b79154 625 {
Azure.IoT Build 0:fa2de1b79154 626 LogError("STRING_new_JSON failed");
Azure.IoT Build 0:fa2de1b79154 627 STRING_delete(result);
Azure.IoT Build 0:fa2de1b79154 628 result = NULL;
Azure.IoT Build 0:fa2de1b79154 629 breakFor = true;
Azure.IoT Build 0:fa2de1b79154 630 }
Azure.IoT Build 0:fa2de1b79154 631 else
Azure.IoT Build 0:fa2de1b79154 632 {
Azure.IoT Build 0:fa2de1b79154 633 if (!(
Azure.IoT Build 0:fa2de1b79154 634 ((i>0) ? (STRING_concat(result, ",") == 0) : 1) &&
Azure.IoT Build 0:fa2de1b79154 635 (STRING_concat_with_STRING(result, key) == 0) &&
Azure.IoT Build 0:fa2de1b79154 636 (STRING_concat(result, ":") == 0) &&
Azure.IoT Build 0:fa2de1b79154 637 (STRING_concat_with_STRING(result, value) == 0)
Azure.IoT Build 0:fa2de1b79154 638 ))
Azure.IoT Build 0:fa2de1b79154 639 {
Azure.IoT Build 0:fa2de1b79154 640 LogError("failed to build the JSON");
Azure.IoT Build 0:fa2de1b79154 641 STRING_delete(result);
Azure.IoT Build 0:fa2de1b79154 642 result = NULL;
Azure.IoT Build 0:fa2de1b79154 643 breakFor = true;
Azure.IoT Build 0:fa2de1b79154 644 }
Azure.IoT Build 0:fa2de1b79154 645 else
Azure.IoT Build 0:fa2de1b79154 646 {
Azure.IoT Build 0:fa2de1b79154 647 /*all nice, go to the next element in the map*/
Azure.IoT Build 0:fa2de1b79154 648 }
Azure.IoT Build 0:fa2de1b79154 649 STRING_delete(value);
Azure.IoT Build 0:fa2de1b79154 650 }
Azure.IoT Build 0:fa2de1b79154 651 STRING_delete(key);
Azure.IoT Build 0:fa2de1b79154 652 }
Azure.IoT Build 0:fa2de1b79154 653 }
Azure.IoT Build 0:fa2de1b79154 654
Azure.IoT Build 0:fa2de1b79154 655 if (breakFor)
Azure.IoT Build 0:fa2de1b79154 656 {
Azure.IoT Build 0:fa2de1b79154 657 LogError("error happened during JSON string builder");
Azure.IoT Build 0:fa2de1b79154 658 }
Azure.IoT Build 0:fa2de1b79154 659 else
Azure.IoT Build 0:fa2de1b79154 660 {
Azure.IoT Build 0:fa2de1b79154 661 if (STRING_concat(result, "}") != 0)
Azure.IoT Build 0:fa2de1b79154 662 {
Azure.IoT Build 0:fa2de1b79154 663 LogError("failed to build the JSON");
Azure.IoT Build 0:fa2de1b79154 664 STRING_delete(result);
Azure.IoT Build 0:fa2de1b79154 665 result = NULL;
Azure.IoT Build 0:fa2de1b79154 666 }
Azure.IoT Build 0:fa2de1b79154 667 else
Azure.IoT Build 0:fa2de1b79154 668 {
Azure.IoT Build 0:fa2de1b79154 669 /*return as is, JSON has been build*/
Azure.IoT Build 0:fa2de1b79154 670 }
Azure.IoT Build 0:fa2de1b79154 671 }
Azure.IoT Build 0:fa2de1b79154 672 }
Azure.IoT Build 0:fa2de1b79154 673 }
Azure.IoT Build 0:fa2de1b79154 674 return result;
Azure.IoT Build 0:fa2de1b79154 675
Azure.IoT Build 0:fa2de1b79154 676 }