diff options
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-api-loader.c | 2 | ||||
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-cb.c | 146 | ||||
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-cb.h | 6 |
3 files changed, 100 insertions, 54 deletions
diff --git a/src/4a-internals-hal/4a-internals-hal-api-loader.c b/src/4a-internals-hal/4a-internals-hal-api-loader.c index ba742f1..c833521 100644 --- a/src/4a-internals-hal/4a-internals-hal-api-loader.c +++ b/src/4a-internals-hal/4a-internals-hal-api-loader.c @@ -62,7 +62,7 @@ static afb_verb_t InternalHalApiStaticVerbs[] = { /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */ { .verb = "ping", .callback = HalUtlPing, .info = "Ping for test"}, - { .verb = "info", .callback = InternalHalInfo, .info = "List available streams/controls for this api" }, + { .verb = "info", .callback = InternalHalInfoVerb, .info = "List available dependencies/streams/controls for this api" }, { .verb = "subscribe", .callback = InternalHalSubscribe, .info = "Subscribe to event(s) for values changes (streams/controls) for this api" }, { .verb = "unsubscribe", .callback = InternalHalUnsubscribe, .info = "Unsubscribe to event(s) for values changes (streams/controls) for this api" }, { .verb = HAL_ALL_STREAMS_VERB, .callback = HalUtlActionOnAllStream, .info = "Send a stream action on all streams" }, diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c index 1e872bb..cef8605 100644 --- a/src/4a-internals-hal/4a-internals-hal-cb.c +++ b/src/4a-internals-hal/4a-internals-hal-cb.c @@ -1285,22 +1285,100 @@ int InternalHalHalMapConfig(afb_api_t apiHandle, CtlSectionT *section, json_obje * Internals HAL verbs functions * ******************************************************************************/ -void InternalHalInfo(afb_req_t request) +int GenerateInternalHalInfoJson(afb_api_t apiHandle, + struct HalData *currentHalData, + json_object *requestJ, + json_object **returnedJ) { - char *apiToCall, *returnedError = NULL, *returnedInfo = NULL; + int wrapRet, verboseLevel = 2; - afb_api_t apiHandle; - CtlConfigT *ctrlConfig; - - struct HalData *currentHalData; + char *apiToCall, *returnedError = NULL, *returnedInfo = NULL; - json_object *requestJson, + json_object *mixerRequestJ = NULL, *toReturnJ = NULL, *requestAnswer, *streamsArray, *controlsArray, *dependenciesArray; + if(! apiHandle || ! currentHalData || ! returnedJ) + return -1; + + *returnedJ = NULL; + + if(requestJ) { + wrapRet = wrap_json_unpack(requestJ, + "{s?:i, s?:o !}", + "verbose", &verboseLevel, + "mixer", &mixerRequestJ); + if(wrapRet) + return -2; + } + + if(mixerRequestJ && + json_object_is_type(mixerRequestJ, json_type_object) && + json_object_get_object(mixerRequestJ)->count > 0) { + apiToCall = currentHalData->internalHalData->mixerApiName; + if(! apiToCall) + return-3; + + if(InternalHalGetInfoFromMixer(apiHandle, + apiToCall, + mixerRequestJ, + &toReturnJ, + &returnedError, + &returnedInfo)) + return -4; + + *returnedJ = toReturnJ; + return 0; + } + + requestAnswer = json_object_new_object(); + + if(verboseLevel >= 0) { + dependenciesArray = HalUtlGetJsonArrayForAllDependencies(apiHandle, + ¤tHalData->internalHalData->probedDevicesListHead, + DEPENDENCY_FULL_JSON); + if(dependenciesArray) + json_object_object_add(requestAnswer, "dependencies", dependenciesArray); + } + + if(verboseLevel >= 1) { + controlsArray = HalUtGetJsonArrayForAllHalMapControls(apiHandle, + ¤tHalData->internalHalData->halMapListHead); + if(controlsArray) + json_object_object_add(requestAnswer, "controls", controlsArray); + } + + if(verboseLevel >= 2) { + streamsArray = HalUtlGetJsonArrayForAllMixersData(apiHandle, + ¤tHalData->internalHalData->streamsDataListHead); + if(! streamsArray) + streamsArray = json_object_new_array(); // Always return an array for 4a-hl-api (to prevent segfault) + json_object_object_add(requestAnswer, "streams", streamsArray); + } + + if(! json_object_get_object(requestAnswer)->count) { + json_object_put(requestAnswer); + requestAnswer = NULL; + } + + *returnedJ = requestAnswer; + return 0; +} + +void InternalHalInfoVerb(afb_req_t request) +{ + int err; + + afb_api_t apiHandle; + CtlConfigT *ctrlConfig; + + struct HalData *currentHalData; + + json_object *requestJ, *toReturnJ; + apiHandle = afb_req_get_api(request); if(! apiHandle) { afb_req_fail(request, "api_handle", "Can't get current internal hal api handle"); @@ -1319,55 +1397,19 @@ void InternalHalInfo(afb_req_t request) return; } - requestJson = afb_req_json(request); - if(! requestJson) { - AFB_REQ_NOTICE(request, "Can't get request json"); - } - else if(json_object_is_type(requestJson, json_type_object) && json_object_get_object(requestJson)->count > 0) { - apiToCall = currentHalData->internalHalData->mixerApiName; - if(! apiToCall) { - afb_req_fail(request, "mixer_api", "Can't get mixer api"); - return; - } - - if(InternalHalGetInfoFromMixer(apiHandle, apiToCall, requestJson, &toReturnJ, &returnedError, &returnedInfo)) { - afb_req_fail_f(request, - "mixer_info", - "Call to mixer info verb didn't succeed with status '%s' and info '%s'", - returnedError ? returnedError : "not returned", - returnedInfo ? returnedInfo : "not returned"); - return; - } + requestJ = afb_req_json(request); - afb_req_success(request, toReturnJ, "Mixer requested data"); + err = GenerateInternalHalInfoJson(apiHandle, currentHalData, requestJ, &toReturnJ); + if(err) { + afb_req_fail_f(request, + "get_info_fail", + "Error %i happened when tried to get json info for request json '%s'", + err, + json_object_get_string(requestJ)); return; } - requestAnswer = json_object_new_object(); - - dependenciesArray = HalUtlGetJsonArrayForAllDependencies(apiHandle, - ¤tHalData->internalHalData->probedDevicesListHead, - DEPENDENCY_FULL_JSON); - if(dependenciesArray) - json_object_object_add(requestAnswer, "dependencies", dependenciesArray); - - streamsArray = HalUtlGetJsonArrayForAllMixersData(apiHandle, - ¤tHalData->internalHalData->streamsDataListHead); - if(! streamsArray) - streamsArray = json_object_new_array(); // Always return an array for 4a-hl-api (to prevent segfault) - json_object_object_add(requestAnswer, "streams", streamsArray); - - controlsArray = HalUtGetJsonArrayForAllHalMapControls(apiHandle, - ¤tHalData->internalHalData->halMapListHead); - if(controlsArray) - json_object_object_add(requestAnswer, "controls", controlsArray); - - if(! json_object_get_object(requestAnswer)->count) { - json_object_put(requestAnswer); - requestAnswer = NULL; - } - - afb_req_success(request, requestAnswer, "Requested data"); + afb_req_success(request, toReturnJ, "Requested data"); } void InternalHalSubscribeUnsubscribe(afb_req_t request, enum SubscribeUnsubscribeType subscribeUnsubscribeType) diff --git a/src/4a-internals-hal/4a-internals-hal-cb.h b/src/4a-internals-hal/4a-internals-hal-cb.h index d7b998c..48e3c35 100644 --- a/src/4a-internals-hal/4a-internals-hal-cb.h +++ b/src/4a-internals-hal/4a-internals-hal-cb.h @@ -54,7 +54,11 @@ int InternalHalHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_ob int InternalHalHalMapConfig(afb_api_t apiHandle, CtlSectionT *section, json_object *halMapJ); // Internals HAL verbs functions -void InternalHalInfo(afb_req_t request); +int GenerateInternalHalInfoJson(afb_api_t apiHandle, + struct HalData *currentHalData, + json_object *requestJ, + json_object **returnedJ); +void InternalHalInfoVerb(afb_req_t request); void InternalHalSubscribe(afb_req_t request); void InternalHalUnsubscribe(afb_req_t request); |