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 ()),
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 ();
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
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 ();
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
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
{
if (!check_client_connection (client)) {
SCIM_DEBUG_FRONTEND (2) << " closing client connection.\n";
socket_close_connection (server, client);
+ m_continue_mark = STATUS_DISCONNECT;
return;
}
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);
{
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:
{
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:
}
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;
}