/* * Copyright (C) 2016 "IoT.bzh" * * Author Romain Forlot * * 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. */ #include #include #include struct mapisHandleT { AFB_ApiT mainApiHandle; CtlSectionT *section; json_object *mapiJ; json_object *verbsJ; json_object *eventsJ; }; static int LoadOneMapi(void *data, AFB_ApiT apiHandle) { int savedCount = 0, count = 0, idx = 0; CtlActionT *savedActions = NULL, *newActions = NULL; struct mapisHandleT *mapisHandle = (struct mapisHandleT*)data; CtlConfigT *ctrlConfig = AFB_ApiGetUserData(mapisHandle->mainApiHandle); if(PluginConfig(apiHandle, mapisHandle->section, mapisHandle->mapiJ)) { AFB_ApiError(apiHandle, "Problem loading the plugin as an API for %s, see log message above", json_object_get_string(mapisHandle->mapiJ)); return -1; } // declare the verbs for this API if(! ActionConfig(apiHandle, mapisHandle->verbsJ, 1)) { AFB_ApiError(apiHandle, "Problems at verbs creations for %s", json_object_get_string(mapisHandle->mapiJ)); return -1; } if(mapisHandle->eventsJ) { // Add actions to the section to be able to respond to defined events. for(idx = 0; ctrlConfig->sections[idx].key != NULL; ++idx) { if(! strcasecmp(ctrlConfig->sections[idx].key, "events")) { savedActions = ctrlConfig->sections[idx].actions; break; } } newActions = ActionConfig(apiHandle, mapisHandle->eventsJ, 0); if(savedActions) { while(savedActions[savedCount].uid != NULL) savedCount++; } while(newActions[count].uid != NULL) count++; int total = savedCount + count; count = 0; savedCount = 0; CtlActionT * mergedActions = calloc(total + 1, sizeof(CtlActionT)); if(savedActions) { while(savedActions[count].uid != NULL) { mergedActions[count] = savedActions[count]; count++; } } while(newActions[savedCount].uid != NULL && count <= total) { mergedActions[count] = newActions[savedCount]; count++; savedCount++; } ctrlConfig->sections[idx].actions = mergedActions; } // declare an event event manager for this API; AFB_ApiOnEvent(apiHandle, CtrlDispatchApiEvent); return 0; } static void OneMapiConfig(void *data, json_object *mapiJ) { const char *uid = NULL, *info = NULL; struct mapisHandleT *mapisHandle = (struct mapisHandleT*)data; if(mapiJ) { if(wrap_json_unpack(mapiJ, "{ss,s?s,s?s,so,s?o,so, s?o !}", "uid", &uid, "info", &info, "spath", NULL, "libs", NULL, "lua", NULL, "verbs", &mapisHandle->verbsJ, "events", &mapisHandle->eventsJ)) { AFB_ApiError(mapisHandle->mainApiHandle, "Wrong mapis specification, missing uid|[info]|[spath]|libs|[lua]|verbs|[events] for %s", json_object_get_string(mapiJ)); return; } json_object_get(mapisHandle->verbsJ); json_object_get(mapisHandle->eventsJ); json_object_object_del(mapiJ, "verbs"); json_object_object_del(mapiJ, "events"); mapisHandle->mapiJ = mapiJ; if (!AFB_NewApi(mapisHandle->mainApiHandle, uid, info, 1, LoadOneMapi, (void*)mapisHandle)) AFB_ApiError(mapisHandle->mainApiHandle, "Error creating new api: %s", uid); } } int MapiConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *mapisJ) { struct mapisHandleT mapisHandle = { .mainApiHandle = apiHandle, .section = section, .mapiJ = NULL, .verbsJ = NULL }; wrap_json_optarray_for_all(mapisJ, OneMapiConfig, (void*)&mapisHandle); return 0; }