diff options
Diffstat (limited to 'src/4a-hal-manager/4a-hal-manager-cb.c')
-rw-r--r-- | src/4a-hal-manager/4a-hal-manager-cb.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/4a-hal-manager/4a-hal-manager-cb.c b/src/4a-hal-manager/4a-hal-manager-cb.c index 771ff50..67f46a9 100644 --- a/src/4a-hal-manager/4a-hal-manager-cb.c +++ b/src/4a-hal-manager/4a-hal-manager-cb.c @@ -26,6 +26,8 @@ #include "4a-hal-utilities-data.h" +#include "../4a-internals-hal/4a-internals-hal-cb.h" + #include "4a-hal-manager-cb.h" /******************************************************************************* @@ -127,6 +129,91 @@ void HalMgrLoaded(afb_req_t request) afb_req_success(request, requestAnswer, "Requested data"); } +void HalMgrInfo(afb_req_t request) +{ + int err, wrapRet = 0; + + afb_api_t apiHandle; + struct HalMgrData *halMgrData; + struct HalData *currentHalData; + + json_object *requestJson, *toReturnJ, *returnedInfoJ, *transferredJson = NULL; + + apiHandle = afb_req_get_api(request); + if(! apiHandle) { + afb_req_fail(request, "api_handle", "Can't get hal manager api handle"); + return; + } + + halMgrData = (struct HalMgrData *) afb_api_get_userdata(apiHandle); + if(! halMgrData) { + afb_req_fail(request, "hal_manager_data", "Can't get hal manager data"); + return; + } + + if(cds_list_empty(&halMgrData->halDataListHead)) { + afb_req_success(request, NULL, "No Hal Api loaded"); + return; + } + + requestJson = afb_req_json(request); + if(! requestJson) { + AFB_REQ_NOTICE(request, "Can't get request json, will use default verbose"); + wrapRet = wrap_json_pack(&transferredJson, "{s:i}", "verbose", 0); + if(wrapRet) { + afb_req_fail(request, "json_request", "Didn't succeed to generate default json request"); + return; + } + } + else { + AFB_REQ_DEBUG(request, + "Received request json ('%s') will be transferred to each hal 'info' verb", + json_object_get_string(requestJson)); + transferredJson = requestJson; + } + + toReturnJ = json_object_new_array(); + if(! toReturnJ) { + afb_req_fail(request, + "response_json_array", + "Didn't succeed to allocate response json array"); + if(! requestJson) + json_object_put(transferredJson); + return; + } + + cds_list_for_each_entry(currentHalData, &halMgrData->halDataListHead, node) { + if(! currentHalData->internalHalData) { + AFB_REQ_INFO(request, + "'%s' hal is an external hal, will not be able to get info about it", + currentHalData->apiName); + continue; + } + + err = GenerateInternalHalInfoJson(apiHandle, + currentHalData, + transferredJson, + &returnedInfoJ); + if(err){ + AFB_REQ_INFO(request, + "Error %i happened when tried to generate hal '%s' information json", + err, + currentHalData->apiName); + json_object_put(toReturnJ); + if(! requestJson) + json_object_put(transferredJson); + return; + } + + json_object_array_add(toReturnJ, returnedInfoJ); + } + + if(! requestJson) + json_object_put(transferredJson); + + afb_req_success(request, toReturnJ, "Requested data"); +} + void HalMgrLoad(afb_req_t request) { char *apiName, *uid, *info = NULL, *author = NULL, *version = NULL, *date = NULL; |