X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fhs-appinfo.cpp;h=62746706ac9df42ab42416d3dba189913ee536ce;hb=a7e49d93b4dd03f8ce3b77f831f9293ba5a3de01;hp=1d1d48c2e6ed50740ba43e4f66ae2baf6bfe9959;hpb=2f7789558c98d8b79b41d62ac97f5bd6de557dc9;p=apps%2Fagl-service-homescreen.git diff --git a/src/hs-appinfo.cpp b/src/hs-appinfo.cpp index 1d1d48c..6274670 100644 --- a/src/hs-appinfo.cpp +++ b/src/hs-appinfo.cpp @@ -17,6 +17,7 @@ #include #include #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 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; } /**