Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
c-utility/src/optionhandler.c@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |