From 96f0057d65fbb90d9faa02a3ae4ae37b357094db Mon Sep 17 00:00:00 2001 From: fulup Date: Mon, 14 Aug 2017 00:58:57 +0200 Subject: Work in Progress --- Controler-afb/ctl-apidef.h | 41 ++++++---- Controler-afb/ctl-apidef.json | 2 +- Controler-afb/ctl-binding.h | 17 ++-- Controler-afb/ctl-lua.c | 182 +++++++++++++++++++++--------------------- Controler-afb/ctl-misc.c | 35 ++++---- Controler-afb/ctl-misc2.c | 74 ----------------- 6 files changed, 148 insertions(+), 203 deletions(-) delete mode 100644 Controler-afb/ctl-misc2.c (limited to 'Controler-afb') diff --git a/Controler-afb/ctl-apidef.h b/Controler-afb/ctl-apidef.h index 0f801cb..1bd80f9 100644 --- a/Controler-afb/ctl-apidef.h +++ b/Controler-afb/ctl-apidef.h @@ -46,21 +46,26 @@ static const char _afb_description_v2_control[] = ",\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-permissions/navig" "ation\"},\"parameters\":[{\"in\":\"query\",\"name\":\"zone\",\"required\"" ":false,\"schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"$ref" - "\":\"#/components/responses/200\"}}}},\"/lua_docall\":{\"description\":\"" - "Execute LUA string script.\",\"get\":{\"x-permissions\":{\"$ref\":\"#/co" - "mponents/x-permissions/navigation\"},\"parameters\":[{\"in\":\"query\",\"" - "name\":\"func\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"i" - "n\":\"query\",\"name\":\"args\",\"required\":false,\"schema\":{\"type\":" - "\"array\"}}],\"responses\":{\"200\":{\"$ref\":\"#/components/responses/2" - "00\"}}}},\"/lua_dostring\":{\"description\":\"Execute LUA string script." + "\":\"#/components/responses/200\"}}}},\"/emergency\":{\"description\":\"" + "Request Access to Navigation Audio Channel.\",\"get\":{\"x-permissions\"" + ":{\"$ref\":\"#/components/x-permissions/navigation\"},\"parameters\":[{\"" + "in\":\"query\",\"name\":\"zone\",\"required\":false,\"schema\":{\"type\"" + ":\"string\"}}],\"responses\":{\"200\":{\"$ref\":\"#/components/responses" + "/200\"}}}},\"/lua_docall\":{\"description\":\"Execute LUA string script." "\",\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-permissions/nav" - "igation\"},\"parameters\":[{\"in\":\"query\",\"required\":true,\"schema\"" - ":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"$ref\":\"#/components" - "/responses/200\"}}}},\"/lua_doscript\":{\"description\":\"Execute LUA st" - "ring script.\",\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-per" - "missions/navigation\"},\"parameters\":[{\"in\":\"query\",\"name\":\"file" - "name\",\"required\":true,\"schema\":{\"type\":\"string\"}}],\"responses\"" - ":{\"200\":{\"$ref\":\"#/components/responses/200\"}}}}}}" + "igation\"},\"parameters\":[{\"in\":\"query\",\"name\":\"func\",\"require" + "d\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"query\",\"name\":\"" + "args\",\"required\":false,\"schema\":{\"type\":\"array\"}}],\"responses\"" + ":{\"200\":{\"$ref\":\"#/components/responses/200\"}}}},\"/lua_dostring\"" + ":{\"description\":\"Execute LUA string script.\",\"get\":{\"x-permission" + "s\":{\"$ref\":\"#/components/x-permissions/navigation\"},\"parameters\":" + "[{\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}}]," + "\"responses\":{\"200\":{\"$ref\":\"#/components/responses/200\"}}}},\"/l" + "ua_doscript\":{\"description\":\"Execute LUA string script.\",\"get\":{\"" + "x-permissions\":{\"$ref\":\"#/components/x-permissions/navigation\"},\"p" + "arameters\":[{\"in\":\"query\",\"name\":\"filename\",\"required\":true,\"" + "schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"$ref\":\"#/co" + "mponents/responses/200\"}}}}}}" ; static const struct afb_auth _afb_auths_v2_control[] = { @@ -71,6 +76,7 @@ static const struct afb_auth _afb_auths_v2_control[] = { void ctlapi_event_test(struct afb_req req); void ctlapi_navigation(struct afb_req req); void ctlapi_multimedia(struct afb_req req); + void ctlapi_emergency(struct afb_req req); void ctlapi_lua_docall(struct afb_req req); void ctlapi_lua_dostring(struct afb_req req); void ctlapi_lua_doscript(struct afb_req req); @@ -104,6 +110,13 @@ static const struct afb_verb_v2 _afb_verbs_v2_control[] = { .info = NULL, .session = AFB_SESSION_NONE_V2 }, + { + .verb = "emergency", + .callback = ctlapi_emergency, + .auth = &_afb_auths_v2_control[0], + .info = NULL, + .session = AFB_SESSION_NONE_V2 + }, { .verb = "lua_docall", .callback = ctlapi_lua_docall, diff --git a/Controler-afb/ctl-apidef.json b/Controler-afb/ctl-apidef.json index 438a9ef..28b8581 100644 --- a/Controler-afb/ctl-apidef.json +++ b/Controler-afb/ctl-apidef.json @@ -224,7 +224,7 @@ } } }, - "/navigation": { + "/emergency": { "description": "Request Access to Navigation Audio Channel.", "get": { "x-permissions": { diff --git a/Controler-afb/ctl-binding.h b/Controler-afb/ctl-binding.h index 01840b8..70ad0c3 100644 --- a/Controler-afb/ctl-binding.h +++ b/Controler-afb/ctl-binding.h @@ -42,6 +42,14 @@ typedef struct { #define CTL_PLUGIN_REGISTER(pluglabel) CtlPluginMagicT CtlPluginMagic={.magic=CTL_PLUGIN_MAGIC,.label=pluglabel}; struct afb_binding_data_v2; // ctl-misc.c +typedef enum { + CTL_SCAN_FLAT=0, + CTL_SCAN_RECURSIVE=1, +} CtlScanDirModeT; + +PUBLIC const char *GetMidleName(const char*name); +PUBLIC const char *GetBinderName(); +PUBLIC json_object* ScanForConfig (char* searchPath, CtlScanDirModeT mode, char *pre, char *ext); // polctl-binding.c @@ -49,21 +57,12 @@ PUBLIC int CtlBindingInit (); // ctl-timerevt.c // ---------------------- - - PUBLIC int TimerEvtInit (void); PUBLIC afb_event TimerEvtGet(void); PUBLIC void ctlapi_event_test (afb_req request); // ctl-policy // ----------- -typedef enum { - CTL_SCAN_FLAT=0, - CTL_SCAN_RECURSIVE=1, -} CtlScanDirModeT; - -PUBLIC json_object* ScanForConfig (char* searchPath, CtlScanDirModeT mode, char *pre, char *ext); -PUBLIC const char *GetBinderName(); typedef enum { CTL_MODE_NONE=0, diff --git a/Controler-afb/ctl-lua.c b/Controler-afb/ctl-lua.c index c1bc5f3..275b9d3 100644 --- a/Controler-afb/ctl-lua.c +++ b/Controler-afb/ctl-lua.c @@ -104,36 +104,10 @@ STATIC void LuaCtxFree (LuaAfbContextT *afbContext) { free (afbContext->info); } - -STATIC void LuaDumpArgs(lua_State* luaState, int start) { - int count = lua_gettop(luaState); - - for (int idx=start; idx <= count; idx++) { - int luaType = lua_type(luaState, idx); - switch(luaType) { - case LUA_TNUMBER: - AFB_NOTICE ("idx=%d type=%s value=%d", idx, lua_typename(luaState, luaType), (int)lua_tonumber(luaState, idx)); - break; - case LUA_TBOOLEAN: - AFB_NOTICE ("idx=%d type=%s value=%d", idx, lua_typename(luaState, luaType), lua_toboolean(luaState, idx)); - break; - case LUA_TSTRING: - AFB_NOTICE ("idx=%d type=%s value=%s", idx, lua_typename(luaState, luaType), lua_tostring(luaState, idx)); - break; - case LUA_TTABLE: { - AFB_NOTICE ("-++-- START luatable idx=%d ", idx); - (void)LuaDumpArgs(luaState, idx+1); - AFB_NOTICE ("-++-- END luatable idx=%d ", idx); - break; - } - default: - AFB_NOTICE ("PopOneArg: script returned Unknown/Unsupported idx=%d type:%d/%s", idx, luaType, lua_typename(luaState, luaType)); - } - } -} - // Push a json structure on the stack as a LUA table STATIC int LuaPushArgument (json_object *argsJ) { + + AFB_NOTICE("LuaPushArgument argsJ=%s", json_object_get_string(argsJ)); json_type jtype= json_object_get_type(argsJ); switch (jtype) { @@ -183,21 +157,18 @@ STATIC int LuaPushArgument (json_object *argsJ) { STATIC json_object *PopOneArg (lua_State* luaState, int idx); STATIC json_object *LuaTableToJson (lua_State* luaState, int index) { - + int idx; + json_object *tableJ= json_object_new_object(); const char *key; char number[3]; lua_pushnil(luaState); // 1st key - for (int jdx=1; lua_next(luaState, index) != 0; jdx++) { - - //printf("jdx=%d %s - %s\n", jdx, - //lua_typename(luaState, lua_type(luaState, -2)), - //lua_typename(luaState, lua_type(luaState, -1))); + for (idx=1; lua_next(luaState, index) != 0; idx++) { // uses 'key' (at index -2) and 'value' (at index -1) if (lua_type(luaState,-2) == LUA_TSTRING) key= lua_tostring(luaState, -2); else { - snprintf(number, sizeof(number),"%d", jdx); + snprintf(number, sizeof(number),"%d", idx); key=number; } @@ -205,6 +176,11 @@ STATIC json_object *LuaTableToJson (lua_State* luaState, int index) { lua_pop(luaState, 1); // removes 'value'; keeps 'key' for next iteration } + // Query is empty free empty json object + if (idx == 1) { + json_object_put(tableJ); + return NULL; + } return tableJ; } @@ -223,7 +199,6 @@ STATIC json_object *PopOneArg (lua_State* luaState, int idx) { value= json_object_new_string(lua_tostring(luaState, idx)); break; case LUA_TTABLE: { - AFB_NOTICE ("-++-- luatable idx=%d ", idx); value= LuaTableToJson(luaState, idx); break; } @@ -263,9 +238,7 @@ STATIC void LuaFormatMessage(lua_State* luaState, LuaAfbMessageT action) { message="-- Empty Message ???"; goto PrintMessage; } - - AFB_NOTICE ("**** responseJ=%s", json_object_get_string(responseJ)); - + // if we have only on argument just return the value. if (json_object_get_type(responseJ)!=json_type_array || json_object_array_length(responseJ) <2) { message= (char*)json_object_get_string(responseJ); @@ -287,17 +260,17 @@ STATIC void LuaFormatMessage(lua_State* luaState, LuaAfbMessageT action) { switch (format[++idx]) { case 'd': if (slotJ) targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"%d", json_object_get_int(slotJ)); - else targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"Nil"); + else targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"nil"); break; case 'f': if (slotJ) targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"%f", json_object_get_double(slotJ)); - else targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"Nil"); + else targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"nil"); break; case 's': default: if (slotJ) targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"%s", json_object_get_string(slotJ)); - else targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"Nil"); + else targetIdx += snprintf (&message[targetIdx], LUA_MSG_MAX_LENGTH-targetIdx,"nil"); } } else { @@ -394,9 +367,6 @@ STATIC void LuaAfbServiceCB(void *handle, int iserror, struct json_object *respo count+= LuaPushArgument(responseJ); count+= LuaPushArgument(contextCB->context); - AFB_NOTICE ("*** context=%s", json_object_get_string(contextCB->context)); - - int err=lua_pcall(luaState, count, LUA_MULTRET, 0); if (err) { AFB_ERROR ("LUA-SERICE-CB:FAIL response=%s err=%s", json_object_get_string(responseJ), lua_tostring(luaState,-1) ); @@ -431,6 +401,34 @@ STATIC int LuaAfbService(lua_State* luaState) { return 1; } +STATIC int LuaAfbServiceSync(lua_State* luaState) { + int count = lua_gettop(luaState); + json_object *responseJ; + + // note: argument start at 2 because of AFB: table + if (count <3 || !lua_isstring(luaState, 2) || !lua_isstring(luaState, 3) || !lua_istable(luaState, 4)) { + lua_pushliteral (luaState, "LuaAfbServiceSync-Syntax is error,data=AFB:service_call (api, verb, query)"); + goto OnErrorExit; + } + + // get api/verb+query + const char *api = lua_tostring(luaState,2); + const char *verb= lua_tostring(luaState,3); + json_object *queryJ= LuaTableToJson(luaState, 4); + + int iserror=afb_service_call_sync (api, verb, queryJ, &responseJ); + + // push error status & response + count=1; lua_pushboolean(luaState, iserror); + count+= LuaPushArgument(responseJ); + + return count; // return count values + + OnErrorExit: + lua_error(luaState); + return 1; +} + STATIC int LuaAfbMakeEvent(lua_State* luaState) { int count = lua_gettop(luaState); LuaAfbEvent *afbevt=calloc(1,sizeof(LuaAfbEvent)); @@ -508,16 +506,22 @@ PUBLIC int LuaCallFunc (DispatchActionT *action, json_object *queryJ) { lua_getglobal(luaState, func); // push argsJ on the stack - if (json_object_get_type(argsJ) != json_type_array) { + if (!argsJ) { + lua_pushnil(luaState); + count++; + } else if (json_object_get_type(argsJ) != json_type_array) { count+= LuaPushArgument (argsJ); } else { for (int idx=0; idx - * - * 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 -#include -#include - -#include "audio-common.h" -#include "ctl-binding.h" - - - -// Include Binding Stub generated from Json OpenAPI -#include "ctl-apidef.h" - - -PUBLIC void ctlapi_navigation (afb_req request) { - - ctlapi_dispatch ("NAVIGATION", request); -} - -PUBLIC void ctlapi_multimedia (afb_req request) { - - ctlapi_dispatch ("MULTIMEDIA", request); -} - -PUBLIC void ctlapi_emergency (afb_req request) { - - ctlapi_dispatch ("EMERGENCY", request); -} - -PUBLIC void ctlapi_monitor (afb_req request) { - - // subscribe Client to event - int err = afb_req_subscribe(request, TimerEvtGet()); - if (err != 0) { - afb_req_fail_f(request, "register-event", "Fail to subscribe binder event"); - goto OnErrorExit; - } - - afb_req_success(request, NULL, NULL); - - OnErrorExit: - return; -} - -// Create Binding Event at Init -PUBLIC int CtlBindingInit () { - - int errcount=0; - - errcount += TimerEvtInit(); - errcount += DispatchInit(); - errcount += LuaLibInit(); - - AFB_DEBUG ("Audio Policy Control Binding Done errcount=%d", errcount); - return errcount; -} - -- cgit 1.2.3-korg