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 "azure_c_shared_utility/optionhandler.h"
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/vector.h"
XinZhangMS 0:f7f1f0d76dd6 9
XinZhangMS 0:f7f1f0d76dd6 10 typedef struct OPTION_TAG
XinZhangMS 0:f7f1f0d76dd6 11 {
XinZhangMS 0:f7f1f0d76dd6 12 const char* name;
XinZhangMS 0:f7f1f0d76dd6 13 void* storage;
XinZhangMS 0:f7f1f0d76dd6 14 }OPTION;
XinZhangMS 0:f7f1f0d76dd6 15
XinZhangMS 0:f7f1f0d76dd6 16 typedef struct OPTIONHANDLER_HANDLE_DATA_TAG
XinZhangMS 0:f7f1f0d76dd6 17 {
XinZhangMS 0:f7f1f0d76dd6 18 pfCloneOption cloneOption;
XinZhangMS 0:f7f1f0d76dd6 19 pfDestroyOption destroyOption;
XinZhangMS 0:f7f1f0d76dd6 20 pfSetOption setOption;
XinZhangMS 0:f7f1f0d76dd6 21 VECTOR_HANDLE storage;
XinZhangMS 0:f7f1f0d76dd6 22 }OPTIONHANDLER_HANDLE_DATA;
XinZhangMS 0:f7f1f0d76dd6 23
XinZhangMS 0:f7f1f0d76dd6 24 static OPTIONHANDLER_HANDLE CreateInternal(pfCloneOption cloneOption, pfDestroyOption destroyOption, pfSetOption setOption)
XinZhangMS 0:f7f1f0d76dd6 25 {
XinZhangMS 0:f7f1f0d76dd6 26 OPTIONHANDLER_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 27
XinZhangMS 0:f7f1f0d76dd6 28 result = (OPTIONHANDLER_HANDLE_DATA*)malloc(sizeof(OPTIONHANDLER_HANDLE_DATA));
XinZhangMS 0:f7f1f0d76dd6 29 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 30 {
XinZhangMS 0:f7f1f0d76dd6 31 /*Codes_SRS_OPTIONHANDLER_02_004: [ Otherwise, OptionHandler_Create shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 32 LogError("unable to malloc");
XinZhangMS 0:f7f1f0d76dd6 33 /*return as is*/
XinZhangMS 0:f7f1f0d76dd6 34 }
XinZhangMS 0:f7f1f0d76dd6 35 else
XinZhangMS 0:f7f1f0d76dd6 36 {
XinZhangMS 0:f7f1f0d76dd6 37 /*Codes_SRS_OPTIONHANDLER_02_002: [ OptionHandler_Create shall create an empty VECTOR that will hold pairs of const char* and void*. ]*/
XinZhangMS 0:f7f1f0d76dd6 38 result->storage = VECTOR_create(sizeof(OPTION));
XinZhangMS 0:f7f1f0d76dd6 39 if (result->storage == NULL)
XinZhangMS 0:f7f1f0d76dd6 40 {
XinZhangMS 0:f7f1f0d76dd6 41 /*Codes_SRS_OPTIONHANDLER_02_004: [ Otherwise, OptionHandler_Create shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 42 LogError("unable to VECTOR_create");
XinZhangMS 0:f7f1f0d76dd6 43 free(result);
XinZhangMS 0:f7f1f0d76dd6 44 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 45 }
XinZhangMS 0:f7f1f0d76dd6 46 else
XinZhangMS 0:f7f1f0d76dd6 47 {
XinZhangMS 0:f7f1f0d76dd6 48 /*Codes_SRS_OPTIONHANDLER_02_003: [ If all the operations succeed then OptionHandler_Create shall succeed and return a non-NULL handle. ]*/
XinZhangMS 0:f7f1f0d76dd6 49 result->cloneOption = cloneOption;
XinZhangMS 0:f7f1f0d76dd6 50 result->destroyOption = destroyOption;
XinZhangMS 0:f7f1f0d76dd6 51 result->setOption = setOption;
XinZhangMS 0:f7f1f0d76dd6 52 /*return as is*/
XinZhangMS 0:f7f1f0d76dd6 53 }
XinZhangMS 0:f7f1f0d76dd6 54 }
XinZhangMS 0:f7f1f0d76dd6 55
XinZhangMS 0:f7f1f0d76dd6 56 return result;
XinZhangMS 0:f7f1f0d76dd6 57 }
XinZhangMS 0:f7f1f0d76dd6 58
XinZhangMS 0:f7f1f0d76dd6 59 static OPTIONHANDLER_RESULT AddOptionInternal(OPTIONHANDLER_HANDLE handle, const char* name, const void* value)
XinZhangMS 0:f7f1f0d76dd6 60 {
XinZhangMS 0:f7f1f0d76dd6 61 OPTIONHANDLER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 62 const char* cloneOfName;
XinZhangMS 0:f7f1f0d76dd6 63 if (mallocAndStrcpy_s((char**)&cloneOfName, name) != 0)
XinZhangMS 0:f7f1f0d76dd6 64 {
XinZhangMS 0:f7f1f0d76dd6 65 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 66 LogError("unable to clone name");
XinZhangMS 0:f7f1f0d76dd6 67 result = OPTIONHANDLER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 68 }
XinZhangMS 0:f7f1f0d76dd6 69 else
XinZhangMS 0:f7f1f0d76dd6 70 {
XinZhangMS 0:f7f1f0d76dd6 71 /*Codes_SRS_OPTIONHANDLER_02_006: [ OptionHandler_AddProperty shall call pfCloneOption passing name and value. ]*/
XinZhangMS 0:f7f1f0d76dd6 72 void* cloneOfValue = handle->cloneOption(name, value);
XinZhangMS 0:f7f1f0d76dd6 73 if (cloneOfValue == NULL)
XinZhangMS 0:f7f1f0d76dd6 74 {
XinZhangMS 0:f7f1f0d76dd6 75 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 76 LogError("unable to clone value");
XinZhangMS 0:f7f1f0d76dd6 77 free((void*)cloneOfName);
XinZhangMS 0:f7f1f0d76dd6 78 result = OPTIONHANDLER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 79 }
XinZhangMS 0:f7f1f0d76dd6 80 else
XinZhangMS 0:f7f1f0d76dd6 81 {
XinZhangMS 0:f7f1f0d76dd6 82 OPTION temp;
XinZhangMS 0:f7f1f0d76dd6 83 temp.name = cloneOfName;
XinZhangMS 0:f7f1f0d76dd6 84 temp.storage = cloneOfValue;
XinZhangMS 0:f7f1f0d76dd6 85 /*Codes_SRS_OPTIONHANDLER_02_007: [ OptionHandler_AddProperty shall use VECTOR APIs to save the name and the newly created clone of value. ]*/
XinZhangMS 0:f7f1f0d76dd6 86 if (VECTOR_push_back(handle->storage, &temp, 1) != 0)
XinZhangMS 0:f7f1f0d76dd6 87 {
XinZhangMS 0:f7f1f0d76dd6 88 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 89 LogError("unable to VECTOR_push_back");
XinZhangMS 0:f7f1f0d76dd6 90 handle->destroyOption(name, cloneOfValue);
XinZhangMS 0:f7f1f0d76dd6 91 free((void*)cloneOfName);
XinZhangMS 0:f7f1f0d76dd6 92 result = OPTIONHANDLER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 93 }
XinZhangMS 0:f7f1f0d76dd6 94 else
XinZhangMS 0:f7f1f0d76dd6 95 {
XinZhangMS 0:f7f1f0d76dd6 96 /*Codes_SRS_OPTIONHANDLER_02_008: [ If all the operations succed then OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_OK. ]*/
XinZhangMS 0:f7f1f0d76dd6 97 result = OPTIONHANDLER_OK;
XinZhangMS 0:f7f1f0d76dd6 98 }
XinZhangMS 0:f7f1f0d76dd6 99 }
XinZhangMS 0:f7f1f0d76dd6 100 }
XinZhangMS 0:f7f1f0d76dd6 101
XinZhangMS 0:f7f1f0d76dd6 102 return result;
XinZhangMS 0:f7f1f0d76dd6 103 }
XinZhangMS 0:f7f1f0d76dd6 104
XinZhangMS 0:f7f1f0d76dd6 105 static void DestroyInternal(OPTIONHANDLER_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 106 {
XinZhangMS 0:f7f1f0d76dd6 107 /*Codes_SRS_OPTIONHANDLER_02_016: [ Otherwise, OptionHandler_Destroy shall free all used resources. ]*/
XinZhangMS 0:f7f1f0d76dd6 108 size_t nOptions = VECTOR_size(handle->storage), i;
XinZhangMS 0:f7f1f0d76dd6 109 for (i = 0; i < nOptions; i++)
XinZhangMS 0:f7f1f0d76dd6 110 {
XinZhangMS 0:f7f1f0d76dd6 111 OPTION* option = (OPTION*)VECTOR_element(handle->storage, i);
XinZhangMS 0:f7f1f0d76dd6 112 handle->destroyOption(option->name, option->storage);
XinZhangMS 0:f7f1f0d76dd6 113 free((void*)option->name);
XinZhangMS 0:f7f1f0d76dd6 114 }
XinZhangMS 0:f7f1f0d76dd6 115
XinZhangMS 0:f7f1f0d76dd6 116 VECTOR_destroy(handle->storage);
XinZhangMS 0:f7f1f0d76dd6 117 free(handle);
XinZhangMS 0:f7f1f0d76dd6 118 }
XinZhangMS 0:f7f1f0d76dd6 119
XinZhangMS 0:f7f1f0d76dd6 120 OPTIONHANDLER_HANDLE OptionHandler_Create(pfCloneOption cloneOption, pfDestroyOption destroyOption, pfSetOption setOption)
XinZhangMS 0:f7f1f0d76dd6 121 {
XinZhangMS 0:f7f1f0d76dd6 122 /*Codes_SRS_OPTIONHANDLER_02_001: [ OptionHandler_Create shall fail and retun NULL if any parameters are NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 123 OPTIONHANDLER_HANDLE_DATA* result;
XinZhangMS 0:f7f1f0d76dd6 124 if (
XinZhangMS 0:f7f1f0d76dd6 125 (cloneOption == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 126 (destroyOption == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 127 (setOption == NULL)
XinZhangMS 0:f7f1f0d76dd6 128 )
XinZhangMS 0:f7f1f0d76dd6 129 {
XinZhangMS 0:f7f1f0d76dd6 130 LogError("invalid parameter = pfCloneOption cloneOption=%p, pfDestroyOption destroyOption=%p, pfSetOption setOption=%p", cloneOption, destroyOption, setOption);
XinZhangMS 0:f7f1f0d76dd6 131 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 132 }
XinZhangMS 0:f7f1f0d76dd6 133 else
XinZhangMS 0:f7f1f0d76dd6 134 {
XinZhangMS 0:f7f1f0d76dd6 135 result = CreateInternal(cloneOption, destroyOption, setOption);
XinZhangMS 0:f7f1f0d76dd6 136 }
XinZhangMS 0:f7f1f0d76dd6 137
XinZhangMS 0:f7f1f0d76dd6 138 return result;
XinZhangMS 0:f7f1f0d76dd6 139
XinZhangMS 0:f7f1f0d76dd6 140 }
XinZhangMS 0:f7f1f0d76dd6 141
XinZhangMS 0:f7f1f0d76dd6 142 OPTIONHANDLER_HANDLE OptionHandler_Clone(OPTIONHANDLER_HANDLE handler)
XinZhangMS 0:f7f1f0d76dd6 143 {
XinZhangMS 0:f7f1f0d76dd6 144 OPTIONHANDLER_HANDLE_DATA* result;
XinZhangMS 0:f7f1f0d76dd6 145
XinZhangMS 0:f7f1f0d76dd6 146 if (handler == NULL)
XinZhangMS 0:f7f1f0d76dd6 147 {
XinZhangMS 0:f7f1f0d76dd6 148 /* Codes_SRS_OPTIONHANDLER_01_010: [ If `handler` is NULL, OptionHandler_Clone shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 149 LogError("NULL argument: handler");
XinZhangMS 0:f7f1f0d76dd6 150 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 151 }
XinZhangMS 0:f7f1f0d76dd6 152 else
XinZhangMS 0:f7f1f0d76dd6 153 {
XinZhangMS 0:f7f1f0d76dd6 154 /* Codes_SRS_OPTIONHANDLER_01_001: [ `OptionHandler_Clone` shall clone an existing option handler instance. ]*/
XinZhangMS 0:f7f1f0d76dd6 155 /* Codes_SRS_OPTIONHANDLER_01_002: [ On success it shall return a non-NULL handle. ]*/
XinZhangMS 0:f7f1f0d76dd6 156 /* Codes_SRS_OPTIONHANDLER_01_003: [ `OptionHandler_Clone` shall allocate memory for the new option handler instance. ]*/
XinZhangMS 0:f7f1f0d76dd6 157 result = CreateInternal(handler->cloneOption, handler->destroyOption, handler->setOption);
XinZhangMS 0:f7f1f0d76dd6 158 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 159 {
XinZhangMS 0:f7f1f0d76dd6 160 /* Codes_SRS_OPTIONHANDLER_01_004: [ If allocating memory fails, `OptionHandler_Clone` shall return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 161 LogError("unable to create option handler");
XinZhangMS 0:f7f1f0d76dd6 162 }
XinZhangMS 0:f7f1f0d76dd6 163 else
XinZhangMS 0:f7f1f0d76dd6 164 {
XinZhangMS 0:f7f1f0d76dd6 165 /* Codes_SRS_OPTIONHANDLER_01_005: [ `OptionHandler_Clone` shall iterate through all the options stored by the option handler to be cloned by using VECTOR's iteration mechanism. ]*/
XinZhangMS 0:f7f1f0d76dd6 166 size_t option_count = VECTOR_size(handler->storage);
XinZhangMS 0:f7f1f0d76dd6 167 size_t i;
XinZhangMS 0:f7f1f0d76dd6 168
XinZhangMS 0:f7f1f0d76dd6 169 for (i = 0; i < option_count; i++)
XinZhangMS 0:f7f1f0d76dd6 170 {
XinZhangMS 0:f7f1f0d76dd6 171 OPTION* option = (OPTION*)VECTOR_element(handler->storage, i);
XinZhangMS 0:f7f1f0d76dd6 172
XinZhangMS 0:f7f1f0d76dd6 173 /* Codes_SRS_OPTIONHANDLER_01_006: [ For each option the option name shall be cloned by calling `mallocAndStrcpy_s`. ]*/
XinZhangMS 0:f7f1f0d76dd6 174 /* Codes_SRS_OPTIONHANDLER_01_007: [ For each option the value shall be cloned by using the cloning function associated with the source option handler `handler`. ]*/
XinZhangMS 0:f7f1f0d76dd6 175 if (AddOptionInternal(result, option->name, option->storage) != OPTIONHANDLER_OK)
XinZhangMS 0:f7f1f0d76dd6 176 {
XinZhangMS 0:f7f1f0d76dd6 177 /* Codes_SRS_OPTIONHANDLER_01_008: [ If cloning one of the option names fails, `OptionHandler_Clone` shall return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 178 /* Codes_SRS_OPTIONHANDLER_01_009: [ If cloning one of the option values fails, `OptionHandler_Clone` shall return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 179 LogError("Error cloning option %s", option->name);
XinZhangMS 0:f7f1f0d76dd6 180 break;
XinZhangMS 0:f7f1f0d76dd6 181 }
XinZhangMS 0:f7f1f0d76dd6 182 }
XinZhangMS 0:f7f1f0d76dd6 183
XinZhangMS 0:f7f1f0d76dd6 184 if (i < option_count)
XinZhangMS 0:f7f1f0d76dd6 185 {
XinZhangMS 0:f7f1f0d76dd6 186 DestroyInternal(result);
XinZhangMS 0:f7f1f0d76dd6 187 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 188 }
XinZhangMS 0:f7f1f0d76dd6 189 }
XinZhangMS 0:f7f1f0d76dd6 190 }
XinZhangMS 0:f7f1f0d76dd6 191
XinZhangMS 0:f7f1f0d76dd6 192 return result;
XinZhangMS 0:f7f1f0d76dd6 193 }
XinZhangMS 0:f7f1f0d76dd6 194
XinZhangMS 0:f7f1f0d76dd6 195 OPTIONHANDLER_RESULT OptionHandler_AddOption(OPTIONHANDLER_HANDLE handle, const char* name, const void* value)
XinZhangMS 0:f7f1f0d76dd6 196 {
XinZhangMS 0:f7f1f0d76dd6 197 OPTIONHANDLER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 198 /*Codes_SRS_OPTIONHANDLER_02_001: [ OptionHandler_Create shall fail and retun NULL if any parameters are NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 199 if (
XinZhangMS 0:f7f1f0d76dd6 200 (handle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 201 (name == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 202 (value == NULL)
XinZhangMS 0:f7f1f0d76dd6 203 )
XinZhangMS 0:f7f1f0d76dd6 204 {
XinZhangMS 0:f7f1f0d76dd6 205 LogError("invalid arguments: OPTIONHANDLER_HANDLE handle=%p, const char* name=%p, void* value=%p", handle, name, value);
XinZhangMS 0:f7f1f0d76dd6 206 result= OPTIONHANDLER_INVALIDARG;
XinZhangMS 0:f7f1f0d76dd6 207 }
XinZhangMS 0:f7f1f0d76dd6 208 else
XinZhangMS 0:f7f1f0d76dd6 209 {
XinZhangMS 0:f7f1f0d76dd6 210 result = AddOptionInternal(handle, name, value);
XinZhangMS 0:f7f1f0d76dd6 211 }
XinZhangMS 0:f7f1f0d76dd6 212
XinZhangMS 0:f7f1f0d76dd6 213 return result;
XinZhangMS 0:f7f1f0d76dd6 214 }
XinZhangMS 0:f7f1f0d76dd6 215
XinZhangMS 0:f7f1f0d76dd6 216 OPTIONHANDLER_RESULT OptionHandler_FeedOptions(OPTIONHANDLER_HANDLE handle, void* destinationHandle)
XinZhangMS 0:f7f1f0d76dd6 217 {
XinZhangMS 0:f7f1f0d76dd6 218 OPTIONHANDLER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 219 /*Codes_SRS_OPTIONHANDLER_02_010: [ OptionHandler_FeedOptions shall fail and return OPTIONHANDLER_INVALIDARG if any argument is NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 220 if (
XinZhangMS 0:f7f1f0d76dd6 221 (handle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 222 (destinationHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 223 )
XinZhangMS 0:f7f1f0d76dd6 224 {
XinZhangMS 0:f7f1f0d76dd6 225 LogError("invalid arguments OPTIONHANDLER_HANDLE handle=%p, void* destinationHandle=%p", handle, destinationHandle);
XinZhangMS 0:f7f1f0d76dd6 226 result = OPTIONHANDLER_INVALIDARG;
XinZhangMS 0:f7f1f0d76dd6 227 }
XinZhangMS 0:f7f1f0d76dd6 228 else
XinZhangMS 0:f7f1f0d76dd6 229 {
XinZhangMS 0:f7f1f0d76dd6 230 /*Codes_SRS_OPTIONHANDLER_02_011: [ Otherwise, OptionHandler_FeedOptions shall use VECTOR's iteration mechanisms to retrieve pairs of name, value (const char* and void*). ]*/
XinZhangMS 0:f7f1f0d76dd6 231 size_t nOptions = VECTOR_size(handle->storage), i;
XinZhangMS 0:f7f1f0d76dd6 232 for (i = 0;i < nOptions;i++)
XinZhangMS 0:f7f1f0d76dd6 233 {
XinZhangMS 0:f7f1f0d76dd6 234 OPTION* option = (OPTION*)VECTOR_element(handle->storage, i);
XinZhangMS 0:f7f1f0d76dd6 235 /*Codes_SRS_OPTIONHANDLER_02_012: [ OptionHandler_FeedOptions shall call for every pair of name,value setOption passing destinationHandle, name and value. ]*/
XinZhangMS 0:f7f1f0d76dd6 236 if (handle->setOption(destinationHandle, option->name, option->storage) != 0)
XinZhangMS 0:f7f1f0d76dd6 237 {
XinZhangMS 0:f7f1f0d76dd6 238 LogError("failure while trying to _SetOption");
XinZhangMS 0:f7f1f0d76dd6 239 break;
XinZhangMS 0:f7f1f0d76dd6 240 }
XinZhangMS 0:f7f1f0d76dd6 241 }
XinZhangMS 0:f7f1f0d76dd6 242
XinZhangMS 0:f7f1f0d76dd6 243 if (i == nOptions)
XinZhangMS 0:f7f1f0d76dd6 244 {
XinZhangMS 0:f7f1f0d76dd6 245 /*Codes_SRS_OPTIONHANDLER_02_014: [ Otherwise, OptionHandler_FeedOptions shall fail and return OPTIONHANDLER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 246 result = OPTIONHANDLER_OK;
XinZhangMS 0:f7f1f0d76dd6 247 }
XinZhangMS 0:f7f1f0d76dd6 248 else
XinZhangMS 0:f7f1f0d76dd6 249 {
XinZhangMS 0:f7f1f0d76dd6 250 /*Codes_SRS_OPTIONHANDLER_02_013: [ If all the operations succeed then OptionHandler_FeedOptions shall succeed and return OPTIONHANDLER_OK. ]*/
XinZhangMS 0:f7f1f0d76dd6 251 result = OPTIONHANDLER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 252 }
XinZhangMS 0:f7f1f0d76dd6 253 }
XinZhangMS 0:f7f1f0d76dd6 254 return result;
XinZhangMS 0:f7f1f0d76dd6 255 }
XinZhangMS 0:f7f1f0d76dd6 256
XinZhangMS 0:f7f1f0d76dd6 257 void OptionHandler_Destroy(OPTIONHANDLER_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 258 {
XinZhangMS 0:f7f1f0d76dd6 259 /*Codes_SRS_OPTIONHANDLER_02_015: [ OptionHandler_Destroy shall do nothing if parameter handle is NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 260 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 261 {
XinZhangMS 0:f7f1f0d76dd6 262 LogError("invalid argument OPTIONHANDLER_HANDLE handle=%p", handle);
XinZhangMS 0:f7f1f0d76dd6 263 }
XinZhangMS 0:f7f1f0d76dd6 264 else
XinZhangMS 0:f7f1f0d76dd6 265 {
XinZhangMS 0:f7f1f0d76dd6 266 DestroyInternal(handle);
XinZhangMS 0:f7f1f0d76dd6 267 }
XinZhangMS 0:f7f1f0d76dd6 268 }