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/hs-appinfo.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/hs-appinfo.cpp')
-rw-r--r-- | src/hs-appinfo.cpp | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/src/hs-appinfo.cpp b/src/hs-appinfo.cpp index 700594f..6b22265 100644 --- a/src/hs-appinfo.cpp +++ b/src/hs-appinfo.cpp @@ -17,6 +17,7 @@ #include <unistd.h> #include <cstring> #include "hs-appinfo.h" +#include "hs-helper.h" #include "hs-clientmanager.h" #define RETRY_CNT 10 @@ -31,6 +32,28 @@ const char _keyStart[] = "start"; const char _keyApplistChanged[] = "application-list-changed"; HS_AppInfo* HS_AppInfo::me = nullptr; +const std::unordered_map<std::string, HS_AppInfo::func_handler> HS_AppInfo::concerned_event_list { + {"afm-main/application-list-changed", &HS_AppInfo::updateAppDetailList} +}; + + +/** + * event hook function + * + * #### Parameters + * - api : the api serving the request + * - event : event name + * - object : event json object + * + * #### Return + * 0 : continue transfer + * 1 : blocked + * + */ +static int eventHandler(afb_api_t api, const char *event, struct json_object *object) +{ + return HS_AppInfo::instance()->onEvent(api, event, object); +} /** * get application property function @@ -125,6 +148,10 @@ int HS_AppInfo::init(afb_api_t api) usleep(100000); // 100ms } while(1); + for(auto &ref : concerned_event_list) { + setEventHook(ref.first.c_str(), eventHandler); + } + return 0; } @@ -137,16 +164,17 @@ int HS_AppInfo::init(afb_api_t api) * - object : event json object * * #### Return - * None - * + * 0 : continue transfer + * 1 : blocked */ -void HS_AppInfo::onEvent(afb_api_t api, const char *event, struct json_object *object) +int HS_AppInfo::onEvent(afb_api_t api, const char *event, struct json_object *object) { + int ret = 0; auto ip = concerned_event_list.find(std::string(event)); if(ip != concerned_event_list.end()) { - AFB_INFO("[%s] event received.", event); - (this->*(ip->second))(api, object); + ret = (this->*(ip->second))(api, object); } + return ret; } /** @@ -182,29 +210,30 @@ void HS_AppInfo::createAppDetailList(struct json_object *object) * - object : the detail of all applications * * #### Return - * None + * 0 : continue transfer + * 1 : blocked * */ -void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object) +int HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object) { AFB_DEBUG("update:%s", json_object_to_json_string(object)); if(json_object_get_type(object) != json_type_object) { AFB_ERROR("input detail object error."); - return; + return 1; } struct json_object *obj_oper, *obj_data; if(json_object_object_get_ex(object, _keyOperation, &obj_oper) == 0 || json_object_object_get_ex(object, _keyData, &obj_data) == 0) { AFB_ERROR("can't find key=%s, %s.", _keyOperation, _keyData); - return; + return 1; } std::string id = json_object_get_string(obj_data); std::string appid = id2appid(id); if(isPeripheryApp(appid.c_str())) { AFB_INFO( "install/uninstall application is periphery."); - return; + return 1; } std::string oper = json_object_get_string(obj_oper); @@ -216,7 +245,7 @@ void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object) if(j_found == nullptr) { AFB_INFO( "installed application isn't runnables."); json_object_put(j_runnable); - return; + return 1; } addAppDetail(j_found); pushAppListChangedEvent(_keyInstall, j_found); @@ -230,7 +259,7 @@ void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object) std::string appid_checked = checkAppId(appid); if(appid_checked.empty()) { AFB_INFO("uninstalled application isn't in runnables list, appid=%s.", appid.c_str()); - return; + return 1; } pushAppListChangedEvent(_keyUninstall, obj_data); removeAppDetail(appid); @@ -238,6 +267,7 @@ void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object) else { AFB_ERROR("operation error."); } + return 1; } /** |