diff options
Diffstat (limited to 'src/hs-clientmanager.cpp')
-rw-r--r-- | src/hs-clientmanager.cpp | 133 |
1 files changed, 125 insertions, 8 deletions
diff --git a/src/hs-clientmanager.cpp b/src/hs-clientmanager.cpp index 3585bea..d84d07b 100644 --- a/src/hs-clientmanager.cpp +++ b/src/hs-clientmanager.cpp @@ -20,6 +20,7 @@ #include "hs-apprecover.h" static const char _homescreen[] = "homescreen"; +const std::string _listen_all("all"); HS_ClientManager* HS_ClientManager::me = nullptr; @@ -72,7 +73,9 @@ HS_ClientManager* HS_ClientManager::instance(void) */ int HS_ClientManager::init(void) { - AFB_NOTICE("called."); + listener_list.clear(); + std::list<listener_interface*> interface_list; + listener_list[_listen_all] = std::move(interface_list); } /** @@ -199,7 +202,7 @@ int HS_ClientManager::handleRequest(afb_req_t request, const char *verb, const c } } if(isRegisterApp) { - checkRegisterApp(request->api, std::string(appid)); + notifyListener(request->api, std::string(appid)); } return ret; } @@ -249,18 +252,132 @@ int HS_ClientManager::pushEvent(const char *event, struct json_object *param, st * - appid : register application's id * * #### Return + * true : checked + * false : not checked + * + */ +bool HS_ClientManager::checkRegisterApp(afb_api_t api, const std::string &appid) +{ + bool ret = true; + auto &ip = listener_list[_listen_all]; + if(!ip.empty()) { + for(auto &it : ip) { + it->notify(api, appid); + } + } + else if(startup_appid == appid) { + startup_appid.clear(); + pushEvent("showWindow", nullptr, appid); + } + else { + ret = false; + } + return ret; +} + +/** + * check whether application was started + * + * #### Parameters + * - appid : application's id + * + * #### Return + * true : started + * false : not start + * + */ +bool HS_ClientManager::isAppStarted(const std::string &appid) +{ + auto it = client_list.find(appid); + return it != client_list.end() ? true : false; +} + +/** + * add app register listener + * + * #### Parameters + * - listener_interface : listener interface + * + * #### Return + * None + * + */ +void HS_ClientManager::addListener(listener_interface* listener) +{ + for (auto &it : listener->listenAppSet()) { + auto ip = listener_list.find(it); + if(ip != listener_list.end()) { + ip->second.push_back(listener); + } + else { + std::list<listener_interface*> lst; + lst.push_back(listener); + listener_list[it] = std::move(lst); + } + } +} + +/** + * remove app register listener + * + * #### Parameters + * - listener_interface : listener interface + * + * #### Return + * None + * + */ +void HS_ClientManager::removeListener(listener_interface* listener) +{ + for (auto &iter : listener->listenAppSet()) { + auto it = listener_list.find(iter); + if(it != listener_list.end()) { + auto ip = it->second.begin(); + for(; ip != it->second.end(); ++ip) { + if(listener->myUid() == (*ip)->myUid()) { + break; + } + } + it->second.erase(ip); + if(it->second.empty()) { + listener_list.erase(it->first); + } + } + } +} + +/** + * notify listener + * + * #### Parameters + * - api : the api + * - appid : register application's id + * + * #### Return * None * */ -void HS_ClientManager::checkRegisterApp(afb_api_t api, const std::string &appid) +void HS_ClientManager::notifyListener(afb_api_t api, const std::string &appid) { - if(HS_AppRecover::instance()->registerRecoveredApp(api, appid)) { - AFB_INFO("register recover application %s.", appid.c_str()); + if (checkRegisterApp(api, appid)) { return; } - if(startup_appid == appid) { - startup_appid.clear(); - pushEvent("showWindow", nullptr, appid); + AFB_INFO("listen %s, notified", appid.c_str()); + std::list<listener_interface*> interface_list; + auto ip = listener_list.find(appid); + if(ip != listener_list.end()) { + if(!ip->second.empty()) { + interface_list = ip->second; + } + else { + AFB_WARNING("listener is null."); + return; + } + } + + for(auto &it : interface_list) { + it->notify(api, appid); } + }
\ No newline at end of file |