From: Ji-hoon Lee Date: Thu, 17 Aug 2017 11:16:50 +0000 (+0900) Subject: Add timer to process accumulated partial messages X-Git-Tag: submit/tizen_3.0/20171025.071119~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c5205b8b932036af6fbedaa496e9af8cc6006db0;p=platform%2Fcore%2Fuifw%2Flibscl-core.git Add timer to process accumulated partial messages Change-Id: Ib56d705695705923a2849d269c58e70970862e30 --- diff --git a/src/legacy_support/websocket.cpp b/src/legacy_support/websocket.cpp index 33d0c81..4a01f12 100644 --- a/src/legacy_support/websocket.cpp +++ b/src/legacy_support/websocket.cpp @@ -174,6 +174,68 @@ int test_client_connection(void) return 0; } +static Ecore_Timer *g_flush_server_recv_buffer_timer = NULL; +static std::string server_recv_buffer; +static Eina_Bool flush_server_recv_buffer_func(void *user) +{ + LOGD(""); + CWebHelperAgentWebSocket *agent = CWebHelperAgentWebSocket::get_current_instance(); + struct per_session_data__keyboard *pss = (struct per_session_data__keyboard *)user; + + if (g_flush_server_recv_buffer_timer) + ecore_timer_del(g_flush_server_recv_buffer_timer); + g_flush_server_recv_buffer_timer = NULL; + + if (!agent || !pss) return ECORE_CALLBACK_CANCEL; + + pthread_mutex_lock(&g_ws_server_mutex); + ISE_MESSAGE message = CISEMessageSerializer::deserialize(server_recv_buffer); + server_recv_buffer.clear(); + pthread_mutex_unlock(&g_ws_server_mutex); + + if (message.command.compare(ISE_MESSAGE_COMMAND_STRINGS[ISE_MESSAGE_COMMAND_LOGIN]) == 0) { + /* + if (message.values.at(0).compare(CMagicKeyManager::get_magic_key()) == 0) { + LOGD("LOGIN successful, validating client"); + pss->valid = true; + } else { + LOGD("LOGIN failed, invalidating client"); + pss->valid = false; + } + */ + pss->valid = true; + + if (agent->initalized()) { + pss->need_init = true; + lws_callback_on_writable_all_protocol(g_ws_server_context, &protocols[PROTOCOL_KEYBOARD]); + } + } + + /* Ignore valid check since the magic key is not used anymore */ + if (!pss->valid) pss->valid = true; + + if (pss->valid) { + pthread_mutex_lock(&g_ws_server_mutex); + std::queue& messages = agent->get_recv_message_queue(); + messages.push(message); + pthread_mutex_unlock(&g_ws_server_mutex); + + const char *recved_message = "recved"; + ecore_pipe_write(agent->get_recv_message_pipe(), recved_message, strlen(recved_message)); + + /* If we received reply message, let's send signal to wake up our main thread */ + if (message.type.compare(ISE_MESSAGE_TYPE_STRINGS[ISE_MESSAGE_TYPE_REPLY]) == 0) { + pthread_mutex_lock(&g_ws_query_mutex); + pthread_cond_signal(&g_ws_query_condition); + pthread_mutex_unlock(&g_ws_query_mutex); + } + } else { + LOGD("Ignoring data received since client is not valid %d", pss->session_id); + } + + return ECORE_CALLBACK_CANCEL; +} + static int callback_keyboard(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) @@ -262,48 +324,20 @@ static int callback_keyboard(struct lws *wsi, case LWS_CALLBACK_RECEIVE: if (in) { - std::string str = (const char *)in; - ISE_MESSAGE message = CISEMessageSerializer::deserialize(str); + if (g_flush_server_recv_buffer_timer) + ecore_timer_del(g_flush_server_recv_buffer_timer); - if (message.command.compare(ISE_MESSAGE_COMMAND_STRINGS[ISE_MESSAGE_COMMAND_LOGIN]) == 0) { - /* - if (message.values.at(0).compare(CMagicKeyManager::get_magic_key()) == 0) { - LOGD("LOGIN successful, validating client"); - pss->valid = true; - } else { - LOGD("LOGIN failed, invalidating client"); - pss->valid = false; - } - */ - pss->valid = true; - - if (agent->initalized()) { - pss->need_init = true; - lws_callback_on_writable_all_protocol(g_ws_server_context, &protocols[PROTOCOL_KEYBOARD]); - } + std::string str = (const char *)in; + if (CISEMessageSerializer::valid(str)) { + LOGD("A valid new message received, flush previous buffer"); + flush_server_recv_buffer_func((void*)pss); } - /* Ignore valid check since the magic key is not used anymore */ - if (!pss->valid) pss->valid = true; - - if (pss->valid) { - pthread_mutex_lock(&g_ws_server_mutex); - std::queue& messages = agent->get_recv_message_queue(); - messages.push(message); - pthread_mutex_unlock(&g_ws_server_mutex); + pthread_mutex_lock(&g_ws_server_mutex); + server_recv_buffer += str; + pthread_mutex_unlock(&g_ws_server_mutex); - const char *recved_message = "recved"; - ecore_pipe_write(agent->get_recv_message_pipe(), recved_message, strlen(recved_message)); - - /* If we received reply message, let's send signal to wake up our main thread */ - if (message.type.compare(ISE_MESSAGE_TYPE_STRINGS[ISE_MESSAGE_TYPE_REPLY]) == 0) { - pthread_mutex_lock(&g_ws_query_mutex); - pthread_cond_signal(&g_ws_query_condition); - pthread_mutex_unlock(&g_ws_query_mutex); - } - } else { - LOGD("Ignoring data received since client is not valid %d", pss->session_id); - } + g_flush_server_recv_buffer_timer = ecore_timer_add(0.05, flush_server_recv_buffer_func, (void*)pss); } break; @@ -429,6 +463,10 @@ bool CWebHelperAgentWebSocket::init() bool CWebHelperAgentWebSocket::exit() { + if (g_flush_server_recv_buffer_timer) + ecore_timer_del(g_flush_server_recv_buffer_timer); + g_flush_server_recv_buffer_timer = NULL; + on_exit(); g_ws_server_exit = true; diff --git a/src/legacy_support/websocket.h b/src/legacy_support/websocket.h index 1e86416..03e8b5d 100644 --- a/src/legacy_support/websocket.h +++ b/src/legacy_support/websocket.h @@ -33,6 +33,8 @@ typedef enum { ISE_MESSAGE_TYPE_PLAIN, ISE_MESSAGE_TYPE_QUERY, ISE_MESSAGE_TYPE_REPLY, + + ISE_MESSAGE_TYPES_NUM, } ISE_MESSAGE_TYPES; const std::string ISE_MESSAGE_TYPE_STRINGS[] = { @@ -91,7 +93,7 @@ const std::string ISE_MESSAGE_COMMAND_STRINGS[] = { "set_rotation", // ISE_MESSAGE_COMMAND_SET_ROTATION, "update_cursor_position", // ISE_MESSAGE_COMMAND_UPDATE_CURSOR_POSITION, "update_surrounding_text", // ISE_MESSAGE_COMMAND_UPDATE_SURROUNDING_TEXT, - "update_selection", // ISE_MESSAGE_COMMAND_UPDATE_SURROUNDING_TEXT, + "update_selection", // ISE_MESSAGE_COMMAND_UPDATE_SELECTION "set_language", // ISE_MESSAGE_COMMAND_SET_LANGUAGE, "set_imdata", // ISE_MESSAGE_COMMAND_SET_IMDATA, "get_imdata", // ISE_MESSAGE_COMMAND_GET_IMDATA, @@ -195,6 +197,30 @@ public: } return ret; } + + static bool valid(std::string str) + { + int loop; + + bool valid_type = false; + bool valid_command = false; + + ISE_MESSAGE message; + message = deserialize(str); + + for (loop = 0;!valid_type && loop < ISE_MESSAGE_TYPES_NUM;loop++) { + if (message.type.compare(ISE_MESSAGE_TYPE_STRINGS[loop]) == 0) { + valid_type = true; + } + } + for (loop = 0;!valid_command && loop < ISE_MESSAGE_COMMANDS_NUM;loop++) { + if (message.command.compare(ISE_MESSAGE_COMMAND_STRINGS[loop]) == 0) { + valid_command = true; + } + } + + return (valid_type && valid_command); + } }; class CWebHelperAgentWebSocket : public CWebHelperAgent { diff --git a/src/sclconnection-isf.cpp b/src/sclconnection-isf.cpp index 612f2db..5498ae1 100644 --- a/src/sclconnection-isf.cpp +++ b/src/sclconnection-isf.cpp @@ -191,6 +191,7 @@ static void slot_ise_show(const scim::HelperAgent *agent, int ic, char *buf, siz #ifdef WEBSOCKET g_websocket.on_set_layout(ise_context.layout); + g_websocket.on_update_cursor_position(ic, ise_context.cursor_pos); g_websocket.on_show(ic); #endif }