summaryrefslogtreecommitdiffstats
path: root/boards.yaml
diff options
context:
space:
mode:
authorCorentin LABBE <clabbe@baylibre.com>2018-01-08 15:18:03 +0100
committerCorentin LABBE <clabbe@baylibre.com>2018-01-08 15:18:03 +0100
commit7cc953e318d9043988d21220c976db8cd24057f8 (patch)
treeb7522239440483a84dc670de0cbff301cb6d4403 /boards.yaml
parent633d0339534944b22c95e58dd069b76fb9dfcd44 (diff)
Fix custom device-type handling
Device-type are jinja2 files and not yaml files and so a have a different filename. So this patch correct the handling of custom device-types.
Diffstat (limited to 'boards.yaml')
0 files changed, 0 insertions, 0 deletions
n95' href='#n95'>95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
/*
 * 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 "4a-hal-utilities-appfw-responses-handler.h"

/*******************************************************************************
 *		Handle application framework response function		       *
 ******************************************************************************/

enum CallError HalUtlHandleAppFwCallError(AFB_ApiT 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_ApiWarning(apiHandle, "Couldn't get response request object");
		return CALL_ERROR_REQUEST_UNAVAILABLE;
	}

	if(! json_object_is_type(returnedRequestJ, json_type_object)) {
		AFB_ApiWarning(apiHandle, "Response request object is not valid");
		return CALL_ERROR_REQUEST_NOT_VALID;
	}

	if(! json_object_object_get_ex(returnedRequestJ, "status", &returnedStatusJ)) {
		AFB_ApiWarning(apiHandle, "Couldn't get response status object");
		return CALL_ERROR_REQUEST_STATUS_UNAVAILABLE;
	}

	if(! json_object_is_type(returnedStatusJ, json_type_string)) {
		AFB_ApiWarning(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_ApiWarning(apiHandle, "Api %s not found", apiCalled);
		return CALL_ERROR_API_UNAVAILABLE;
	}

	if(! strcmp(*returnedStatus, "unknown-verb")) {
		AFB_ApiWarning(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_ApiWarning(apiHandle, "Couldn't get response info object");
		return CALL_ERROR_REQUEST_INFO_UNAVAILABLE;
	}

	if(! json_object_is_type(returnedInfoJ, json_type_string)) {
		AFB_ApiWarning(apiHandle, "Response info object is not valid");
		return CALL_ERROR_REQUEST_INFO_NOT_VALID;
	}

	*returnedInfo = (char *) json_object_get_string(returnedInfoJ);

	AFB_ApiWarning(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_ReqT request, char *apiCalled, char *verbCalled, json_object *callReturnJ, char *errorStatusToSend)
{
	char *returnedStatus = NULL, *returnedInfo = NULL;

	AFB_ApiT apiHandle;

	if(! request || ! apiCalled || ! verbCalled || ! callReturnJ) {
		AFB_ReqFailF(request, "invalid_args", "%s: invalid arguments", __func__);
		return;
	}

	apiHandle = (AFB_ApiT) afb_request_get_dynapi(request);
	if(! apiHandle) {
		AFB_ReqFailF(request, "api_handle", "%s: Can't get hal manager api handle", __func__);
		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_ReqFail(request, errorStatusToSend, "Error with response object");
			return;

		case CALL_ERROR_API_UNAVAILABLE:
			AFB_ReqFailF(request, errorStatusToSend, "Api %s not found", apiCalled);
			return;

		case CALL_ERROR_VERB_UNAVAILABLE:
			AFB_ReqFailF(request, errorStatusToSend, "Verb %s of api %s not found", verbCalled, apiCalled);
			return;

		case CALL_ERROR_RETURNED:
			AFB_ReqFailF(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:
		default:
			return;
	}
}