+struct hs_handshake {
+ hs_handshake(int times, int sleep) : m_times(times), m_sleep(sleep) {}
+ void start(afb_api_t api) const;
+
+ enum HandshakeStatus {
+ Handshake_Idle = 0,
+ Handshake_Subscribing,
+ Handshake_Subscribe_Fail,
+ Handshake_WaitEvent,
+ Handshake_Over
+ };
+ static int hs_sts;
+
+private:
+ const std::string sub_event = "windowmanager/handshake";
+ const int m_times;
+ const int m_sleep;
+};
+
+int hs_handshake::hs_sts = hs_handshake::Handshake_Idle;
+
+void handshake_subscribe_callback(struct json_object *obj, const char *error, const char *info)
+{
+ if(error == nullptr) {
+ hs_handshake::hs_sts = hs_handshake::Handshake_WaitEvent;
+ }
+ else {
+ hs_handshake::hs_sts = hs_handshake::Handshake_Subscribe_Fail;
+ }
+}
+
+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
+{
+ setEventHook(sub_event.c_str(), on_handshake_event);
+ int count = 0;
+ do {
+ // try to subscribe handshake event
+ 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);
+ }
+
+ // wait handshake event
+ if(hs_handshake::hs_sts == hs_handshake::Handshake_Over) {
+ break;
+ }
+
+ ++count;
+ usleep(m_sleep*1000);
+ } while(count < m_times);
+ AFB_WARNING("wait count is %d.", count);
+}
+