Fix message conflicts problem 55/49755/1
authorLi Zhang <li2012.zhang@samsung.com>
Sat, 10 Oct 2015 12:50:38 +0000 (20:50 +0800)
committerJihoon Kim <jihoon48.kim@samsung.com>
Tue, 20 Oct 2015 04:59:28 +0000 (13:59 +0900)
Change-Id: I9e627cc14e4cde8a847ff1cc001146ee2d275c00
Signed-off-by: Li Zhang <li2012.zhang@samsung.com>
ism/modules/frontend/scim_socket_frontend.cpp
ism/modules/frontend/scim_socket_frontend.h
ism/modules/imengine/scim_socket_imengine.cpp
ism/src/scim_transaction.cpp
ism/src/scim_transaction.h

index 303fdaf..ac504ba 100644 (file)
@@ -323,6 +323,7 @@ SocketFrontEnd::SocketFrontEnd (const BackEndPointer &backend,
                                 const ConfigPointer  &config)
     : FrontEndBase (backend),
       m_config (config),
+      m_continue_mark (STATUS_NONE),
       m_stay (true),
       m_config_readonly (false),
       m_socket_timeout (scim_get_default_socket_timeout ()),
@@ -549,10 +550,30 @@ SocketFrontEnd::get_surrounding_text (int id, WideString &text, int &cursor, int
         if (maxlen_before < 0) maxlen_before = -1;
         if (maxlen_after < 0) maxlen_after = -1;
         Socket socket_client (m_current_socket_client);
-        if ( m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN) {
+        if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN) {
             m_send_trans.put_command (ISM_TRANS_CMD_TRANSACTION_CONTINUE);
             m_send_trans.write_to_socket (socket_client);
             cont = true;
+            /**
+             * After flushing transaction to APP, frontend maybe receives some Requests,
+             * receive and deal with this Requests until get ISM_TRANS_CMD_TRANSACTION_CONTINUE reply
+             */
+            while (true) {
+                /**
+                 * socket_receive_callback() will overwrite m_receive_trans,
+                 * but in previous frame of stack, m_receive_trans has not finished reading,
+                 */
+                Transaction _tran;
+                _tran = m_receive_trans;
+                m_continue_mark = STATUS_NONE;
+                socket_receive_callback (&m_socket_server, socket_client);
+                m_receive_trans = _tran;
+                ContinueMark status = get_continue_mark ();
+                if (status == STATUS_DISCONNECT)
+                    return false;
+                else if (status == STATUS_CONTINUE)
+                    break;
+            }
         }
 
         m_temp_trans.clear ();
@@ -593,45 +614,13 @@ SocketFrontEnd::get_surrounding_text (int id, WideString &text, int &cursor, int
 bool
 SocketFrontEnd::delete_surrounding_text (int id, int offset, int len)
 {
-    bool ret = false;
     if (m_current_instance == id && m_current_socket_client >= 0 && len > 0) {
-        bool cont = false;
-
-        Socket socket_client (m_current_socket_client);
-        if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN) {
-            m_send_trans.put_command (ISM_TRANS_CMD_TRANSACTION_CONTINUE);
-            m_send_trans.write_to_socket (socket_client);
-            cont = true;
-        }
-        m_temp_trans.clear ();
-        m_temp_trans.put_command (SCIM_TRANS_CMD_REPLY);
-        m_temp_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
-        m_temp_trans.put_data ((uint32) offset);
-        m_temp_trans.put_data ((uint32) len);
-
-        if (m_temp_trans.write_to_socket (socket_client) &&
-            m_temp_trans.read_from_socket (socket_client, m_socket_timeout)) {
-
-            int cmd;
-            uint32 key;
-
-            if (m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST &&
-                m_temp_trans.get_data (key) && key == m_current_socket_client_key &&
-                m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT &&
-                m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
-                ret = true;
-        }
-        if (cont) {
-            int cmd;
-            m_send_trans.clear ();
-            m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
-
-            // Move the read ptr to the end.
-            if (!m_send_trans.get_command (cmd))
-                SCIM_DEBUG_FRONTEND (1) << __func__ << " Get command is failed!!!\n";
-        }
+        m_send_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
+        m_send_trans.put_data ((uint32) offset);
+        m_send_trans.put_data ((uint32) len);
+        return true;
     }
-    return ret;
+    return false;
 }
 
 bool
@@ -643,10 +632,22 @@ SocketFrontEnd::get_selection (int id, WideString &text)
     if (m_current_instance == id && m_current_socket_client >= 0) {
         bool cont = false;
         Socket socket_client (m_current_socket_client);
-        if ( m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN) {
+        if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN) {
             m_send_trans.put_command (ISM_TRANS_CMD_TRANSACTION_CONTINUE);
             m_send_trans.write_to_socket (socket_client);
             cont = true;
+            while (true) {
+                Transaction _tran;
+                _tran = m_receive_trans;
+                m_continue_mark = STATUS_NONE;
+                socket_receive_callback (&m_socket_server, socket_client);
+                m_receive_trans = _tran;
+                ContinueMark status = get_continue_mark ();
+                if (status == STATUS_DISCONNECT)
+                    return false;
+                else if (status == STATUS_CONTINUE)
+                    break;
+            }
         }
 
         m_temp_trans.clear ();
@@ -683,45 +684,13 @@ SocketFrontEnd::get_selection (int id, WideString &text)
 bool
 SocketFrontEnd::set_selection (int id, int start, int end)
 {
-    bool ret = false;
     if (m_current_instance == id && m_current_socket_client >= 0) {
-        bool cont = false;
-
-        Socket socket_client (m_current_socket_client);
-        if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN) {
-            m_send_trans.put_command (ISM_TRANS_CMD_TRANSACTION_CONTINUE);
-            m_send_trans.write_to_socket (socket_client);
-            cont = true;
-        }
-        m_temp_trans.clear ();
-        m_temp_trans.put_command (SCIM_TRANS_CMD_REPLY);
-        m_temp_trans.put_command (SCIM_TRANS_CMD_SET_SELECTION);
-        m_temp_trans.put_data ((uint32) start);
-        m_temp_trans.put_data ((uint32) end);
-
-        if (m_temp_trans.write_to_socket (socket_client) &&
-            m_temp_trans.read_from_socket (socket_client, m_socket_timeout)) {
-
-            int cmd;
-            uint32 key;
-
-            if (m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST &&
-                m_temp_trans.get_data (key) && key == m_current_socket_client_key &&
-                m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_SET_SELECTION &&
-                m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
-                ret = true;
-        }
-        if (cont) {
-            int cmd;
-            m_send_trans.clear ();
-            m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
-
-            // Move the read ptr to the end.
-            if (!m_send_trans.get_command (cmd))
-                SCIM_DEBUG_FRONTEND (1) << __func__ << " Get command is failed!!!\n";
-        }
+        m_send_trans.put_command (SCIM_TRANS_CMD_SET_SELECTION);
+        m_send_trans.put_data ((uint32) start);
+        m_send_trans.put_data ((uint32) end);
+        return true;
     }
-    return ret;
+    return false;
 }
 
 void
@@ -876,6 +845,14 @@ SocketFrontEnd::generate_key () const
     return (uint32)rand_r (&seed);
 }
 
+SocketFrontEnd::ContinueMark
+SocketFrontEnd::get_continue_mark()
+{
+    ContinueMark _is_continue = m_continue_mark;
+    m_continue_mark = STATUS_NONE;
+    return _is_continue;
+}
+
 bool
 SocketFrontEnd::check_client_connection (const Socket &client) const
 {
@@ -937,6 +914,7 @@ SocketFrontEnd::socket_receive_callback (SocketServer *server, const Socket &cli
     if (!check_client_connection (client)) {
         SCIM_DEBUG_FRONTEND (2) << " closing client connection.\n";
         socket_close_connection (server, client);
+        m_continue_mark = STATUS_DISCONNECT;
         return;
     }
 
@@ -968,7 +946,11 @@ SocketFrontEnd::socket_receive_callback (SocketServer *server, const Socket &cli
         return;
 
     while (m_receive_trans.get_command (cmd)) {
-        if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT)
+        if (cmd == ISM_TRANS_CMD_TRANSACTION_CONTINUE) {
+            m_continue_mark = STATUS_CONTINUE;
+            return;
+        }
+        else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT)
             socket_process_key_event (id);
         else if (cmd == SCIM_TRANS_CMD_MOVE_PREEDIT_CARET)
             socket_move_preedit_caret (id);
index 0a1ea4d..097b054 100644 (file)
@@ -66,6 +66,12 @@ class EXAPI SocketFrontEnd : public FrontEndBase
         Ecore_Fd_Handler *handler;
     };
 
+    enum ContinueMark {
+        STATUS_NONE,
+        STATUS_CONTINUE,
+        STATUS_DISCONNECT
+    };
+
     /**
      * ::first = socket id, ::second = instance id.
      */
@@ -87,6 +93,7 @@ class EXAPI SocketFrontEnd : public FrontEndBase
     Transaction       m_send_trans;
     Transaction       m_receive_trans;
     Transaction       m_temp_trans;
+    ContinueMark      m_continue_mark;
 
     SocketInstanceRepository m_socket_instance_repository;
 
@@ -168,6 +175,7 @@ private:
     void unregister_helper ();
 
     uint32 generate_key () const;
+    ContinueMark get_continue_mark();
 
     bool check_client_connection (const Socket &client) const;
 
index 018c74e..c4ab426 100644 (file)
@@ -1228,19 +1228,9 @@ SocketInstance::do_transaction (Transaction &trans, bool &ret)
                 {
                     uint32 offset;
                     uint32 len;
-                    Transaction temp_trans;
                     if (trans.get_data (offset) && trans.get_data (len)) {
-                        global->init_transaction (temp_trans);
-                        if (delete_surrounding_text ((int) offset, (int) len)) {
-                            temp_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
-                            temp_trans.put_command (SCIM_TRANS_CMD_OK);
-                        } else {
-                            temp_trans.put_command (SCIM_TRANS_CMD_FAIL);
-                        }
-                        if (!global->send_transaction (temp_trans))
-                            std::cerr << "DELETE_SURROUNDING_TEXT: global->send_transaction () is failed!!!\n";
+                        delete_surrounding_text ((int) offset, (int) len);
                     }
-                    cont = true;
                     break;
                 }
                 case SCIM_TRANS_CMD_GET_SELECTION:
@@ -1265,19 +1255,9 @@ SocketInstance::do_transaction (Transaction &trans, bool &ret)
                 {
                     uint32 start;
                     uint32 end;
-                    Transaction temp_trans;
                     if (trans.get_data (start) && trans.get_data (end)) {
-                        global->init_transaction (temp_trans);
-                        if (set_selection ((int) start, (int) end)) {
-                            temp_trans.put_command (SCIM_TRANS_CMD_SET_SELECTION);
-                            temp_trans.put_command (SCIM_TRANS_CMD_OK);
-                        } else {
-                            temp_trans.put_command (SCIM_TRANS_CMD_FAIL);
-                        }
-                        if (!global->send_transaction (temp_trans))
-                            std::cerr << "SET_SELECTION: global->send_transaction () is failed!!!\n";
+                        set_selection ((int) start, (int) end);
                     }
-                    cont = true;
                     break;
                 }
                 case SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND:
@@ -1310,6 +1290,11 @@ SocketInstance::do_transaction (Transaction &trans, bool &ret)
                 }
                 case ISM_TRANS_CMD_TRANSACTION_CONTINUE:
                 {
+                    Transaction temp_trans;
+                    global->init_transaction (temp_trans);
+                    temp_trans.put_command (ISM_TRANS_CMD_TRANSACTION_CONTINUE);
+                    if (!global->send_transaction (temp_trans))
+                        std::cerr << "TRANSACTION_CONTINUE: global->send_transaction () is failed!!!\n";
                     cont = true;
                     break;
                 }
index 271ab54..97a3ff7 100644 (file)
@@ -170,6 +170,16 @@ Transaction::Transaction (size_t bufsize)
     m_reader->attach (*this);
 }
 
+const Transaction &
+Transaction::operator = (const Transaction & _tran)
+{
+    m_holder->request_buffer_size (_tran.get_size());
+    _tran.write_to_buffer (m_holder->m_buffer,_tran.get_size());
+    m_holder->m_write_pos = _tran.get_size ();
+    m_reader->set_position (_tran.m_reader->get_position ());
+    return *this;
+}
+
 Transaction::~Transaction ()
 {
     delete m_reader;
@@ -305,7 +315,7 @@ Transaction::read_from_buffer (const void *buf, size_t bufsize)
 
         memcpy (m_holder->m_buffer, buf, size);
 
-        m_holder->m_write_pos = SCIM_TRANS_HEADER_SIZE;
+        m_holder->m_write_pos = SCIM_TRANS_HEADER_SIZE + size;
 #ifdef ENABLE_CHECKMSG
         if (checksum == m_holder->calc_checksum ())
             return true;
@@ -1517,6 +1527,21 @@ TransactionReader::dump ()
     m_impl->dump ();
 }
 
+size_t
+TransactionReader::get_position()
+{
+    return m_impl->m_read_pos;
+}
+
+void
+TransactionReader::set_position(size_t pos)
+{
+    if (pos > m_impl->m_holder->m_write_pos)
+        m_impl->m_read_pos = m_impl->m_holder->m_write_pos;
+    else
+        m_impl->m_read_pos = pos;
+}
+
 } // namespace scim
 
 /*
index 2af296b..2427eb2 100644 (file)
@@ -94,7 +94,6 @@ class EXAPI Transaction
     TransactionReader * m_reader;
 
     Transaction (const Transaction &);
-    const Transaction & operator = (const Transaction &);
 public:
     /**
      * @brief Constructor.
@@ -108,6 +107,8 @@ public:
      */
     ~Transaction ();
 
+    const Transaction & operator = (const Transaction &);
+
     /**
      * @brief Check if the transaction is valid.
      *
@@ -499,6 +500,18 @@ public:
      * @brief Print the read pos.
      */
     void dump ();
+
+    /**
+     * @brief Get current read position.
+     *
+     * @return The current read position.
+     */
+    size_t get_position();
+
+    /**
+     * @brief Set a position to read.
+     */
+    void set_position(size_t pos);
 };
 
 /** @} */