diff options
author | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2019-01-23 13:56:06 +0100 |
---|---|---|
committer | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2019-01-28 15:38:58 +0100 |
commit | 2b558bb1ec9f854769c556e84735e7dcd3a295e8 (patch) | |
tree | b88875e5cff3759be7bb8c93e61fd892b16ced8e /4a-hal-utilities | |
parent | 20a22fadf78660394ca2ce8354530306288578fc (diff) |
Migrate to newer application framework calls
Migrate from 'afb_api_call_sync_legacy' function to 'afb_api_call_sync'
function, therefore, handle function return and response json
differently from before.
Change-Id: Ia7fb42188b8d41e22db2d824459a0d10ed6d6a8e
Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
Diffstat (limited to '4a-hal-utilities')
-rw-r--r-- | 4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c | 148 | ||||
-rw-r--r-- | 4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h | 45 | ||||
-rw-r--r-- | 4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c | 68 | ||||
-rw-r--r-- | 4a-hal-utilities/CMakeLists.txt | 1 |
4 files changed, 36 insertions, 226 deletions
diff --git a/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c b/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c deleted file mode 100644 index bf88571..0000000 --- a/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2018 "IoT.bzh" - * Author Jonathan Aillet <jonathan.aillet@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define _GNU_SOURCE - -#include <stdio.h> -#include <string.h> - -#include <afb/afb-binding.h> - -#include "4a-hal-utilities-appfw-responses-handler.h" - -/******************************************************************************* - * Handle application framework response function * - ******************************************************************************/ - -enum CallError HalUtlHandleAppFwCallError(afb_api_t apiHandle, char *apiCalled, char *verbCalled, json_object *callReturnJ, char **returnedStatus, char **returnedInfo) -{ - json_object *returnedRequestJ, *returnedStatusJ, *returnedInfoJ; - - if(! apiHandle || ! apiCalled || ! verbCalled || ! callReturnJ) - return CALL_ERROR_INVALID_ARGS; - - if(! json_object_object_get_ex(callReturnJ, "request", &returnedRequestJ)) { - AFB_API_WARNING(apiHandle, "Couldn't get response request object"); - return CALL_ERROR_REQUEST_UNAVAILABLE; - } - - if(! json_object_is_type(returnedRequestJ, json_type_object)) { - AFB_API_WARNING(apiHandle, "Response request object is not valid"); - return CALL_ERROR_REQUEST_NOT_VALID; - } - - if(! json_object_object_get_ex(returnedRequestJ, "status", &returnedStatusJ)) { - AFB_API_WARNING(apiHandle, "Couldn't get response status object"); - return CALL_ERROR_REQUEST_STATUS_UNAVAILABLE; - } - - if(! json_object_is_type(returnedStatusJ, json_type_string)) { - AFB_API_WARNING(apiHandle, "Response status object is not valid"); - return CALL_ERROR_REQUEST_STATUS_NOT_VALID; - } - - *returnedStatus = (char *) json_object_get_string(returnedStatusJ); - - if(! strcmp(*returnedStatus, "unknown-api")) { - AFB_API_WARNING(apiHandle, "Api %s not found", apiCalled); - return CALL_ERROR_API_UNAVAILABLE; - } - - if(! strcmp(*returnedStatus, "unknown-verb")) { - AFB_API_WARNING(apiHandle, "Verb %s of api %s not found", verbCalled, apiCalled); - return CALL_ERROR_VERB_UNAVAILABLE; - } - - if(! json_object_object_get_ex(returnedRequestJ, "info", &returnedInfoJ)) { - AFB_API_WARNING(apiHandle, "Couldn't get response info object"); - return CALL_ERROR_REQUEST_INFO_UNAVAILABLE; - } - - if(! json_object_is_type(returnedInfoJ, json_type_string)) { - AFB_API_WARNING(apiHandle, "Response info object is not valid"); - return CALL_ERROR_REQUEST_INFO_NOT_VALID; - } - - *returnedInfo = (char *) json_object_get_string(returnedInfoJ); - - AFB_API_WARNING(apiHandle, - "Api %s and verb %s found, but this error was raised : '%s' with this info : '%s'", - apiCalled, - verbCalled, - *returnedStatus, - *returnedInfo); - - return CALL_ERROR_RETURNED; -} - -void HalUtlHandleAppFwCallErrorInRequest(afb_req_t request, char *apiCalled, char *verbCalled, json_object *callReturnJ, char *errorStatusToSend) -{ - char *returnedStatus = NULL, *returnedInfo = NULL; - - afb_api_t apiHandle; - - if(! request || ! apiCalled || ! verbCalled || ! callReturnJ) { - afb_req_fail_f(request, "invalid_args", "Invalid arguments"); - return; - } - - if(! (apiHandle = afb_req_get_api(request))) { - afb_req_fail_f(request, "api_handle", "Can't get hal manager api handle"); - return; - } - - switch(HalUtlHandleAppFwCallError(apiHandle, apiCalled, verbCalled, callReturnJ, &returnedStatus, &returnedInfo)) { - case CALL_ERROR_REQUEST_UNAVAILABLE: - case CALL_ERROR_REQUEST_NOT_VALID: - case CALL_ERROR_REQUEST_STATUS_UNAVAILABLE: - case CALL_ERROR_REQUEST_STATUS_NOT_VALID: - case CALL_ERROR_REQUEST_INFO_UNAVAILABLE: - case CALL_ERROR_REQUEST_INFO_NOT_VALID: - afb_req_fail(request, errorStatusToSend, "Error with response object"); - return; - - case CALL_ERROR_API_UNAVAILABLE: - afb_req_fail_f(request, errorStatusToSend, "Api %s not found", apiCalled); - return; - - case CALL_ERROR_VERB_UNAVAILABLE: - afb_req_fail_f(request, errorStatusToSend, "Verb %s of api %s not found", verbCalled, apiCalled); - return; - - case CALL_ERROR_RETURNED: - afb_req_fail_f(request, - errorStatusToSend, - "Api %s and verb %s found, but this error was raised : '%s' with this info : '%s'", - apiCalled, - verbCalled, - returnedStatus ? returnedStatus : "not returned", - returnedInfo ? returnedInfo : "not returned"); - return; - - case CALL_ERROR_INVALID_ARGS: - afb_req_fail_f(request, - errorStatusToSend, - "Api %s and verb %s found, but the arguments are invalid", - apiCalled, - verbCalled); - return; - - default: - afb_req_fail_f(request, errorStatusToSend, "Unknown error happened during call to verb %s of api %s", verbCalled, apiCalled); - return; - } -}
\ No newline at end of file diff --git a/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h b/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h deleted file mode 100644 index 2bdbaab..0000000 --- a/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2018 "IoT.bzh" - * Author Jonathan Aillet <jonathan.aillet@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _HAL_UTILITIES_APPFW_RESP_HANDLER_INCLUDE_ -#define _HAL_UTILITIES_APPFW_RESP_HANDLER_INCLUDE_ - -#include <stdio.h> - -#include <wrap-json.h> - -#include <afb/afb-binding.h> - -// Enum for the type of error detected -enum CallError { - CALL_ERROR_INVALID_ARGS=-1, - CALL_ERROR_REQUEST_UNAVAILABLE=-2, - CALL_ERROR_REQUEST_NOT_VALID=-3, - CALL_ERROR_REQUEST_STATUS_UNAVAILABLE=-4, - CALL_ERROR_REQUEST_STATUS_NOT_VALID=-5, - CALL_ERROR_API_UNAVAILABLE=-6, - CALL_ERROR_VERB_UNAVAILABLE=-7, - CALL_ERROR_REQUEST_INFO_UNAVAILABLE=-8, - CALL_ERROR_REQUEST_INFO_NOT_VALID=-9, - CALL_ERROR_RETURNED=-10, -}; - -// Handle application framework response function -extern enum CallError HalUtlHandleAppFwCallError(afb_api_t apiHandle, char *apiCalled, char *verbCalled, json_object *callReturnJ, char **returnedStatus, char **returnedInfo); -void HalUtlHandleAppFwCallErrorInRequest(afb_req_t request, char *apiCalled, char *verbCalled, json_object *callReturnJ, char *errorStatusToSend); - -#endif /* _HAL_UTILITIES_APPFW_RESP_HANDLER_INCLUDE_ */
\ No newline at end of file diff --git a/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c b/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c index 9f23787..3f30436 100644 --- a/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c +++ b/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c @@ -25,7 +25,6 @@ #include <ctl-config.h> #include "4a-hal-utilities-data.h" -#include "4a-hal-utilities-appfw-responses-handler.h" #include "4a-hal-utilities-hal-streams-handler.h" /******************************************************************************* @@ -36,7 +35,7 @@ void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) { int idx, count; - char *apiToCall; + char *apiToCall, *returnedError = NULL, *returnedInfo = NULL; afb_api_t apiHandle; CtlConfigT *ctrlConfig; @@ -44,7 +43,7 @@ void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) struct SpecificHalData *currentCtlHalData; struct CtlHalMixerData *currentMixerData = NULL; - json_object *requestJson, *returnJ = NULL, *responseJ, *toReturnJ = NULL; + json_object *requestJson, *responseJ = NULL, *toReturnJ = NULL; if(! (apiHandle = afb_req_get_api(request))) { afb_req_fail(request, "api_handle", "Can't get current hal controller api handle"); @@ -98,32 +97,48 @@ void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) break; default: - afb_req_fail(request, "hal_call_data", "Can't get current call data"); + afb_req_fail(request, "mixer_action_type", "Action type is unknown"); return; } for(idx = 0; idx < count; idx++) { - if(afb_api_call_sync_legacy(apiHandle, - apiToCall, - currentMixerData->verbToCall, - json_object_get(requestJson), - &returnJ)) { - HalUtlHandleAppFwCallErrorInRequest(request, apiToCall, currentMixerData->verbToCall, returnJ, "call_action"); - json_object_put(returnJ); + if(afb_api_call_sync(apiHandle, + apiToCall, + currentMixerData->verbToCall, + json_object_get(requestJson), + &responseJ, + &returnedError, + &returnedInfo)) { + if(responseJ) + json_object_put(responseJ); if(toReturnJ) json_object_put(toReturnJ); + afb_req_fail_f(request, + "mixer_call", + "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s' (call to mixer %i out of %i)", + currentMixerData->verbToCall, + apiToCall, + returnedError ? returnedError : "not returned", + returnedInfo ? returnedInfo : "not returned", + idx, + count); + free(returnedError); + free(returnedInfo); return; } - if(wrap_json_unpack(returnJ, "{s:o}", "response", &responseJ)) { + if(! responseJ) { + if(toReturnJ) + json_object_put(toReturnJ); afb_req_fail_f(request, - "Seems that %s call to api %s succeed, but no response was found in : '%s'", + "mixer_call", + "Seems that %s call to api %s succeed but no response was returned (call to mixer %i out of %i)", currentMixerData->verbToCall, apiToCall, - json_object_get_string(returnJ)); - json_object_put(returnJ); - if(toReturnJ) - json_object_put(toReturnJ); + idx, + count); + free(returnedError); + free(returnedInfo); return; } @@ -137,28 +152,17 @@ void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) switch(actionType) { case ACTION_ON_MIXER_STREAM: - toReturnJ = json_object_get(responseJ); + toReturnJ = responseJ; break; case ACTION_ON_MIXER_PLAYBACK: case ACTION_ON_MIXER_CAPTURE: - json_object_object_add(toReturnJ, currentMixerData->verbToCall, json_object_get(responseJ)); - break; - - case ACTION_ON_MIXER_ALL_STREAM: - json_object_object_add(toReturnJ, currentMixerData->verb, json_object_get(responseJ)); - break; - - default: + json_object_object_add(toReturnJ, currentMixerData->verbToCall, responseJ); + currentMixerData = currentMixerData->next; break; - } - json_object_put(returnJ); - - switch(actionType) { - case ACTION_ON_MIXER_PLAYBACK: - case ACTION_ON_MIXER_CAPTURE: case ACTION_ON_MIXER_ALL_STREAM: + json_object_object_add(toReturnJ, currentMixerData->verb, responseJ); currentMixerData = currentMixerData->next; break; diff --git a/4a-hal-utilities/CMakeLists.txt b/4a-hal-utilities/CMakeLists.txt index 76cc511..d90dd11 100644 --- a/4a-hal-utilities/CMakeLists.txt +++ b/4a-hal-utilities/CMakeLists.txt @@ -23,7 +23,6 @@ PROJECT_TARGET_ADD(4a-hal-utilities) # Define project Targets ADD_LIBRARY(${TARGET_NAME} STATIC 4a-hal-utilities-alsa-data.c - 4a-hal-utilities-appfw-responses-handler.c 4a-hal-utilities-data.c 4a-hal-utilities-hal-streams-handler.c 4a-hal-utilities-verbs-loader.c) |