Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 58:f50b97b08851 1 // Copyright (c) Microsoft. All rights reserved.
markrad 58:f50b97b08851 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 58:f50b97b08851 3
markrad 58:f50b97b08851 4 #include "azure_c_shared_utility/optionhandler.h"
markrad 58:f50b97b08851 5 #include "azure_c_shared_utility/xlogging.h"
markrad 58:f50b97b08851 6 #include "azure_c_shared_utility/gballoc.h"
markrad 58:f50b97b08851 7 #include "azure_c_shared_utility/vector.h"
markrad 58:f50b97b08851 8
markrad 58:f50b97b08851 9 typedef struct OPTION_TAG
markrad 58:f50b97b08851 10 {
markrad 58:f50b97b08851 11 const char* name;
markrad 58:f50b97b08851 12 void* storage;
markrad 58:f50b97b08851 13 }OPTION;
markrad 58:f50b97b08851 14
markrad 58:f50b97b08851 15 typedef struct OPTIONHANDLER_HANDLE_DATA_TAG
markrad 58:f50b97b08851 16 {
markrad 58:f50b97b08851 17 pfCloneOption cloneOption;
markrad 58:f50b97b08851 18 pfDestroyOption destroyOption;
markrad 58:f50b97b08851 19 pfSetOption setOption;
markrad 58:f50b97b08851 20 VECTOR_HANDLE storage;
markrad 58:f50b97b08851 21 }OPTIONHANDLER_HANDLE_DATA;
markrad 58:f50b97b08851 22
markrad 58:f50b97b08851 23 OPTIONHANDLER_HANDLE OptionHandler_Create(pfCloneOption cloneOption, pfDestroyOption destroyOption, pfSetOption setOption)
markrad 58:f50b97b08851 24 {
markrad 58:f50b97b08851 25 /*Codes_SRS_OPTIONHANDLER_02_001: [ OptionHandler_Create shall fail and retun NULL if any parameters are NULL. ]*/
markrad 58:f50b97b08851 26 OPTIONHANDLER_HANDLE_DATA* result;
markrad 58:f50b97b08851 27 if (
markrad 58:f50b97b08851 28 (cloneOption == NULL) ||
markrad 58:f50b97b08851 29 (destroyOption == NULL) ||
markrad 58:f50b97b08851 30 (setOption == NULL)
markrad 58:f50b97b08851 31 )
markrad 58:f50b97b08851 32 {
markrad 58:f50b97b08851 33 LogError("invalid parameter = pfCloneOption cloneOption=%p, pfDestroyOption destroyOption=%p, pfSetOption setOption=%p", cloneOption, destroyOption, setOption);
markrad 58:f50b97b08851 34 result = NULL;
markrad 58:f50b97b08851 35 }
markrad 58:f50b97b08851 36 else
markrad 58:f50b97b08851 37 {
markrad 58:f50b97b08851 38 result = (OPTIONHANDLER_HANDLE_DATA*)malloc(sizeof(OPTIONHANDLER_HANDLE_DATA));
markrad 58:f50b97b08851 39 if (result == NULL)
markrad 58:f50b97b08851 40 {
markrad 58:f50b97b08851 41 /*Codes_SRS_OPTIONHANDLER_02_004: [ Otherwise, OptionHandler_Create shall fail and return NULL. ]*/
markrad 58:f50b97b08851 42 LogError("unable to malloc");
markrad 58:f50b97b08851 43 /*return as is*/
markrad 58:f50b97b08851 44 }
markrad 58:f50b97b08851 45 else
markrad 58:f50b97b08851 46 {
markrad 58:f50b97b08851 47 /*Codes_SRS_OPTIONHANDLER_02_002: [ OptionHandler_Create shall create an empty VECTOR that will hold pairs of const char* and void*. ]*/
markrad 58:f50b97b08851 48 result->storage = VECTOR_create(sizeof(OPTION));
markrad 58:f50b97b08851 49 if (result->storage == NULL)
markrad 58:f50b97b08851 50 {
markrad 58:f50b97b08851 51 /*Codes_SRS_OPTIONHANDLER_02_004: [ Otherwise, OptionHandler_Create shall fail and return NULL. ]*/
markrad 58:f50b97b08851 52 LogError("unable to VECTOR_create");
markrad 58:f50b97b08851 53 free(result);
markrad 58:f50b97b08851 54 result= NULL;
markrad 58:f50b97b08851 55 }
markrad 58:f50b97b08851 56 else
markrad 58:f50b97b08851 57 {
markrad 58:f50b97b08851 58 /*Codes_SRS_OPTIONHANDLER_02_003: [ If all the operations succeed then OptionHandler_Create shall succeed and return a non-NULL handle. ]*/
markrad 58:f50b97b08851 59 result->cloneOption = cloneOption;
markrad 58:f50b97b08851 60 result->destroyOption = destroyOption;
markrad 58:f50b97b08851 61 result->setOption = setOption;
markrad 58:f50b97b08851 62 /*return as is*/
markrad 58:f50b97b08851 63 }
markrad 58:f50b97b08851 64 }
markrad 58:f50b97b08851 65 }
markrad 58:f50b97b08851 66 return result;
markrad 58:f50b97b08851 67
markrad 58:f50b97b08851 68 }
markrad 58:f50b97b08851 69
markrad 58:f50b97b08851 70 OPTIONHANDLER_RESULT OptionHandler_AddOption(OPTIONHANDLER_HANDLE handle, const char* name, const void* value)
markrad 58:f50b97b08851 71 {
markrad 58:f50b97b08851 72 OPTIONHANDLER_RESULT result;
markrad 58:f50b97b08851 73 /*Codes_SRS_OPTIONHANDLER_02_001: [ OptionHandler_Create shall fail and retun NULL if any parameters are NULL. ]*/
markrad 58:f50b97b08851 74 if (
markrad 58:f50b97b08851 75 (handle == NULL) ||
markrad 58:f50b97b08851 76 (name == NULL) ||
markrad 58:f50b97b08851 77 (value == NULL)
markrad 58:f50b97b08851 78 )
markrad 58:f50b97b08851 79 {
markrad 58:f50b97b08851 80 LogError("invalid arguments: OPTIONHANDLER_HANDLE handle=%p, const char* name=%p, void* value=%p", handle, name, value);
markrad 58:f50b97b08851 81 result= OPTIONHANDLER_INVALIDARG;
markrad 58:f50b97b08851 82 }
markrad 58:f50b97b08851 83 else
markrad 58:f50b97b08851 84 {
markrad 58:f50b97b08851 85 const char* cloneOfName;
markrad 58:f50b97b08851 86 if (mallocAndStrcpy_s((char**)&cloneOfName, name) != 0)
markrad 58:f50b97b08851 87 {
markrad 58:f50b97b08851 88 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
markrad 58:f50b97b08851 89 LogError("unable to clone name");
markrad 58:f50b97b08851 90 result = OPTIONHANDLER_ERROR;
markrad 58:f50b97b08851 91 }
markrad 58:f50b97b08851 92 else
markrad 58:f50b97b08851 93 {
markrad 58:f50b97b08851 94 /*Codes_SRS_OPTIONHANDLER_02_006: [ OptionHandler_AddProperty shall call pfCloneOption passing name and value. ]*/
markrad 58:f50b97b08851 95 void* cloneOfValue = handle->cloneOption(name, value);
markrad 58:f50b97b08851 96 if (cloneOfValue == NULL)
markrad 58:f50b97b08851 97 {
markrad 58:f50b97b08851 98 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
markrad 58:f50b97b08851 99 LogError("unable to clone value");
markrad 58:f50b97b08851 100 free((void*)cloneOfName);
markrad 58:f50b97b08851 101 result = OPTIONHANDLER_ERROR;
markrad 58:f50b97b08851 102 }
markrad 58:f50b97b08851 103 else
markrad 58:f50b97b08851 104 {
markrad 58:f50b97b08851 105 OPTION temp;
markrad 58:f50b97b08851 106 temp.name = cloneOfName;
markrad 58:f50b97b08851 107 temp.storage = cloneOfValue;
markrad 58:f50b97b08851 108 /*Codes_SRS_OPTIONHANDLER_02_007: [ OptionHandler_AddProperty shall use VECTOR APIs to save the name and the newly created clone of value. ]*/
markrad 58:f50b97b08851 109 if (VECTOR_push_back(handle->storage, &temp, 1) != 0)
markrad 58:f50b97b08851 110 {
markrad 58:f50b97b08851 111 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
markrad 58:f50b97b08851 112 LogError("unable to VECTOR_push_back");
markrad 58:f50b97b08851 113 handle->destroyOption(name, cloneOfValue);
markrad 58:f50b97b08851 114 free((void*)cloneOfName);
markrad 58:f50b97b08851 115 result = OPTIONHANDLER_ERROR;
markrad 58:f50b97b08851 116 }
markrad 58:f50b97b08851 117 else
markrad 58:f50b97b08851 118 {
markrad 58:f50b97b08851 119 /*Codes_SRS_OPTIONHANDLER_02_008: [ If all the operations succed then OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_OK. ]*/
markrad 58:f50b97b08851 120 result = OPTIONHANDLER_OK;
markrad 58:f50b97b08851 121 }
markrad 58:f50b97b08851 122 }
markrad 58:f50b97b08851 123 }
markrad 58:f50b97b08851 124 }
markrad 58:f50b97b08851 125 return result;
markrad 58:f50b97b08851 126 }
markrad 58:f50b97b08851 127
markrad 58:f50b97b08851 128 OPTIONHANDLER_RESULT OptionHandler_FeedOptions(OPTIONHANDLER_HANDLE handle, void* destinationHandle)
markrad 58:f50b97b08851 129 {
markrad 58:f50b97b08851 130 OPTIONHANDLER_RESULT result;
markrad 58:f50b97b08851 131 /*Codes_SRS_OPTIONHANDLER_02_010: [ OptionHandler_FeedOptions shall fail and return OPTIONHANDLER_INVALIDARG if any argument is NULL. ]*/
markrad 58:f50b97b08851 132 if (
markrad 58:f50b97b08851 133 (handle == NULL) ||
markrad 58:f50b97b08851 134 (destinationHandle == NULL)
markrad 58:f50b97b08851 135 )
markrad 58:f50b97b08851 136 {
markrad 58:f50b97b08851 137 LogError("invalid arguments OPTIONHANDLER_HANDLE handle=%p, void* destinationHandle=%p", handle, destinationHandle);
markrad 58:f50b97b08851 138 result = OPTIONHANDLER_INVALIDARG;
markrad 58:f50b97b08851 139 }
markrad 58:f50b97b08851 140 else
markrad 58:f50b97b08851 141 {
markrad 58:f50b97b08851 142 /*Codes_SRS_OPTIONHANDLER_02_011: [ Otherwise, OptionHandler_FeedOptions shall use VECTOR's iteration mechanisms to retrieve pairs of name, value (const char* and void*). ]*/
markrad 58:f50b97b08851 143 size_t nOptions = VECTOR_size(handle->storage), i;
markrad 58:f50b97b08851 144 for (i = 0;i < nOptions;i++)
markrad 58:f50b97b08851 145 {
markrad 58:f50b97b08851 146 OPTION* option = (OPTION*)VECTOR_element(handle->storage, i);
markrad 58:f50b97b08851 147 /*Codes_SRS_OPTIONHANDLER_02_012: [ OptionHandler_FeedOptions shall call for every pair of name,value setOption passing destinationHandle, name and value. ]*/
markrad 58:f50b97b08851 148 if (handle->setOption(destinationHandle, option->name, option->storage) != 0)
markrad 58:f50b97b08851 149 {
markrad 58:f50b97b08851 150 LogError("failure while trying to _SetOption");
markrad 58:f50b97b08851 151 break;
markrad 58:f50b97b08851 152 }
markrad 58:f50b97b08851 153 }
markrad 58:f50b97b08851 154
markrad 58:f50b97b08851 155 if (i == nOptions)
markrad 58:f50b97b08851 156 {
markrad 58:f50b97b08851 157 /*Codes_SRS_OPTIONHANDLER_02_014: [ Otherwise, OptionHandler_FeedOptions shall fail and return OPTIONHANDLER_ERROR. ]*/
markrad 58:f50b97b08851 158 result = OPTIONHANDLER_OK;
markrad 58:f50b97b08851 159 }
markrad 58:f50b97b08851 160 else
markrad 58:f50b97b08851 161 {
markrad 58:f50b97b08851 162 /*Codes_SRS_OPTIONHANDLER_02_013: [ If all the operations succeed then OptionHandler_FeedOptions shall succeed and return OPTIONHANDLER_OK. ]*/
markrad 58:f50b97b08851 163 result = OPTIONHANDLER_ERROR;
markrad 58:f50b97b08851 164 }
markrad 58:f50b97b08851 165 }
markrad 58:f50b97b08851 166 return result;
markrad 58:f50b97b08851 167 }
markrad 58:f50b97b08851 168
markrad 58:f50b97b08851 169 void OptionHandler_Destroy(OPTIONHANDLER_HANDLE handle)
markrad 58:f50b97b08851 170 {
markrad 58:f50b97b08851 171 /*Codes_SRS_OPTIONHANDLER_02_015: [ OptionHandler_Destroy shall do nothing if parameter handle is NULL. ]*/
markrad 58:f50b97b08851 172 if (handle == NULL)
markrad 58:f50b97b08851 173 {
markrad 58:f50b97b08851 174 LogError("invalid argument OPTIONHANDLER_HANDLE handle=%p", handle);
markrad 58:f50b97b08851 175 }
markrad 58:f50b97b08851 176 else
markrad 58:f50b97b08851 177 {
markrad 58:f50b97b08851 178 /*Codes_SRS_OPTIONHANDLER_02_016: [ Otherwise, OptionHandler_Destroy shall free all used resources. ]*/
markrad 58:f50b97b08851 179 size_t nOptions = VECTOR_size(handle->storage), i;
markrad 58:f50b97b08851 180 for (i = 0;i < nOptions;i++)
markrad 58:f50b97b08851 181 {
markrad 58:f50b97b08851 182 OPTION* option = (OPTION*)VECTOR_element(handle->storage, i);
markrad 58:f50b97b08851 183 handle->destroyOption(option->name, option->storage);
markrad 58:f50b97b08851 184 free((void*)option->name);
markrad 58:f50b97b08851 185 }
markrad 58:f50b97b08851 186
markrad 58:f50b97b08851 187 VECTOR_destroy(handle->storage);
markrad 58:f50b97b08851 188 free(handle);
markrad 58:f50b97b08851 189 }
markrad 58:f50b97b08851 190 }