From f16e0728c0c9806d9a7c3766028428ed73b5a8cf Mon Sep 17 00:00:00 2001 From: wang_zhiqiang Date: Fri, 19 Apr 2019 16:27:49 +0800 Subject: recover application Change-Id: I02330f9c9336609ce585ab172211acada68fba9c --- src/homescreen.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 15 deletions(-) (limited to 'src/homescreen.cpp') diff --git a/src/homescreen.cpp b/src/homescreen.cpp index 3e4ff8f..cb8a633 100644 --- a/src/homescreen.cpp +++ b/src/homescreen.cpp @@ -17,6 +17,7 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include #include #include #include @@ -25,7 +26,8 @@ #include "hs-clientmanager.h" #include "hs-appinfo.h" #include "hs-config.h" -#include +#include "hs-apprecover.h" + const char _error[] = "error"; @@ -37,7 +39,7 @@ const char _keyId[] = "id"; struct hs_handshake { hs_handshake(int times, int sleep) : m_times(times), m_sleep(sleep) {} - void start(afb_api_t api) const; + int start(afb_api_t api) const; enum HandshakeStatus { Handshake_Idle = 0, @@ -56,6 +58,18 @@ private: int hs_handshake::hs_sts = hs_handshake::Handshake_Idle; +/** + * handshake callback function + * + * #### Parameters + * - obj : reply json object + * - error : api_call error + * - info : api_call information + * + * #### Return + * None + * + */ void handshake_subscribe_callback(struct json_object *obj, const char *error, const char *info) { if(error == nullptr) { @@ -66,14 +80,39 @@ void handshake_subscribe_callback(struct json_object *obj, const char *error, co } } +/** + * handshake event function + * + * #### Parameters + * - api : the api + * - event : received event name + * - object : received json object + * + * #### Return + * 0 : event can transfer to others + * 1 : event not transfer to others + */ int on_handshake_event(afb_api_t api, const char *event, struct json_object *object) { hs_handshake::hs_sts = hs_handshake::Handshake_Over; return 1; } -void hs_handshake::start(afb_api_t api) const +/** + * start handshake function + * + * #### Parameters + * - api : the api + * + * #### Return + * None + * 0 : handshake success + * -1 : handshake fail + * + */ +int hs_handshake::start(afb_api_t api) const { + int ret = -1; setEventHook(sub_event.c_str(), on_handshake_event); int count = 0; do { @@ -81,19 +120,21 @@ void hs_handshake::start(afb_api_t api) const if(hs_handshake::hs_sts == hs_handshake::Handshake_Idle || hs_handshake::hs_sts == hs_handshake::Handshake_Subscribe_Fail) { hs_handshake::hs_sts = Handshake_Subscribing; - HS_WmProxy *wm_proxy = new HS_WmProxy(); - wm_proxy->subscribe(api, HS_WmProxy::Event_Handshake, handshake_subscribe_callback); + HS_WmProxy wm_proxy; + wm_proxy.subscribe(api, HS_WmProxy::Event_Handshake, handshake_subscribe_callback); } // wait handshake event if(hs_handshake::hs_sts == hs_handshake::Handshake_Over) { + ret = 0; break; } ++count; usleep(m_sleep*1000); } while(count < m_times); - AFB_WARNING("wait count is %d.", count); + + return ret; } struct hs_instance { @@ -108,6 +149,8 @@ private: std::unordered_map> event_hook_list; }; +static struct hs_instance *g_hs_instance; + /** * init function * @@ -139,12 +182,20 @@ int hs_instance::init(afb_api_t api) return -1; } - // const struct handshake_info *h = hs_config.getHandshakeInfo(); - // struct hs_handshake handshake(h->times, h->sleep); - // handshake.start(api); - - // recover application + const struct handshake_info *h = hs_config.getHandshakeInfo(); + struct hs_handshake handshake(h->times, h->sleep); + if(handshake.start(api) < 0) { + AFB_ERROR("handshake with windowmanager failed."); + return -1; + } + HS_AppRecover *app_recover = new HS_AppRecover(); + if(app_recover == nullptr) { + AFB_ERROR("app_recover is nullptr."); + return -1; + } + app_recover->startRecovery(api, hs_config.getRecoverMap()); + client_manager->setAppRecover(app_recover); return 0; } @@ -201,8 +252,6 @@ void hs_instance::onEvent(afb_api_t api, const char *event, struct json_object * } } -static struct hs_instance *g_hs_instance; - /** * set event hook * @@ -258,7 +307,7 @@ static void tap_shortcut (afb_req_t request) if(ret == AFB_REQ_NOT_STARTED_APPLICATION) { std::string id = g_hs_instance->app_info->getAppProperty(value, _keyId); HS_AfmMainProxy afm_proxy; - afm_proxy.start(request, id); + afm_proxy.start(request->api, id); ret = 0; } } @@ -415,7 +464,7 @@ static void showWindow(afb_req_t request) if(ret == AFB_REQ_NOT_STARTED_APPLICATION) { std::string id = g_hs_instance->app_info->getAppProperty(value, _keyId); HS_AfmMainProxy afm_proxy; - afm_proxy.start(request, id); + afm_proxy.start(request->api, id); ret = 0; } } -- cgit 1.2.3-korg