diff options
author | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2018-06-03 18:58:56 +0200 |
---|---|---|
committer | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2018-10-08 15:51:00 +0200 |
commit | eb4967fcc8278bcd994eb2ce16bf0042b4d8598c (patch) | |
tree | d25fc46e65db800d1673570e600f3dcd6cd47af7 | |
parent | 4e4fd6e7843aacbb719623de503be2d52f83961f (diff) |
Handle app fw call errors in a dedicated function
Two functions has been added in a new file in 4a-hal-utilities :
- A function that handle application framework call errors by returning
a specific error.
- A function that handle application framework call errors from a request.
Change-Id: I657773586111adc609cbbaead7db589a82e133b0
Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
6 files changed, 194 insertions, 71 deletions
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c index fb70962..90b4940 100644 --- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c @@ -24,7 +24,7 @@ #include <wrap-json.h> #include "../4a-hal-utilities/4a-hal-utilities-data.h" -#include "../4a-hal-utilities/4a-hal-utilities-verbs-loader.h" +#include "../4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h" #include "4a-hal-controllers-cb.h" #include "4a-hal-controllers-mixer-handler.h" @@ -139,7 +139,7 @@ void HalCtlsActionOnStream(afb_request *request) strcat(verbToCall, request->verb); if(afb_dynapi_call_sync(apiHandle, apiToCall, verbToCall, json_object_get(requestJson), &returnJ)) { - HalCtlsHandleMixerCallError(request, apiToCall, verbToCall, returnJ, "stream_action"); + HalUtlHandleAppFwCallErrorInRequest(request, apiToCall, verbToCall, returnJ, "stream_action"); } else if(json_object_object_get_ex(returnJ, "response", &toReturnJ)){ afb_request_success_f(request, toReturnJ, "Action %s correctly transfered to %s without any error raised", @@ -254,7 +254,7 @@ void HalCtlsInitMixer(afb_request *request) // TODO JAI: test hal status (card is detected) if(afb_dynapi_call_sync(apiHandle, apiToCall, "create", json_object_get(currentCtlHalData->ctlHalSpecificData->halMixerJ), &returnJ)) { - HalCtlsHandleMixerCallError(request, apiToCall, "create", returnJ, "mixer_create"); + HalUtlHandleAppFwCallErrorInRequest(request, apiToCall, "create", returnJ, "mixer_create"); } else if(json_object_object_get_ex(returnJ, "response", &toReturnJ)) { err = HalCtlsHandleMixerAttachResponse(request, ¤tCtlHalData->ctlHalSpecificData->ctlHalStreamsData, toReturnJ); diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c index 64910b5..77bc4b6 100644 --- a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c @@ -27,75 +27,9 @@ #include "4a-hal-controllers-cb.h" /******************************************************************************* - * HAL controllers hanlde mixer responses functions * + * HAL controllers handle mixer response function * ******************************************************************************/ -void HalCtlsHandleMixerCallError(AFB_ReqT request, char *apiCalled, char *verbCalled, json_object *callReturnJ, char *errorStatus) -{ - char *returnedStatus, *returnedInfo; - - json_object *returnedRequestJ, *returnedStatusJ, *returnedInfoJ; - - if(! json_object_object_get_ex(callReturnJ, "request", &returnedRequestJ)) { - AFB_ReqFail(request, errorStatus, "Couldn't get response request object"); - return; - } - - if(! json_object_is_type(returnedRequestJ, json_type_object)) { - AFB_ReqFail(request, errorStatus, "Response request object is not valid"); - return; - } - - if(! json_object_object_get_ex(returnedRequestJ, "status", &returnedStatusJ)) { - AFB_ReqFail(request, errorStatus, "Couldn't get response status object"); - return; - } - - if(! json_object_is_type(returnedStatusJ, json_type_string)) { - AFB_ReqFail(request, errorStatus, "Response status object is not valid"); - return; - } - - returnedStatus = (char *) json_object_get_string(returnedStatusJ); - - if(! strcmp(returnedStatus, "unknown-api")) { - AFB_ReqFailF(request, - errorStatus, - "Api %s not found", - apiCalled); - return; - } - - if(! strcmp(returnedStatus, "unknown-verb")) { - AFB_ReqFailF(request, - errorStatus, - "Verb %s of api %s not found", - verbCalled, - apiCalled); - return; - } - - if(! json_object_object_get_ex(returnedRequestJ, "info", &returnedInfoJ)) { - AFB_ReqFail(request, errorStatus, "Couldn't get response info object"); - return; - } - - if(! json_object_is_type(returnedInfoJ, json_type_string)) { - AFB_ReqFail(request, errorStatus, "Response info object is not valid"); - return; - } - - returnedInfo = (char *) json_object_get_string(returnedInfoJ); - - AFB_ReqFailF(request, - errorStatus, - "Api %s and verb %s found, but this error was raised : '%s' with this info : '%s'", - apiCalled, - verbCalled, - returnedStatus, - returnedInfo); -} - int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT *currentHalStreamsData, json_object *mixerResponseJ) { int err = 0; diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h index 7e32a0f..9ad486d 100644 --- a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h @@ -24,7 +24,6 @@ #include "../4a-hal-utilities/4a-hal-utilities-data.h" -void HalCtlsHandleMixerCallError(AFB_ReqT request, char *apiCalled, char *verbCalled, json_object *callReturnJ, char *errorStatus); int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT *currentHalStreamsData, json_object *MixerResponseJ); #endif /* _HAL_CTLS_SOFTMIXER_LINK_INCLUDE_ */
\ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c b/4a-hal/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c new file mode 100644 index 0000000..12ee3e1 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.c @@ -0,0 +1,143 @@ +/* + * 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 <stdbool.h> + +#include "4a-hal-utilities-appfw-responses-handler.h" + +/******************************************************************************* + * Handle application framework response function * + ******************************************************************************/ + +enum CallError HalUtlHandleAppFwCallError(afb_dynapi *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_DYNAPI_WARNING(apiHandle, "Couldn't get response request object"); + return CALL_ERROR_REQUEST_UNAVAILABLE; + } + + if(! json_object_is_type(returnedRequestJ, json_type_object)) { + AFB_DYNAPI_WARNING(apiHandle, "Response request object is not valid"); + return CALL_ERROR_REQUEST_NOT_VALID; + } + + if(! json_object_object_get_ex(returnedRequestJ, "status", &returnedStatusJ)) { + AFB_DYNAPI_WARNING(apiHandle, "Couldn't get response status object"); + return CALL_ERROR_REQUEST_STATUS_UNAVAILABLE; + } + + if(! json_object_is_type(returnedStatusJ, json_type_string)) { + AFB_DYNAPI_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_DYNAPI_WARNING(apiHandle, "Api %s not found", apiCalled); + return CALL_ERROR_API_UNAVAILABLE; + } + + if(! strcmp(*returnedStatus, "unknown-verb")) { + AFB_DYNAPI_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_DYNAPI_WARNING(apiHandle, "Couldn't get response info object"); + return CALL_ERROR_REQUEST_INFO_UNAVAILABLE; + } + + if(! json_object_is_type(returnedInfoJ, json_type_string)) { + AFB_DYNAPI_WARNING(apiHandle, "Response info object is not valid"); + return CALL_ERROR_REQUEST_INFO_NOT_VALID; + } + + *returnedInfo = (char *) json_object_get_string(returnedInfoJ); + + AFB_DYNAPI_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_request *request, char *apiCalled, char *verbCalled, json_object *callReturnJ, char *errorStatusToSend) +{ + char **returnedStatus, **returnedInfo; + + afb_dynapi *apiHandle; + + if(! request || ! apiCalled || ! verbCalled || ! callReturnJ) { + afb_request_fail_f(request, "invalid_args", "%s: invalid arguments", __func__); + return; + } + + apiHandle = (afb_dynapi *) afb_request_get_dynapi(request); + if(! apiHandle) { + afb_request_fail_f(request, "api_handle", "%s: Can't get hal manager api handle", __func__); + return; + } + + returnedStatus = alloca(sizeof(char *)); + returnedInfo = alloca(sizeof(char *)); + + 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_request_fail(request, errorStatusToSend, "Error with response object"); + return; + + case CALL_ERROR_API_UNAVAILABLE: + afb_request_fail_f(request, errorStatusToSend, "Api %s not found", apiCalled); + return; + + case CALL_ERROR_VERB_UNAVAILABLE: + afb_request_fail_f(request, errorStatusToSend, "Verb %s of api %s not found", verbCalled, apiCalled); + return; + + case CALL_ERROR_RETURNED: + afb_request_fail_f(request, + errorStatusToSend, + "Api %s and verb %s found, but this error was raised : '%s' with this info : '%s'", + apiCalled, + verbCalled, + *returnedStatus, + *returnedInfo); + return; + + case CALL_ERROR_INVALID_ARGS: + default: + return; + } +}
\ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h b/4a-hal/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h new file mode 100644 index 0000000..54cdcc2 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h @@ -0,0 +1,46 @@ +/* + * 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> + +#define AFB_BINDING_VERSION dyn +#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 +enum CallError HalUtlHandleAppFwCallError(afb_dynapi *apiHandle, char *apiCalled, char *verbCalled, json_object *callReturnJ, char **returnedStatus, char **returnedInfo); +void HalUtlHandleAppFwCallErrorInRequest(afb_request *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/CMakeLists.txt b/4a-hal/CMakeLists.txt index 323c490..e205ec4 100644 --- a/4a-hal/CMakeLists.txt +++ b/4a-hal/CMakeLists.txt @@ -23,6 +23,7 @@ PROJECT_TARGET_ADD(4a-hal) # Define project Targets add_library(${TARGET_NAME} MODULE + ${TARGET_NAME}-utilities/${TARGET_NAME}-utilities-appfw-responses-handler.c ${TARGET_NAME}-utilities/${TARGET_NAME}-utilities-alsa-link.c ${TARGET_NAME}-utilities/${TARGET_NAME}-utilities-data.c ${TARGET_NAME}-utilities/${TARGET_NAME}-utilities-verbs-loader.c |