diff options
-rw-r--r-- | src/homescreen.cpp | 82 | ||||
-rw-r--r-- | src/hs-appinfo.cpp | 54 | ||||
-rw-r--r-- | src/hs-appinfo.h | 10 | ||||
-rw-r--r-- | src/hs-helper.h | 3 |
4 files changed, 129 insertions, 20 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 = { 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; } /** diff --git a/src/hs-appinfo.h b/src/hs-appinfo.h index 7747f52..3355686 100644 --- a/src/hs-appinfo.h +++ b/src/hs-appinfo.h @@ -47,14 +47,14 @@ public: static HS_AppInfo* instance(void); int init(afb_api_t api); - void onEvent(afb_api_t api, const char *event, struct json_object *object); + int onEvent(afb_api_t api, const char *event, struct json_object *object); void getRunnables(struct json_object **object); std::string getAppProperty(const std::string appid, std::string key) const; std::string checkAppId(const std::string &appid); private: - void updateAppDetailList(afb_api_t api, struct json_object *object); + int updateAppDetailList(afb_api_t api, struct json_object *object); void createAppDetailList(struct json_object *object); std::string parseAppDetail(struct json_object *object, AppDetail &info) const; void addAppDetail(struct json_object *object); @@ -72,10 +72,8 @@ private: "restriction" }; - typedef void (HS_AppInfo::*func_handler)(afb_api_t, struct json_object*); - const std::unordered_map<std::string, func_handler> concerned_event_list { - {"afm-main/application-list-changed", &HS_AppInfo::updateAppDetailList} - }; + typedef int (HS_AppInfo::*func_handler)(afb_api_t, struct json_object*); + static const std::unordered_map<std::string, func_handler> concerned_event_list; private: static HS_AppInfo* me; diff --git a/src/hs-helper.h b/src/hs-helper.h index cc6fb89..f57799d 100644 --- a/src/hs-helper.h +++ b/src/hs-helper.h @@ -54,4 +54,7 @@ void hs_add_object_to_json_object_func(struct json_object* j_obj, const char* ve int hs_search_event_name_index(const char* value); std::string get_application_id(const afb_req_t request); +typedef int (*event_hook_func)(afb_api_t api, const char *event, struct json_object *object); +void setEventHook(const char *event, const event_hook_func f); + #endif /*HOMESCREEN_HELPER_H*/ |