diff options
author | wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com> | 2019-03-26 14:55:18 +0800 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2019-03-28 11:00:52 +0000 |
commit | 2d1c8cc2f43d021ad75adc16f0606fb52615d9a6 (patch) | |
tree | a5907015c127922568f291a5b1451600380bd960 /src/homescreen.cpp | |
parent | aa43a07d4e86421aefec8c603018d14f5e249087 (diff) |
Impove event process
1. manager event list in hs_instance.
2. add setEventHook interface to hook event.
Change-Id: I65a64f2d16343eb68d22fd1ad9d5fbf565f5967a
Signed-off-by: wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>
Diffstat (limited to 'src/homescreen.cpp')
-rw-r--r-- | src/homescreen.cpp | 82 |
1 files changed, 80 insertions, 2 deletions
diff --git a/src/homescreen.cpp b/src/homescreen.cpp index b11663b..31c79f8 100644 --- a/src/homescreen.cpp +++ b/src/homescreen.cpp @@ -19,6 +19,8 @@ #endif #include <memory> #include <algorithm> +#include <unordered_map> +#include <list> #include "hs-helper.h" #include "hs-clientmanager.h" #include "hs-appinfo.h" @@ -37,6 +39,10 @@ struct hs_instance { hs_instance() : client_manager(HS_ClientManager::instance()), app_info(HS_AppInfo::instance()) {} int init(afb_api_t api); + void setEventHook(const char *event, const event_hook_func f); + void onEvent(afb_api_t api, const char *event, struct json_object *object); +private: + std::unordered_map<std::string, std::list<event_hook_func>> event_hook_list; }; /** @@ -67,8 +73,80 @@ int hs_instance::init(afb_api_t api) return 0; } +/** + * set event hook + * + * #### Parameters + * - event : event name + * - f : hook function + * + * #### Return + * Nothing + */ +void hs_instance::setEventHook(const char *event, const event_hook_func f) +{ + if(event == nullptr || f == nullptr) { + AFB_WARNING("argument is null."); + return; + } + + std::string ev(event); + auto it = event_hook_list.find(ev); + if(it != event_hook_list.end()) { + it->second.push_back(f); + } + else { + std::list<event_hook_func> l; + l.push_back(f); + event_hook_list[ev] = std::move(l); + } +} + +/** + * onEvent function + * + * #### Parameters + * - api : the api serving the request + * - event : event name + * - object : event json object + * + * #### Return + * Nothing + */ +void hs_instance::onEvent(afb_api_t api, const char *event, struct json_object *object) +{ + std::string ev(event); + auto it = event_hook_list.find(ev); + if(it != event_hook_list.end()) { + for(auto &ref : it->second) { + if(ref(api, event, object)) + break; + } + } +} + static struct hs_instance *g_hs_instance; +/** + * set event hook + * + * #### Parameters + * - event : event name + * - f : hook function pointer + * + * #### Return + * Nothing + */ +void setEventHook(const char *event, const event_hook_func f) +{ + if(g_hs_instance == nullptr) { + AFB_ERROR("g_hs_instance is null."); + return; + } + + g_hs_instance->setEventHook(event, f); +} + /* ********** Method of HomeScreen Service (API) ********** */ @@ -491,8 +569,8 @@ static int init(afb_api_t api) */ static void onevent(afb_api_t api, const char *event, struct json_object *object) { - AFB_DEBUG("on_event %s", event); - g_hs_instance->app_info->onEvent(api, event, object); + AFB_INFO("on_event %s", event); + g_hs_instance->onEvent(api, event, object); } const afb_binding_t afbBindingExport = { |