From 8f0e20df04e0e6826adc425519840b56d6169404 Mon Sep 17 00:00:00 2001 From: wang_zhiqiang Date: Wed, 29 May 2019 13:04:54 +0800 Subject: [PATCH] add handshake loop Change-Id: I5fb4e2973d2d9fa00a9956ac4110577db7f7bcae --- src/homescreen.cpp | 47 ++++++++++++++++++++++++++++++++--------------- src/hs-apprecover.cpp | 5 +++-- src/hs-apprecover.h | 4 +++- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/homescreen.cpp b/src/homescreen.cpp index 56c1e7c..b3980b2 100644 --- a/src/homescreen.cpp +++ b/src/homescreen.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "hs-helper.h" #include "hs-clientmanager.h" #include "hs-appinfo.h" @@ -39,7 +40,8 @@ const char _keyId[] = "id"; struct hs_handshake { hs_handshake(int times, int sleep) : m_times(times), m_sleep(sleep) {} - int start(afb_api_t api) const; + int start(afb_api_t api); + void handshake_loop(afb_api_t api); enum HandshakeStatus { Handshake_Idle = 0, @@ -110,16 +112,32 @@ int on_handshake_event(afb_api_t api, const char *event, struct json_object *obj * - api : the api * * #### Return - * None * 0 : handshake success - * -1 : handshake fail + * other : handshake fail * */ -int hs_handshake::start(afb_api_t api) const +int hs_handshake::start(afb_api_t api) { AFB_NOTICE("start handshake with windowmanager."); - int ret = -1; setEventHook(sub_event.c_str(), on_handshake_event); + + std::thread th(&hs_handshake::handshake_loop, this, api); + th.detach(); + return 0; +} + +/** + * handshake loop + * + * #### Parameters + * - api : the api + * + * #### Return + * None + * + */ +void hs_handshake::handshake_loop(afb_api_t api) +{ int count = 0; do { // try to subscribe handshake event @@ -132,15 +150,14 @@ int hs_handshake::start(afb_api_t api) const // wait handshake event if(hs_handshake::hs_sts == hs_handshake::Handshake_Over) { - ret = 0; break; } ++count; usleep(m_sleep*1000); } while(count < m_times); - - return ret; + AFB_NOTICE("handshake over, count=%d.", count); + HS_AppRecover::instance()->startRecovery(api); } struct hs_instance { @@ -189,6 +206,13 @@ int hs_instance::init(afb_api_t api) return -1; } + if(app_recover == nullptr) { + AFB_ERROR("app_recover is nullptr."); + return -1; + } + app_recover->init(api); + app_recover->setRecoverMap(hs_config.getRecoverMap()); + const struct handshake_info *h = hs_config.getHandshakeInfo(); struct hs_handshake handshake(h->times, h->sleep); if(handshake.start(api) < 0) { @@ -196,13 +220,6 @@ int hs_instance::init(afb_api_t api) return -1; } - if(app_recover == nullptr) { - AFB_ERROR("app_recover is nullptr."); - return -1; - } - app_recover->init(api); - app_recover->startRecovery(api, hs_config.getRecoverMap()); - return 0; } diff --git a/src/hs-apprecover.cpp b/src/hs-apprecover.cpp index bd34eda..fa8d824 100644 --- a/src/hs-apprecover.cpp +++ b/src/hs-apprecover.cpp @@ -88,10 +88,10 @@ int HS_AppRecover::init(afb_api_t api) * None * */ -void HS_AppRecover::startRecovery(afb_api_t api, recover_map &map) +void HS_AppRecover::startRecovery(afb_api_t api) { for(auto &key : HS_Config::keys_recover_type) { - for(auto &m : map[key]){ + for(auto &m : recover_app_map[key]){ struct app_recover_info recover_info = { .recover_type = key, .visibility = m.visibility, @@ -120,6 +120,7 @@ void HS_AppRecover::startRecovery(afb_api_t api, recover_map &map) } } } + recover_app_map.clear(); } /** diff --git a/src/hs-apprecover.h b/src/hs-apprecover.h index b702bd9..28b0ce6 100644 --- a/src/hs-apprecover.h +++ b/src/hs-apprecover.h @@ -38,7 +38,8 @@ public: static HS_AppRecover* instance(void); int init(afb_api_t api); - void startRecovery(afb_api_t api, recover_map &map); + void setRecoverMap(recover_map &map) {recover_app_map.swap(map);} + void startRecovery(afb_api_t api); bool registerRecoveredApp(afb_api_t api, const std::string &appid); void screenUpdated(struct json_object *obj); @@ -53,6 +54,7 @@ private: std::set m_recovering_set; std::map> m_wait_recover_set; std::set m_lastmode_list; + recover_map recover_app_map; }; #endif // HOMESCREEN_APPRECOVER_H \ No newline at end of file -- 2.16.6