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:
45:1119d0f2c4d8
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>
AzureIoTClient 19:2e0811512ceb 5 #include <stdbool.h>
AzureIoTClient 19:2e0811512ceb 6 #include <stddef.h>
Azure.IoT Build 0:fa2de1b79154 7 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 8 #include "azure_c_shared_utility/map.h"
Azure.IoT Build 0:fa2de1b79154 9 #include "azure_c_shared_utility/constmap.h"
Azure.IoT Build 6:c55b013dfc2a 10 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 11 #include "azure_c_shared_utility/refcount.h"
Azure.IoT Build 0:fa2de1b79154 12
Azure.IoT Build 0:fa2de1b79154 13 DEFINE_ENUM_STRINGS(CONSTMAP_RESULT, CONSTMAP_RESULT_VALUES);
Azure.IoT Build 0:fa2de1b79154 14
Azure.IoT Build 0:fa2de1b79154 15 typedef struct CONSTMAP_HANDLE_DATA_TAG
Azure.IoT Build 0:fa2de1b79154 16 {
Azure.IoT Build 0:fa2de1b79154 17 MAP_HANDLE map;
Azure.IoT Build 0:fa2de1b79154 18 } CONSTMAP_HANDLE_DATA;
Azure.IoT Build 0:fa2de1b79154 19
Azure.IoT Build 0:fa2de1b79154 20 DEFINE_REFCOUNT_TYPE(CONSTMAP_HANDLE_DATA);
Azure.IoT Build 0:fa2de1b79154 21
AzureIoTClient 1:9190c0f4d23a 22 #define LOG_CONSTMAP_ERROR(result) LogError("result = %s", ENUM_TO_STRING(CONSTMAP_RESULT, (result)));
Azure.IoT Build 0:fa2de1b79154 23
Azure.IoT Build 0:fa2de1b79154 24 CONSTMAP_HANDLE ConstMap_Create(MAP_HANDLE sourceMap)
Azure.IoT Build 0:fa2de1b79154 25 {
Azure.IoT Build 0:fa2de1b79154 26 CONSTMAP_HANDLE_DATA* result = REFCOUNT_TYPE_CREATE(CONSTMAP_HANDLE_DATA);
Azure.IoT Build 0:fa2de1b79154 27
Azure.IoT Build 0:fa2de1b79154 28 if (result == NULL)
Azure.IoT Build 0:fa2de1b79154 29 {
Azure.IoT Build 0:fa2de1b79154 30 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 31 }
Azure.IoT Build 0:fa2de1b79154 32 else
Azure.IoT Build 0:fa2de1b79154 33 {
Azure.IoT Build 0:fa2de1b79154 34 /*Codes_SRS_CONSTMAP_17_048: [ConstMap_Create shall accept any non-NULL MAP_HANDLE as input.]*/
Azure.IoT Build 0:fa2de1b79154 35 /*Codes_SRS_CONSTMAP_17_001: [ConstMap_Create shall create an immutable map, populated by the key, value pairs in the source map.]*/
Azure.IoT Build 0:fa2de1b79154 36 result->map = Map_Clone(sourceMap);
Azure.IoT Build 0:fa2de1b79154 37 if (result->map == NULL)
Azure.IoT Build 0:fa2de1b79154 38 {
Azure.IoT Build 0:fa2de1b79154 39 free(result);
Azure.IoT Build 0:fa2de1b79154 40 /*Codes_SRS_CONSTMAP_17_002: [If during creation there are any errors, then ConstMap_Create shall return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 41 result = NULL;
Azure.IoT Build 0:fa2de1b79154 42 LOG_CONSTMAP_ERROR(CONSTMAP_ERROR);
Azure.IoT Build 0:fa2de1b79154 43 }
Azure.IoT Build 0:fa2de1b79154 44
Azure.IoT Build 0:fa2de1b79154 45 }
Azure.IoT Build 0:fa2de1b79154 46 /*Codes_SRS_CONSTMAP_17_003: [Otherwise, it shall return a non-NULL handle that can be used in subsequent calls.]*/
Azure.IoT Build 0:fa2de1b79154 47 return (CONSTMAP_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 48 }
Azure.IoT Build 0:fa2de1b79154 49
Azure.IoT Build 0:fa2de1b79154 50 void ConstMap_Destroy(CONSTMAP_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 51 {
Azure.IoT Build 0:fa2de1b79154 52 /*Codes_SRS_CONSTMAP_17_005: [If parameter handle is NULL then ConstMap_Destroy shall take no action.]*/
Azure.IoT Build 0:fa2de1b79154 53 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 54 {
Azure.IoT Build 0:fa2de1b79154 55 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 56 }
Azure.IoT Build 0:fa2de1b79154 57 else
Azure.IoT Build 0:fa2de1b79154 58 {
Azure.IoT Build 0:fa2de1b79154 59 /*Codes_SRS_CONSTMAP_17_049: [ConstMap_Destroy shall decrement the internal reference count of the immutable map.]*/
Azure.IoT Build 0:fa2de1b79154 60 if (DEC_REF(CONSTMAP_HANDLE_DATA, handle) == DEC_RETURN_ZERO)
Azure.IoT Build 0:fa2de1b79154 61 {
Azure.IoT Build 0:fa2de1b79154 62 /*Codes_SRS_CONSTMAP_17_004: [If the reference count is zero, ConstMap_Destroy shall release all resources associated with the immutable map.]*/
Azure.IoT Build 0:fa2de1b79154 63 Map_Destroy(((CONSTMAP_HANDLE_DATA *)handle)->map);
Azure.IoT Build 0:fa2de1b79154 64 free(handle);
Azure.IoT Build 0:fa2de1b79154 65 }
Azure.IoT Build 0:fa2de1b79154 66
Azure.IoT Build 0:fa2de1b79154 67 }
Azure.IoT Build 0:fa2de1b79154 68 }
Azure.IoT Build 0:fa2de1b79154 69
Azure.IoT Build 0:fa2de1b79154 70 CONSTMAP_HANDLE ConstMap_Clone(CONSTMAP_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 71 {
Azure.IoT Build 0:fa2de1b79154 72 /*Codes_SRS_CONSTMAP_17_038: [ConstMap_Clone returns NULL if parameter handle is NULL.] */
Azure.IoT Build 0:fa2de1b79154 73 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 74 {
Azure.IoT Build 0:fa2de1b79154 75 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 76 }
Azure.IoT Build 0:fa2de1b79154 77 else
Azure.IoT Build 0:fa2de1b79154 78 {
Azure.IoT Build 0:fa2de1b79154 79 /*Codes_SRS_CONSTMAP_17_039: [ConstMap_Clone shall increase the internal reference count of the immutable map indicated by parameter handle]*/
Azure.IoT Build 0:fa2de1b79154 80 /*Codes_SRS_CONSTMAP_17_050: [ConstMap_Clone shall return the non-NULL handle. ]*/
Azure.IoT Build 0:fa2de1b79154 81 INC_REF(CONSTMAP_HANDLE_DATA, handle);
Azure.IoT Build 0:fa2de1b79154 82 }
Azure.IoT Build 0:fa2de1b79154 83 return (handle);
Azure.IoT Build 0:fa2de1b79154 84 }
Azure.IoT Build 0:fa2de1b79154 85
Azure.IoT Build 0:fa2de1b79154 86 static CONSTMAP_RESULT ConstMap_ErrorConvert(MAP_RESULT mapResult)
Azure.IoT Build 0:fa2de1b79154 87 {
Azure.IoT Build 0:fa2de1b79154 88 CONSTMAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 89 switch (mapResult)
Azure.IoT Build 0:fa2de1b79154 90 {
Azure.IoT Build 0:fa2de1b79154 91 case MAP_OK:
Azure.IoT Build 0:fa2de1b79154 92 result = CONSTMAP_OK;
Azure.IoT Build 0:fa2de1b79154 93 break;
Azure.IoT Build 0:fa2de1b79154 94 case MAP_INVALIDARG:
Azure.IoT Build 0:fa2de1b79154 95 result = CONSTMAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 96 break;
Azure.IoT Build 0:fa2de1b79154 97 case MAP_KEYNOTFOUND:
Azure.IoT Build 0:fa2de1b79154 98 result = CONSTMAP_KEYNOTFOUND;
Azure.IoT Build 0:fa2de1b79154 99 break;
Azure.IoT Build 0:fa2de1b79154 100 default:
Azure.IoT Build 0:fa2de1b79154 101 result = CONSTMAP_ERROR;
Azure.IoT Build 0:fa2de1b79154 102 break;
Azure.IoT Build 0:fa2de1b79154 103 }
Azure.IoT Build 0:fa2de1b79154 104 return result;
Azure.IoT Build 0:fa2de1b79154 105 }
Azure.IoT Build 0:fa2de1b79154 106
Azure.IoT Build 0:fa2de1b79154 107 MAP_HANDLE ConstMap_CloneWriteable(CONSTMAP_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 108 {
Azure.IoT Build 0:fa2de1b79154 109 MAP_HANDLE result = NULL;
Azure.IoT Build 0:fa2de1b79154 110 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 111 {
Azure.IoT Build 0:fa2de1b79154 112 /*Codes_SRS_CONSTMAP_17_051: [ConstMap_CloneWriteable returns NULL if parameter handle is NULL. ]*/
Azure.IoT Build 0:fa2de1b79154 113 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 114 }
Azure.IoT Build 0:fa2de1b79154 115 else
Azure.IoT Build 0:fa2de1b79154 116 {
Azure.IoT Build 0:fa2de1b79154 117 /*Codes_SRS_CONSTMAP_17_052: [ConstMap_CloneWriteable shall create a new, writeable map, populated by the key, value pairs in the parameter defined by handle.]*/
Azure.IoT Build 0:fa2de1b79154 118 /*Codes_SRS_CONSTMAP_17_053: [If during cloning, any operation fails, then ConstMap_CloneWriteableap_Clone shall return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 119 /*Codes_SRS_CONSTMAP_17_054: [Otherwise, ConstMap_CloneWriteable shall return a non-NULL handle that can be used in subsequent calls.]*/
Azure.IoT Build 0:fa2de1b79154 120 result = Map_Clone(((CONSTMAP_HANDLE_DATA *)handle)->map);
Azure.IoT Build 0:fa2de1b79154 121 }
Azure.IoT Build 0:fa2de1b79154 122 return result;
Azure.IoT Build 0:fa2de1b79154 123 }
Azure.IoT Build 0:fa2de1b79154 124
Azure.IoT Build 0:fa2de1b79154 125 bool ConstMap_ContainsKey(CONSTMAP_HANDLE handle, const char* key )
Azure.IoT Build 0:fa2de1b79154 126 {
Azure.IoT Build 0:fa2de1b79154 127 bool keyExists = false;
Azure.IoT Build 0:fa2de1b79154 128 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 129 {
Azure.IoT Build 0:fa2de1b79154 130 /*Codes_SRS_CONSTMAP_17_024: [If parameter handle or key are NULL then ConstMap_ContainsKey shall return false.]*/
Azure.IoT Build 0:fa2de1b79154 131 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 132 }
Azure.IoT Build 0:fa2de1b79154 133 else
Azure.IoT Build 0:fa2de1b79154 134 {
Azure.IoT Build 0:fa2de1b79154 135 if (key == NULL)
Azure.IoT Build 0:fa2de1b79154 136 {
Azure.IoT Build 0:fa2de1b79154 137 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 138 }
Azure.IoT Build 0:fa2de1b79154 139 else
Azure.IoT Build 0:fa2de1b79154 140 {
Azure.IoT Build 0:fa2de1b79154 141 /*Codes_SRS_CONSTMAP_17_025: [Otherwise if a key exists then ConstMap_ContainsKey shall return true.]*/
Azure.IoT Build 0:fa2de1b79154 142 MAP_RESULT mapResult = Map_ContainsKey(((CONSTMAP_HANDLE_DATA *)handle)->map, key, &keyExists);
Azure.IoT Build 0:fa2de1b79154 143 if (mapResult != MAP_OK)
Azure.IoT Build 0:fa2de1b79154 144 {
Azure.IoT Build 0:fa2de1b79154 145 /*Codes_SRS_CONSTMAP_17_026: [If a key doesn't exist, then ConstMap_ContainsKey shall return false.]*/
Azure.IoT Build 0:fa2de1b79154 146 keyExists = false;
Azure.IoT Build 0:fa2de1b79154 147 LOG_CONSTMAP_ERROR(ConstMap_ErrorConvert(mapResult));
Azure.IoT Build 0:fa2de1b79154 148 }
Azure.IoT Build 0:fa2de1b79154 149 }
Azure.IoT Build 0:fa2de1b79154 150 }
Azure.IoT Build 0:fa2de1b79154 151 return keyExists;
Azure.IoT Build 0:fa2de1b79154 152 }
Azure.IoT Build 0:fa2de1b79154 153
Azure.IoT Build 0:fa2de1b79154 154 bool ConstMap_ContainsValue(CONSTMAP_HANDLE handle, const char* value)
Azure.IoT Build 0:fa2de1b79154 155 {
Azure.IoT Build 0:fa2de1b79154 156 bool valueExists = false;
Azure.IoT Build 0:fa2de1b79154 157 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 158 {
Azure.IoT Build 0:fa2de1b79154 159 /*Codes_SRS_CONSTMAP_17_027: [If parameter handle or value is NULL then ConstMap_ContainsValue shall return false.]*/
Azure.IoT Build 0:fa2de1b79154 160 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 161 }
Azure.IoT Build 0:fa2de1b79154 162 else
Azure.IoT Build 0:fa2de1b79154 163 {
Azure.IoT Build 0:fa2de1b79154 164 if (value == NULL)
Azure.IoT Build 0:fa2de1b79154 165 {
Azure.IoT Build 0:fa2de1b79154 166 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 167 }
Azure.IoT Build 0:fa2de1b79154 168 else
Azure.IoT Build 0:fa2de1b79154 169 {
Azure.IoT Build 0:fa2de1b79154 170 /*Codes_SRS_CONSTMAP_17_028: [Otherwise, if a pair has its value equal to the parameter value, the ConstMap_ContainsValue shall return true.]*/
Azure.IoT Build 0:fa2de1b79154 171 MAP_RESULT mapResult = Map_ContainsValue(((CONSTMAP_HANDLE_DATA *)handle)->map, value, &valueExists);
Azure.IoT Build 0:fa2de1b79154 172 if (mapResult != MAP_OK)
Azure.IoT Build 0:fa2de1b79154 173 {
Azure.IoT Build 0:fa2de1b79154 174 /*Codes_SRS_CONSTMAP_17_029: [Otherwise, if such a does not exist, then ConstMap_ContainsValue shall return false.]*/
Azure.IoT Build 0:fa2de1b79154 175 LOG_CONSTMAP_ERROR(ConstMap_ErrorConvert(mapResult));
Azure.IoT Build 0:fa2de1b79154 176 }
Azure.IoT Build 0:fa2de1b79154 177 }
Azure.IoT Build 0:fa2de1b79154 178 }
Azure.IoT Build 0:fa2de1b79154 179 return valueExists;
Azure.IoT Build 0:fa2de1b79154 180 }
Azure.IoT Build 0:fa2de1b79154 181
Azure.IoT Build 0:fa2de1b79154 182 const char* ConstMap_GetValue(CONSTMAP_HANDLE handle, const char* key)
Azure.IoT Build 0:fa2de1b79154 183 {
Azure.IoT Build 0:fa2de1b79154 184 const char* value = NULL;
Azure.IoT Build 0:fa2de1b79154 185
Azure.IoT Build 0:fa2de1b79154 186 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 187 {
Azure.IoT Build 0:fa2de1b79154 188 /*Codes_SRS_CONSTMAP_17_040: [If parameter handle or key is NULL then ConstMap_GetValue returns NULL.]*/
Azure.IoT Build 0:fa2de1b79154 189 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 190 }
Azure.IoT Build 0:fa2de1b79154 191 else
Azure.IoT Build 0:fa2de1b79154 192 {
Azure.IoT Build 0:fa2de1b79154 193 if (key == NULL)
Azure.IoT Build 0:fa2de1b79154 194 {
Azure.IoT Build 0:fa2de1b79154 195 /*Codes_SRS_CONSTMAP_17_040: [If parameter handle or key is NULL then ConstMap_GetValue returns NULL.]*/
Azure.IoT Build 0:fa2de1b79154 196 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
Azure.IoT Build 0:fa2de1b79154 197 }
Azure.IoT Build 0:fa2de1b79154 198 else
Azure.IoT Build 0:fa2de1b79154 199 {
Azure.IoT Build 0:fa2de1b79154 200 /*Codes_SRS_CONSTMAP_17_041: [If the key is not found, then ConstMap_GetValue returns NULL.]*/
Azure.IoT Build 0:fa2de1b79154 201 /*Codes_SRS_CONSTMAP_17_042: [Otherwise, ConstMap_GetValue returns the key's value.]*/
Azure.IoT Build 0:fa2de1b79154 202 value = Map_GetValueFromKey(((CONSTMAP_HANDLE_DATA *)handle)->map, key);
Azure.IoT Build 0:fa2de1b79154 203 }
Azure.IoT Build 0:fa2de1b79154 204 }
Azure.IoT Build 0:fa2de1b79154 205 return value;
Azure.IoT Build 0:fa2de1b79154 206 }
Azure.IoT Build 0:fa2de1b79154 207
Azure.IoT Build 0:fa2de1b79154 208 CONSTMAP_RESULT ConstMap_GetInternals(CONSTMAP_HANDLE handle, const char*const** keys, const char*const** values, size_t* count)
Azure.IoT Build 0:fa2de1b79154 209 {
Azure.IoT Build 0:fa2de1b79154 210 CONSTMAP_RESULT result;
Azure.IoT Build 0:fa2de1b79154 211 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 212 {
Azure.IoT Build 0:fa2de1b79154 213 /*Codes_SRS_CONSTMAP_17_046: [If parameter handle, keys, values or count is NULL then ConstMap_GetInternals shall return CONSTMAP_INVALIDARG.]*/
Azure.IoT Build 0:fa2de1b79154 214 result = CONSTMAP_INVALIDARG;
Azure.IoT Build 0:fa2de1b79154 215 LOG_CONSTMAP_ERROR(result);
Azure.IoT Build 0:fa2de1b79154 216 }
Azure.IoT Build 0:fa2de1b79154 217 else
Azure.IoT Build 0:fa2de1b79154 218 {
Azure.IoT Build 0:fa2de1b79154 219 /*Codes_SRS_CONSTMAP_17_043: [ConstMap_GetInternals shall produce in *keys a pointer to an array of const char* having all the keys stored so far by the map.]
Azure.IoT Build 0:fa2de1b79154 220 *Codes_SRS_CONSTMAP_17_044: [ConstMap_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 221 *Codes_SRS_CONSTMAP_17_045: [ ConstMap_GetInternals shall produce in *count the number of stored keys and values.]
Azure.IoT Build 0:fa2de1b79154 222 */
Azure.IoT Build 0:fa2de1b79154 223 MAP_RESULT mapResult = Map_GetInternals(((CONSTMAP_HANDLE_DATA *)handle)->map, keys, values, count);
Azure.IoT Build 0:fa2de1b79154 224 result = ConstMap_ErrorConvert(mapResult);
Azure.IoT Build 0:fa2de1b79154 225 }
Azure.IoT Build 0:fa2de1b79154 226 return result;
Azure.IoT Build 0:fa2de1b79154 227 }