X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fhs-clientmanager.cpp;h=a1472b85f754c97046a2fd1a71dfa2b0aa33f694;hb=690bef15acbffe7245b8a0b15ee4372f1ccea5d3;hp=8735c2ea935a0afe24325828303f4480193216fc;hpb=211769e800f3a57de55b3774de82af55d2a0160a;p=apps%2Fagl-service-homescreen.git diff --git a/src/hs-clientmanager.cpp b/src/hs-clientmanager.cpp index 8735c2e..a1472b8 100644 --- a/src/hs-clientmanager.cpp +++ b/src/hs-clientmanager.cpp @@ -13,11 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +#include #include #include "hs-clientmanager.h" -#include "hmi-debug.h" +#include "hs-apprecover.h" static const char _homescreen[] = "homescreen"; +static const char _area[] = "area"; +static const char _parameter[] = "parameter"; +const std::string _listen_all("all"); HS_ClientManager* HS_ClientManager::me = nullptr; @@ -70,7 +75,9 @@ HS_ClientManager* HS_ClientManager::instance(void) */ int HS_ClientManager::init(void) { - HMI_NOTICE("homescreen-service","called."); + listener_list.clear(); + std::list interface_list; + listener_list[_listen_all] = std::move(interface_list); } /** @@ -88,7 +95,7 @@ HS_ClientCtxt* HS_ClientManager::createClientCtxt(afb_req_t req, std::string app HS_ClientCtxt *ctxt = (HS_ClientCtxt *)afb_req_context_get(req); if (!ctxt) { - HMI_NOTICE("homescreen-service", "create new session for %s", appid.c_str()); + AFB_INFO( "create new session for %s", appid.c_str()); HS_ClientCtxt *ctxt = new HS_ClientCtxt(appid.c_str()); afb_req_session_set_LOA(req, 1); afb_req_context_set(req, ctxt, cbRemoveClientCtxt); @@ -142,11 +149,11 @@ void HS_ClientManager::removeClientCtxt(void *data) HS_ClientCtxt *ctxt = (HS_ClientCtxt *)data; if(ctxt == nullptr) { - HMI_ERROR("homescreen-service", "data is nullptr"); + AFB_WARNING( "data is nullptr"); return; } - HMI_NOTICE("homescreen-service", "remove app %s", ctxt->id.c_str()); + AFB_INFO( "remove app %s", ctxt->id.c_str()); std::lock_guard lock(this->mtx); removeClient(ctxt->id); delete appid2ctxt[ctxt->id]; @@ -168,15 +175,17 @@ void HS_ClientManager::removeClientCtxt(void *data) */ int HS_ClientManager::handleRequest(afb_req_t request, const char *verb, const char *appid) { - HMI_NOTICE("homescreen-service","verb=[%s],appid=[%s].", verb, appid); + AFB_INFO("verb=[%s],appid=[%s].", verb, appid); int ret = 0; - std::lock_guard lock(this->mtx); + bool isRegisterApp = false; if(appid == nullptr) { + std::lock_guard lock(this->mtx); for(auto m : client_list) { m.second->handleRequest(request, verb); } } else { + std::lock_guard lock(this->mtx); auto ip = client_list.find(std::string(appid)); if(ip != client_list.end()) { ret = ip->second->handleRequest(request, verb); @@ -186,13 +195,17 @@ int HS_ClientManager::handleRequest(afb_req_t request, const char *verb, const c appid2ctxt[appid] = createClientCtxt(request, appid); HS_Client* client = addClient(request, appid); ret = client->handleRequest(request, "subscribe"); + isRegisterApp = true; } else { - HMI_NOTICE("homescreen-service","not exist session"); + AFB_NOTICE("not exist session"); ret = AFB_REQ_NOT_STARTED_APPLICATION; } } } + if(isRegisterApp) { + notifyListener(request->api, std::string(appid)); + } return ret; } @@ -211,8 +224,9 @@ int HS_ClientManager::handleRequest(afb_req_t request, const char *verb, const c */ int HS_ClientManager::pushEvent(const char *event, struct json_object *param, std::string appid) { + AFB_INFO("event=[%s], appid=[%s].", event, appid.c_str()); if(event == nullptr) { - HMI_ERROR("homescreen-service","event name is null."); + AFB_WARNING("event name is null."); return -1; } @@ -230,4 +244,145 @@ int HS_ClientManager::pushEvent(const char *event, struct json_object *param, st } return 0; +} + +/** + * check register application + * + * #### Parameters + * - api : the api + * - 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(); + struct json_object* json_param = json_object_new_object(); + json_object_object_add(json_param, _area, json_object_new_string(startup_area.c_str())); + pushEvent("showWindow", json_param, appid); + startup_area.clear(); + } + 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 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::notifyListener(afb_api_t api, const std::string &appid) +{ + if (checkRegisterApp(api, appid)) { + return; + } + + AFB_INFO("listen %s, notified", appid.c_str()); + std::list 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