From c27b88e3c36585d11e866902f73d1e961357c45c Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Thu, 21 Sep 2017 18:15:13 +0200 Subject: Rename bindingApp to Composer Change-Id: Ib3256f5c89197a91d2bbfca7a92774e91de6f664 Signed-off-by: Romain Forlot --- .../signal-composer-binding.cpp | 24 +- signal-composer-binding/signal-composer.cpp | 293 +++++++++++---------- signal-composer-binding/signal-composer.hpp | 15 +- signal-composer-binding/signal.cpp | 6 +- signal-composer-binding/signal.hpp | 4 +- signal-composer-binding/source.cpp | 2 +- 6 files changed, 187 insertions(+), 157 deletions(-) (limited to 'signal-composer-binding') diff --git a/signal-composer-binding/signal-composer-binding.cpp b/signal-composer-binding/signal-composer-binding.cpp index 5dcb53f..95bfc36 100644 --- a/signal-composer-binding/signal-composer-binding.cpp +++ b/signal-composer-binding/signal-composer-binding.cpp @@ -33,9 +33,9 @@ void onEvent(const char *event, json_object *object) { AFB_DEBUG("Received event json: %s", json_object_to_json_string(object)); - bindingApp& bApp = bindingApp::instance(); + Composer& composer = Composer::instance(); - std::vector> signals = bApp.searchSignals(event); + std::vector> signals = composer.searchSignals(event); if(!signals.empty()) { for(auto& sig: signals) @@ -106,7 +106,7 @@ void loadConf(afb_req request) wrap_json_unpack(args, "{s:s}", "filepath", &filepath); fileJ = json_object_from_file(filepath); - if(bindingApp::instance().loadSignals(fileJ)) + if(Composer::instance().loadSignals(fileJ)) {afb_req_fail_f(request, "Loading configuration or subscription error", "Error code: -1");} else { @@ -120,7 +120,7 @@ void list(afb_req request) { struct json_object *allSignalsJ = json_object_new_array(); - std::vector> allSignals = bindingApp::instance().getAllSignals(); + std::vector> allSignals = Composer::instance().getAllSignals(); for(auto& sig: allSignals) {json_object_array_add(allSignalsJ, sig->toJSON());} @@ -152,7 +152,7 @@ void get(struct afb_req request) return; } - ans = bindingApp::instance().getSignalValue(sig, options); + ans = Composer::instance().getSignalValue(sig, options); if (ans) afb_req_success(request, ans, NULL); @@ -166,22 +166,22 @@ int loadConf() const char* rootdir = strncat(GetBindingDirPath(), "/etc", sizeof(GetBindingDirPath()) - strlen(GetBindingDirPath()) -1); - bindingApp& bApp = bindingApp::instance(); - err = bApp.loadConfig(rootdir); + Composer& composer = Composer::instance(); + err = composer.loadConfig(rootdir); return err; } int execConf() { - bindingApp& bApp = bindingApp::instance(); + Composer& composer = Composer::instance(); int err = 0; - CtlConfigExec(bApp.ctlConfig()); - std::vector> allSignals = bApp.getAllSignals(); + CtlConfigExec(composer.ctlConfig()); + std::vector> allSignals = composer.getAllSignals(); ssize_t sigCount = allSignals.size(); for( std::shared_ptr& sig: allSignals) { - sig->attachToSourceSignals(bApp); + sig->attachToSourceSignals(composer); } for(auto& sig: allSignals) @@ -193,7 +193,7 @@ int execConf() } } - bApp.execSubscription(); + composer.execSubscription(); AFB_DEBUG("Signal Composer Control configuration Done.\n signals=%d", (int)sigCount); diff --git a/signal-composer-binding/signal-composer.cpp b/signal-composer-binding/signal-composer.cpp index 0eba8a2..c6ffdd4 100644 --- a/signal-composer-binding/signal-composer.cpp +++ b/signal-composer-binding/signal-composer.cpp @@ -22,7 +22,7 @@ extern "C" void setSignalValueHandle(const char* aName, long long int timestamp, struct SignalValue value) { - std::vector> signals = bindingApp::instance().searchSignals(aName); + std::vector> signals = Composer::instance().searchSignals(aName); if(!signals.empty()) { for(auto& sig: signals) @@ -44,7 +44,7 @@ static struct pluginCBT pluginHandle = { .setSignalValue = setSignalValueHandle, }; -CtlSectionT bindingApp::ctlSections_[] = { +CtlSectionT Composer::ctlSections_[] = { [0]={.key="plugins" , .label = "plugins", .info=nullptr, .loadCB=PluginConfig, .handle=&pluginHandle}, @@ -59,68 +59,19 @@ CtlSectionT bindingApp::ctlSections_[] = { .handle=nullptr} }; -bindingApp::bindingApp() +/////////////////////////////////////////////////////////////////////////////// +// PRIVATE METHODS // +/////////////////////////////////////////////////////////////////////////////// + +Composer::Composer() {} -bindingApp::~bindingApp() +Composer::~Composer() { free(ctlConfig_); } -int bindingApp::loadConfig(const std::string& filepath) -{ - ctlConfig_ = CtlConfigLoad(filepath.c_str(), ctlSections_); - if(ctlConfig_ != nullptr) {return 0;} - return -1; -} - -bindingApp& bindingApp::instance() -{ - static bindingApp bApp; - return bApp; -} - -SourceAPI* bindingApp::getSourceAPI(const std::string& api) -{ - for(auto& source: sourcesListV_) - { - if (source.api() == api) - {return &source;} - } - return nullptr; -} -int bindingApp::initSourcesAPI() -{ - int err = 0; - for(auto& src: sourcesListV_) - { - err += src.init(); - } - return err; -} - -std::vector bindingApp::parseURI(const std::string& uri) -{ - std::vector uriV; - std::string delimiters = "/"; - - std::string::size_type start = 0; - auto pos = uri.find_first_of(delimiters, start); - while(pos != std::string::npos) - { - if(pos != start) // ignore empty tokens - uriV.emplace_back(uri, start, pos - start); - start = pos + 1; - pos = uri.find_first_of(delimiters, start); - } - - if(start < uri.length()) // ignore trailing delimiter - uriV.emplace_back(uri, start, uri.length() - start); // add what's left of the string - - return uriV; -} - -CtlActionT* bindingApp::convert2Action(const std::string& name, json_object* actionJ) +CtlActionT* Composer::convert2Action(const std::string& name, json_object* actionJ) { json_object *functionArgsJ = nullptr, *action = nullptr; char *function; @@ -143,7 +94,7 @@ CtlActionT* bindingApp::convert2Action(const std::string& name, json_object* act else if(startsWith(function, "api://")) { std::string uri = std::string(function).substr(6); - std::vector uriV = bindingApp::parseURI(uri); + std::vector uriV = Composer::parseURI(uri); if(uriV.size() != 2) { AFB_ERROR("Miss something in uri either plugin name or function name. Uri has to be like: api:///"); @@ -158,7 +109,7 @@ CtlActionT* bindingApp::convert2Action(const std::string& name, json_object* act else if(startsWith(function, "plugin://")) { std::string uri = std::string(function).substr(9); - std::vector uriV = bindingApp::parseURI(uri); + std::vector uriV = Composer::parseURI(uri); if(uriV.size() != 2) { AFB_ERROR("Miss something in uri either plugin name or function name. Uri has to be like: plugin:///"); @@ -183,7 +134,7 @@ CtlActionT* bindingApp::convert2Action(const std::string& name, json_object* act return nullptr; } -int bindingApp::loadOneSourceAPI(json_object* sourceJ) +int Composer::loadOneSourceAPI(json_object* sourceJ) { json_object *initJ = nullptr, *getSignalsJ = nullptr; CtlActionT *initCtl = nullptr, *getSignalsCtl = nullptr; @@ -215,10 +166,10 @@ int bindingApp::loadOneSourceAPI(json_object* sourceJ) return err; } -int bindingApp::loadSourcesAPI(CtlSectionT* section, json_object *sourcesJ) +int Composer::loadSourcesAPI(CtlSectionT* section, json_object *sourcesJ) { int err = 0; - bindingApp& bApp = instance(); + Composer& composer = instance(); if(sourcesJ) { @@ -237,23 +188,23 @@ int bindingApp::loadSourcesAPI(CtlSectionT* section, json_object *sourcesJ) for (int idx = 0; idx < count; idx++) { json_object *sourceJ = json_object_array_get_idx(sourcesJ, idx); - err = bApp.loadOneSourceAPI(sourceJ); + err = composer.loadOneSourceAPI(sourceJ); if (err) return err; } } else { - if ((err = bApp.loadOneSourceAPI(sourcesJ))) return err; - if (sigCompJ && (err = bApp.loadOneSourceAPI(sigCompJ))) return err; + if ((err = composer.loadOneSourceAPI(sourcesJ))) return err; + if (sigCompJ && (err = composer.loadOneSourceAPI(sigCompJ))) return err; } } else - {err += bindingApp::instance().initSourcesAPI();} + {err += Composer::instance().initSourcesAPI();} return err; } -int bindingApp::loadOneSignal(json_object* signalJ) +int Composer::loadOneSignal(json_object* signalJ) { json_object *onReceivedJ = nullptr, *dependsJ = nullptr, *getSignalsArgs = nullptr; CtlActionT* onReceivedCtl; @@ -351,10 +302,10 @@ int bindingApp::loadOneSignal(json_object* signalJ) return err; } -int bindingApp::loadSignals(CtlSectionT* section, json_object *signalsJ) +int Composer::loadSignals(CtlSectionT* section, json_object *signalsJ) { int err = 0; - bindingApp& bApp = instance(); + Composer& composer = instance(); if(signalsJ) { @@ -365,76 +316,18 @@ int bindingApp::loadSignals(CtlSectionT* section, json_object *signalsJ) for (int idx = 0; idx < count; idx++) { json_object *signalJ = json_object_array_get_idx(signalsJ, idx); - err = bApp.loadOneSignal(signalJ); + err = composer.loadOneSignal(signalJ); if (err) return err; } } else - {err = bApp.loadOneSignal(signalsJ);} + {err = composer.loadOneSignal(signalsJ);} } return err; } -int bindingApp::loadSignals(json_object* signalsJ) -{ - return loadSignals(nullptr, signalsJ); -} - -std::vector> bindingApp::searchSignals(const std::string& aName) -{ - std::string api; - std::vector> signals; - size_t sep = aName.find_first_of("/"); - if(sep != std::string::npos) - { - api = aName.substr(0, sep); - SourceAPI* source = getSourceAPI(api); - return source->searchSignals(aName); - } - else - { - std::vector> allSignals = getAllSignals(); - for (std::shared_ptr& sig : allSignals) - { - if(*sig == aName) - {signals.emplace_back(sig);} - } - } - return signals; -} - -std::vector> bindingApp::getAllSignals() -{ - std::vector> allSignals; - for( auto& source : sourcesListV_) - { - std::vector> srcSignals = source.getSignals(); - allSignals.insert(allSignals.end(), srcSignals.begin(), srcSignals.end()); - } - - return allSignals; -} - -CtlConfigT* bindingApp::ctlConfig() -{ - return ctlConfig_; -} - -int bindingApp::execSubscription() -{ - int err = 0; - for(SourceAPI& srcAPI: sourcesListV_) - { - if (srcAPI.api() != std::string(ctlConfig_->api)) - { - err = srcAPI.makeSubscription(); - } - } - return err; -} - -void bindingApp::processOptions(const char** opts, std::shared_ptr sig, json_object* response) const +void Composer::processOptions(const char** opts, std::shared_ptr sig, json_object* response) const { for(int idx=0; idx < sizeof(opts); idx++) { @@ -482,7 +375,129 @@ void bindingApp::processOptions(const char** opts, std::shared_ptr sig, } } } -json_object* bindingApp::getSignalValue(const std::string& sig, json_object* options) + +/////////////////////////////////////////////////////////////////////////////// +// PUBLIC METHODS // +/////////////////////////////////////////////////////////////////////////////// + +Composer& Composer::instance() +{ + static Composer composer; + return composer; +} + +void* Composer::createContext(void* ctx) +{ + uuid_t x; + uuid_generate(x); + ctx = (clientAppCtxT*)calloc(1, sizeof(clientAppCtxT)); + clientAppCtxT* ret = (clientAppCtxT*) ctx; + uuid_copy(ret->uid, x); + ret->subscribedSignals = std::vector>(); + ret->event = afb_daemon_make_event("evt"); + + return (void*)ret; +} + +void Composer::destroyContext(void* ctx) +{ + free(ctx); +} + +std::vector Composer::parseURI(const std::string& uri) +{ + std::vector uriV; + std::string delimiters = "/"; + + std::string::size_type start = 0; + auto pos = uri.find_first_of(delimiters, start); + while(pos != std::string::npos) + { + if(pos != start) // ignore empty tokens + uriV.emplace_back(uri, start, pos - start); + start = pos + 1; + pos = uri.find_first_of(delimiters, start); + } + + if(start < uri.length()) // ignore trailing delimiter + uriV.emplace_back(uri, start, uri.length() - start); // add what's left of the string + + return uriV; +} + +int Composer::loadConfig(const std::string& filepath) +{ + ctlConfig_ = CtlConfigLoad(filepath.c_str(), ctlSections_); + if(ctlConfig_ != nullptr) {return 0;} + return -1; +} + +int Composer::loadSignals(json_object* signalsJ) +{ + return loadSignals(nullptr, signalsJ); +} + +CtlConfigT* Composer::ctlConfig() +{ + return ctlConfig_; +} + +int Composer::initSourcesAPI() +{ + int err = 0; + for(auto& src: sourcesListV_) + { + err += src.init(); + } + return err; +} + +std::vector> Composer::getAllSignals() +{ + std::vector> allSignals; + for( auto& source : sourcesListV_) + { + std::vector> srcSignals = source.getSignals(); + allSignals.insert(allSignals.end(), srcSignals.begin(), srcSignals.end()); + } + + return allSignals; +} + +SourceAPI* Composer::getSourceAPI(const std::string& api) +{ + for(auto& source: sourcesListV_) + { + if (source.api() == api) + {return &source;} + } + return nullptr; +} + +std::vector> Composer::searchSignals(const std::string& aName) +{ + std::string api; + std::vector> signals; + size_t sep = aName.find_first_of("/"); + if(sep != std::string::npos) + { + api = aName.substr(0, sep); + SourceAPI* source = getSourceAPI(api); + return source->searchSignals(aName); + } + else + { + std::vector> allSignals = getAllSignals(); + for (std::shared_ptr& sig : allSignals) + { + if(*sig == aName) + {signals.emplace_back(sig);} + } + } + return signals; +} + +json_object* Composer::getSignalValue(const std::string& sig, json_object* options) { const char **opts = nullptr; json_object *response = nullptr, *finalResponse = json_object_new_array(); @@ -493,7 +508,6 @@ json_object* bindingApp::getSignalValue(const std::string& sig, json_object* opt &opts[2], &opts[3]); - std::vector> sigP = searchSignals(sig); if(!sigP.empty()) { @@ -528,3 +542,16 @@ json_object* bindingApp::getSignalValue(const std::string& sig, json_object* opt return response; } + +int Composer::execSubscription() +{ + int err = 0; + for(SourceAPI& srcAPI: sourcesListV_) + { + if (srcAPI.api() != std::string(ctlConfig_->api)) + { + err = srcAPI.makeSubscription(); + } + } + return err; +} diff --git a/signal-composer-binding/signal-composer.hpp b/signal-composer-binding/signal-composer.hpp index 5cf5858..bbc9a36 100644 --- a/signal-composer-binding/signal-composer.hpp +++ b/signal-composer-binding/signal-composer.hpp @@ -16,13 +16,14 @@ */ #pragma once +#include #include #include #include #include "source.hpp" -class bindingApp +class Composer { private: CtlConfigT* ctlConfig_; @@ -30,9 +31,9 @@ private: static CtlSectionT ctlSections_[]; ///< Config Section definition (note: controls section index should match handle retrieval in) std::vector sourcesListV_; - explicit bindingApp(const std::string& filepath); - bindingApp(); - ~bindingApp(); + explicit Composer(const std::string& filepath); + Composer(); + ~Composer(); CtlActionT* convert2Action(const std::string& name, json_object* action); @@ -42,8 +43,11 @@ private: int loadOneSignal(json_object* signalsJ); static int loadSignals(CtlSectionT* section, json_object *signalsJ); + void processOptions(const char** opts, std::shared_ptr sig, json_object* response) const; public: - static bindingApp& instance(); + static Composer& instance(); + static void* createContext(void* ctx); + static void destroyContext(void* ctx); static std::vector parseURI(const std::string& uri); int loadConfig(const std::string& filepath); int loadSignals(json_object* signalsJ); @@ -54,7 +58,6 @@ public: SourceAPI* getSourceAPI(const std::string& api); std::vector> searchSignals(const std::string& aName); json_object* getSignalValue(const std::string& sig, json_object* options); - void processOptions(const char** opts, std::shared_ptr sig, json_object* response) const; int execSubscription(); }; diff --git a/signal-composer-binding/signal.cpp b/signal-composer-binding/signal.cpp index a9a18b0..2d49c3c 100644 --- a/signal-composer-binding/signal.cpp +++ b/signal-composer-binding/signal.cpp @@ -159,14 +159,14 @@ void Signal::attach(Signal* obs) /// @brief Make a Signal observer observes Signals observables /// set in its observable vector. /// -/// @param[in] bApp - bindinApp instance -void Signal::attachToSourceSignals(bindingApp& bApp) +/// @param[in] composer - bindinApp instance +void Signal::attachToSourceSignals(Composer& composer) { for (const std::string& srcSig: dependsSigV_) { if(srcSig.find("/") == std::string::npos) { - std::vector> sig = bApp.searchSignals(srcSig); + std::vector> sig = composer.searchSignals(srcSig); if(sig[0]) { AFB_NOTICE("Attaching %s to %s", id_.c_str(), srcSig.c_str()); diff --git a/signal-composer-binding/signal.hpp b/signal-composer-binding/signal.hpp index c029a64..870843e 100644 --- a/signal-composer-binding/signal.hpp +++ b/signal-composer-binding/signal.hpp @@ -22,7 +22,7 @@ #include #include -class bindingApp; +class Composer; struct SignalValue { bool hasBool = false; @@ -67,7 +67,7 @@ public: void set(long long int timestamp, struct SignalValue& value); void update(long long int timestamp, struct SignalValue value); int onReceivedCB(json_object *queryJ); - void attachToSourceSignals(bindingApp& bApp); + void attachToSourceSignals(Composer& composer); double average(int seconds = 0) const; double minimum(int seconds = 0) const; diff --git a/signal-composer-binding/source.cpp b/signal-composer-binding/source.cpp index 8481740..6c991f0 100644 --- a/signal-composer-binding/source.cpp +++ b/signal-composer-binding/source.cpp @@ -31,7 +31,7 @@ int SourceAPI::init() {return ActionExecOne(init_, nullptr);} else if(api_ == afbBindingV2.api) { - api_ = bindingApp::instance().ctlConfig()->api; + api_ = Composer::instance().ctlConfig()->api; } return 0; -- cgit 1.2.3-korg