2 * ISF(Input Service Framework)
4 * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
5 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
7 * Contact: Li Zhang <li2012.zhang@samsung.com>
9 * This library is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU Lesser General Public License as published by the
11 * Free Software Foundation; either version 2.1 of the License, or (at your option)
14 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 * License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, write to the Free Software Foundation, Inc., 51
21 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define Uses_SCIM_TRANSACTION
26 #define Uses_SCIM_TRANS_COMMANDS
27 #define Uses_SCIM_PANEL_AGENT
28 #define Uses_SCIM_HELPER
29 #define Uses_SCIM_SOCKET
30 #define Uses_SCIM_EVENT
31 #define Uses_SCIM_CONFIG
32 #define Uses_SCIM_CONFIG_MODULE
33 #define Uses_SCIM_CONFIG_PATH
34 #define Uses_SCIM_UTILITY
37 #include <sys/types.h>
38 #include <sys/times.h>
42 #include "scim_private.h"
44 #include "scim_stl_map.h"
45 #include "isf_debug.h"
50 #define LOG_TAG "ISF_ECORE_SOCKET_MODULE"
52 #define MIN_REPEAT_TIME 2.0
54 #define IMEMANAGER_PRIVILEGE "http://tizen.org/privilege/imemanager"
56 #define SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY "/Panel/Socket/ConfigReadOnly"
61 struct HelperClientStub {
65 HelperClientStub(int i = 0, int r = 0) : id(i), ref(r) { }
68 struct IMControlStub {
69 std::vector<ISE_INFO> info;
70 std::vector<int> count;
73 #define DEFAULT_CONTEXT_VALUE 0xfff
75 #define scim_module_init ecoresocket_LTX_scim_module_init
76 #define scim_module_exit ecoresocket_LTX_scim_module_exit
77 #define scim_panel_agent_module_init ecoresocket_LTX_scim_panel_agent_module_init
78 #define scim_panel_agent_module_get_instance ecoresocket_LTX_scim_panel_agent_module_get_instance
81 //==================================== PanelAgent ===========================
82 class EcoreSocketPanelAgent: public PanelAgentBase
87 String m_socket_address;
88 SocketServer m_socket_server;
90 Transaction m_send_trans;
91 Transaction m_recv_trans;
92 Transaction m_nest_trans;
94 bool m_should_shared_ise;
97 std::vector<Ecore_Fd_Handler*> _read_handler_list;
99 InfoManager* m_info_manager;
102 EcoreSocketPanelAgent()
103 : PanelAgentBase ("ecore_socket"),
104 m_should_exit(false),
105 m_socket_timeout(scim_get_default_socket_timeout()),
106 m_should_shared_ise(false),
107 m_ise_exiting(false) {
108 m_socket_server.signal_connect_accept(slot(this, &EcoreSocketPanelAgent::socket_accept_callback));
109 m_socket_server.signal_connect_receive(slot(this, &EcoreSocketPanelAgent::socket_receive_callback));
110 m_socket_server.signal_connect_exception(slot(this, &EcoreSocketPanelAgent::socket_exception_callback));
113 ~EcoreSocketPanelAgent() {
114 for (unsigned int ii = 0; ii < _read_handler_list.size(); ++ii) {
115 ecore_main_fd_handler_del(_read_handler_list[ii]);
117 _read_handler_list.clear();
120 bool initialize(InfoManager* info_manager, const String& display, bool resident) {
122 m_info_manager = info_manager;
123 m_socket_address = scim_get_default_panel_socket_address(display);
125 m_socket_server.shutdown();
127 if (m_socket_server.create(SocketAddress(m_socket_address))) {
128 Ecore_Fd_Handler* panel_agent_read_handler = NULL;
129 panel_agent_read_handler = ecore_main_fd_handler_add(get_server_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
130 _read_handler_list.push_back(panel_agent_read_handler);
133 LOGE("create server failed\n");
137 bool valid(void) const {
138 return m_socket_server.valid();
142 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
145 m_should_exit = true;
148 if (client.connect(SocketAddress(m_socket_address))) {
153 void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) {
154 LOGD ("client id:%d\n", client);
155 Socket client_socket(client);
156 m_send_trans.clear();
157 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
158 m_send_trans.put_data(context_id);
159 m_send_trans.put_command(cmd);
160 m_send_trans.put_data(nType);
161 m_send_trans.put_data(nValue);
162 m_send_trans.write_to_socket(client_socket);
165 void move_preedit_caret(int client, uint32 context_id, uint32 position) {
166 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
167 LOGD ("client id:%d\n", client);
168 Socket client_socket(client);
169 m_send_trans.clear();
170 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
171 m_send_trans.put_data((uint32) context_id);
172 m_send_trans.put_command(SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
173 m_send_trans.put_data((uint32) position);
174 m_send_trans.write_to_socket(client_socket);
179 void request_help(int client_id, uint32 context_id) {
180 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
181 LOGD ("client id:%d", client_id);
183 Socket client_socket(client_id);
184 m_send_trans.clear();
185 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
186 m_send_trans.put_data((uint32) context_id);
187 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
188 m_send_trans.write_to_socket(client_socket);
192 void request_factory_menu(int client_id, uint32 context_id) {
193 LOGD ("client id:%d", client_id);
194 Socket client_socket(client_id);
195 m_send_trans.clear();
196 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
197 m_send_trans.put_data((uint32) context_id);
198 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
199 m_send_trans.write_to_socket(client_socket);
203 void reset_keyboard_ise(int client, uint32 context_id) {
204 LOGD ("client id:%d\n", client);
205 Socket client_socket(client);
206 m_send_trans.clear();
207 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
208 m_send_trans.put_data((uint32) context_id);
209 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
210 m_send_trans.write_to_socket(client_socket);
213 void update_keyboard_ise_list(int client, uint32 context) {
214 LOGD ("client id:%d\n", client);
216 Socket client_socket(client);
217 m_send_trans.clear();
218 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
219 m_send_trans.put_data((uint32) context);
220 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
221 m_send_trans.write_to_socket(client_socket);
224 void change_factory(int client, uint32 context, const String& uuid) {
225 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
226 LOGD ("client id:%d\n", client);
228 Socket client_socket(client);
229 m_send_trans.clear();
230 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
231 m_send_trans.put_data((uint32) context);
232 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
233 m_send_trans.put_data(uuid);
234 m_send_trans.write_to_socket(client_socket);
237 void helper_candidate_show(int client, uint32 context, const String& uuid) {
238 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
239 LOGD ("client id:%d\n", client);
242 Socket client_socket(client);
244 m_send_trans.clear();
245 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
246 m_send_trans.put_data(context);
247 m_send_trans.put_data(uuid);
248 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
249 m_send_trans.write_to_socket(client_socket);
252 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
253 LOGD ("client id:%d\n", client);
255 Socket client_socket(client);
257 m_send_trans.clear();
258 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
259 m_send_trans.put_data(context);
260 m_send_trans.put_data(uuid);
261 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
262 m_send_trans.write_to_socket(client_socket);
265 void candidate_more_window_show(int client, uint32 context) {
266 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
267 LOGD ("client id:%d\n", client);
270 Socket client_socket(client);
272 m_send_trans.clear();
273 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
274 m_send_trans.put_data(context);
275 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
276 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
277 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
278 m_send_trans.write_to_socket(client_socket);
281 void candidate_more_window_hide(int client, uint32 context) {
282 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
283 LOGD ("client id:%d\n", client);
285 Socket client_socket(client);
287 m_send_trans.clear();
288 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
289 m_send_trans.put_data(context);
290 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
291 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
292 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
293 m_send_trans.write_to_socket(client_socket);
296 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
297 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
298 LOGD ("client id:%d\n", client);
300 Socket client_socket(client);
302 m_send_trans.clear();
303 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
304 m_send_trans.put_data(context);
305 m_send_trans.put_data(uuid);
306 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
307 m_send_trans.put_data(table);
308 m_send_trans.write_to_socket(client_socket);
311 void select_aux(int client, uint32 contextid, uint32 item) {
312 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
313 LOGD ("client id:%d\n", client);
315 Socket client_socket(client);
316 m_send_trans.clear();
317 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
318 m_send_trans.put_data((uint32) contextid);
320 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
321 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
323 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
324 m_send_trans.put_data((uint32)item);
325 m_send_trans.write_to_socket(client_socket);
328 void select_candidate(int client, uint32 context, uint32 item) {
329 LOGD ("client id:%d\n", client);
331 Socket client_socket(client);
332 m_send_trans.clear();
333 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
334 m_send_trans.put_data((uint32) context);
336 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
337 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
339 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
340 m_send_trans.put_data((uint32)item);
341 m_send_trans.write_to_socket(client_socket);
344 void lookup_table_page_up(int client, uint32 context) {
345 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
346 LOGD ("client id:%d\n", client);
348 Socket client_socket(client);
349 m_send_trans.clear();
350 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
351 m_send_trans.put_data((uint32) context);
353 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
354 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
356 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
357 m_send_trans.write_to_socket(client_socket);
360 void lookup_table_page_down(int client, uint32 context) {
361 LOGD ("client id:%d\n", client);
363 Socket client_socket(client);
364 m_send_trans.clear();
365 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
366 m_send_trans.put_data((uint32) context);
368 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
369 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
371 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
372 m_send_trans.write_to_socket(client_socket);
375 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
376 LOGD ("client id:%d\n", client);
378 Socket client_socket(client);
379 m_send_trans.clear();
380 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
381 m_send_trans.put_data((uint32) context);
383 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
384 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
386 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
387 m_send_trans.put_data(size);
388 m_send_trans.write_to_socket(client_socket);
391 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
392 LOGD ("client id:%d\n", client);
394 Socket client_socket(client);
395 m_send_trans.clear();
396 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
397 m_send_trans.put_data((uint32) context);
399 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
400 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
402 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
403 m_send_trans.put_data(row_items);
404 m_send_trans.write_to_socket(client_socket);
407 void select_associate(int client, uint32 context, uint32 item) {
408 LOGD ("client id:%d\n", client);
410 Socket client_socket(client);
411 m_send_trans.clear();
412 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
413 m_send_trans.put_data((uint32) context);
415 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
416 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
418 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
419 m_send_trans.put_data((uint32)item);
420 m_send_trans.write_to_socket(client_socket);
423 void associate_table_page_up(int client, uint32 context) {
424 LOGD ("client id:%d\n", client);
426 Socket client_socket(client);
427 m_send_trans.clear();
428 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
429 m_send_trans.put_data((uint32) context);
431 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
432 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
434 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
435 m_send_trans.write_to_socket(client_socket);
438 void associate_table_page_down(int client, uint32 context) {
439 LOGD ("client id:%d\n", client);
441 Socket client_socket(client);
442 m_send_trans.clear();
443 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
444 m_send_trans.put_data((uint32) context);
446 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
447 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
449 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
450 m_send_trans.write_to_socket(client_socket);
453 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
454 LOGD ("client id:%d\n", client);
456 Socket client_socket(client);
457 m_send_trans.clear();
458 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
459 m_send_trans.put_data((uint32) context);
461 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
462 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
464 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
465 m_send_trans.put_data(size);
466 m_send_trans.write_to_socket(client_socket);
469 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
470 LOGD ("client id:%d\n", client);
472 Socket client_socket(client);
473 m_send_trans.clear();
474 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
475 m_send_trans.put_data((uint32) context);
477 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
478 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
480 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
481 m_send_trans.put_data(size);
482 m_send_trans.write_to_socket(client_socket);
485 void send_longpress_event(int client, uint32 context, int index) {
486 LOGD ("client id:%d\n", client);
488 Socket client_socket(client);
489 m_send_trans.clear();
490 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
491 m_send_trans.put_data((uint32) context);
493 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
494 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
496 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
497 m_send_trans.put_data(index);
498 m_send_trans.write_to_socket(client_socket);
501 void trigger_property(int client, uint32 context, const String& property) {
502 LOGD ("client id:%d\n", client);
504 Socket client_socket(client);
505 m_send_trans.clear();
506 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
507 m_send_trans.put_data((uint32) context);
509 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
510 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
512 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
513 m_send_trans.put_data(property);
514 m_send_trans.write_to_socket(client_socket);
517 void focus_out_helper(int client, uint32 context, const String& uuid) {
518 LOGD ("client id:%d\n", client);
520 Socket client_socket(client);
521 m_send_trans.clear();
522 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
523 m_send_trans.put_data(context);
524 m_send_trans.put_data(uuid);
525 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
526 m_send_trans.write_to_socket(client_socket);
529 void focus_in_helper(int client, uint32 context, const String& uuid) {
530 LOGD ("client id:%d\n", client);
532 Socket client_socket(client);
533 m_send_trans.clear();
534 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
535 m_send_trans.put_data(context);
536 m_send_trans.put_data(uuid);
537 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
538 m_send_trans.write_to_socket(client_socket);
541 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
542 LOGD ("client id:%d\n", client);
544 Socket client_socket(client);
545 m_send_trans.clear();
546 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
547 m_send_trans.put_data(context);
548 m_send_trans.put_data(uuid);
549 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
550 m_send_trans.put_data(data, len);
551 m_send_trans.write_to_socket(client_socket);
554 void hide_helper(int client, uint32 context, const String& uuid) {
555 LOGD ("client id:%d\n", client);
557 Socket client_socket(client);
558 m_send_trans.clear();
559 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
560 m_send_trans.put_data(context);
561 m_send_trans.put_data(uuid);
562 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
563 m_send_trans.write_to_socket(client_socket);
566 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
567 LOGD ("client id:%d\n", client);
569 Socket client_socket(client);
570 m_send_trans.clear();
571 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
572 m_send_trans.put_data(context);
573 m_send_trans.put_data(uuid);
574 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
575 m_send_trans.put_data(mode);
576 m_send_trans.write_to_socket(client_socket);
579 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
580 LOGD ("client id:%d\n", client);
582 Socket client_socket(client);
583 m_send_trans.clear();
584 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
585 m_send_trans.put_data(context);
586 m_send_trans.put_data(uuid);
587 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
588 m_send_trans.put_data(language);
589 m_send_trans.write_to_socket(client_socket);
592 void set_helper_imdata(int client, uint32 context, const String& uuid, const char* imdata, size_t& len) {
593 LOGD ("client id:%d\n", client);
595 Socket client_socket(client);
596 m_send_trans.clear();
597 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
598 m_send_trans.put_data(context);
599 m_send_trans.put_data(uuid);
600 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
601 m_send_trans.put_data(imdata, len);
602 m_send_trans.write_to_socket(client_socket);
605 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
606 LOGD ("client id:%d\n", client);
608 Socket client_socket(client);
609 m_send_trans.clear();
610 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
611 m_send_trans.put_data(context);
612 m_send_trans.put_data(uuid);
613 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
614 m_send_trans.put_data(type);
615 m_send_trans.write_to_socket(client_socket);
618 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
619 LOGD ("client id:%d\n", client);
621 Socket client_socket(client);
624 trans.put_command(SCIM_TRANS_CMD_REPLY);
625 trans.put_data(context);
626 trans.put_data(uuid);
627 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
631 if (trans.write_to_socket(client_socket)
632 && trans.read_from_socket(client_socket)
633 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
634 && trans.get_data(type)) {
635 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
638 LOGW ("read failed\n");
642 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
643 LOGD ("client id:%d\n", client);
645 Socket client_socket(client);
646 m_send_trans.clear();
647 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
648 m_send_trans.put_data(context);
649 m_send_trans.put_data(uuid);
650 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
651 m_send_trans.put_data(disabled);
652 m_send_trans.write_to_socket(client_socket);
655 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
657 Socket client_socket(client);
658 LOGD ("client id:%d", client);
663 trans.put_command(SCIM_TRANS_CMD_REPLY);
664 trans.put_data(context);
665 trans.put_data(uuid);
666 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
670 if (trans.write_to_socket(client_socket)
671 && trans.read_from_socket(client_socket)
672 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
673 && trans.get_data(disabled)) {
674 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
677 LOGW ("read failed");
681 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
682 LOGD ("client id:%d\n", client);
684 Socket client_socket(client);
685 m_send_trans.clear();
686 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
687 m_send_trans.put_data(context);
688 m_send_trans.put_data(uuid);
689 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
690 m_send_trans.put_data(layout);
691 m_send_trans.write_to_socket(client_socket);
694 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
695 LOGD ("client id:%d\n", client);
697 Socket client_socket(client);
698 m_send_trans.clear();
699 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
700 m_send_trans.put_data(context);
701 m_send_trans.put_data(uuid);
702 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
703 m_send_trans.put_data(mode);
704 m_send_trans.write_to_socket(client_socket);
707 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
708 LOGD ("client id:%d\n", client);
710 Socket client_socket(client);
711 m_send_trans.clear();
712 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
713 m_send_trans.put_data(context);
714 m_send_trans.put_data(uuid);
715 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
716 m_send_trans.put_data(hint);
717 m_send_trans.write_to_socket(client_socket);
720 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
721 LOGD ("client id:%d\n", client);
723 Socket client_socket(client);
724 m_send_trans.clear();
725 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
726 m_send_trans.put_data(context);
727 m_send_trans.put_data(uuid);
728 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
729 m_send_trans.put_data(direction);
730 m_send_trans.write_to_socket(client_socket);
733 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
734 LOGD ("client id:%d\n", client);
736 Socket client_socket(client);
737 m_send_trans.clear();
738 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
739 m_send_trans.put_data(context);
740 m_send_trans.put_data(uuid);
741 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
742 m_send_trans.put_data(mode);
743 m_send_trans.write_to_socket(client_socket);
746 void show_helper_option_window(int client, uint32 context, const String& uuid) {
747 LOGD ("client id:%d\n", client);
749 Socket client_socket(client);
750 m_send_trans.clear();
751 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
752 m_send_trans.put_data(context);
753 m_send_trans.put_data(uuid);
754 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
755 m_send_trans.write_to_socket(client_socket);
758 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) {
759 LOGD ("client id:%d\n", client);
761 Socket client_socket(client);
766 trans.put_command(SCIM_TRANS_CMD_REPLY);
767 trans.put_data(context);
768 trans.put_data(uuid);
769 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
771 trans.put_data(serial);
773 if (trans.write_to_socket(client_socket)) {
774 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
777 LOGW ("read failed\n");
783 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
784 LOGD ("client id:%d\n", client);
786 Socket client_socket(client);
790 trans.put_command(SCIM_TRANS_CMD_REPLY);
791 trans.put_data(context);
792 trans.put_data(uuid);
793 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
795 if (trans.write_to_socket(client_socket)) {
800 if (trans.read_from_socket(client_socket)
801 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
802 && trans.get_data(info.pos_x)
803 && trans.get_data(info.pos_y)
804 && trans.get_data(info.width)
805 && trans.get_data(info.height)) {
806 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
809 LOGW ("read failed\n");
811 LOGW ("write failed\n");
816 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
817 LOGD ("client id:%d\n", client);
818 Socket client_socket(client);
822 trans.put_command(SCIM_TRANS_CMD_REPLY);
823 trans.put_data(context);
824 trans.put_data(uuid);
825 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
829 if (trans.write_to_socket(client_socket)
830 && trans.read_from_socket(client_socket)
831 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY) {
832 trans.get_data(imdata, len);
833 LOGD ("length of imdata is %d", len);
835 LOGW ("read imdata failed\n");
839 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
840 LOGD ("client id:%d\n", client);
842 Socket client_socket(client);
846 trans.put_command(SCIM_TRANS_CMD_REPLY);
847 trans.put_data(context);
848 trans.put_data(uuid);
849 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
853 if (trans.write_to_socket(client_socket)
854 && trans.read_from_socket(client_socket)
855 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
856 && trans.get_data(layout)) {
857 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
862 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
863 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
864 LOGD ("client id:%d\n", client);
869 trans.put_command(SCIM_TRANS_CMD_REPLY);
870 trans.put_data(context);
871 trans.put_data(uuid);
872 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
875 Socket client_socket(client);
877 if (trans.write_to_socket(client_socket)
878 && trans.read_from_socket(client_socket)
879 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
880 && trans.get_data(data, len)) {
886 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
887 LOGD ("client id:%d\n", client);
890 Socket client_socket(client);
895 trans.put_command(SCIM_TRANS_CMD_REPLY);
896 trans.put_data(context);
897 trans.put_data(uuid);
898 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
899 trans.write_to_socket(client_socket);
901 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
902 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
903 !trans.get_data(avail)) {
904 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed\n");
908 void reset_ise_option(int client, uint32 context) {
909 LOGD ("client id:%d\n", client);
911 Socket client_socket(client);
912 m_send_trans.clear();
913 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
914 m_send_trans.put_data((uint32) context);
915 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
916 m_send_trans.write_to_socket(client_socket);
919 void reset_helper_context(int client, uint32 context, const String& uuid) {
920 LOGD ("client id:%d\n", client);
922 Socket client_socket(client);
923 m_send_trans.clear();
924 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
925 m_send_trans.put_data(context);
926 m_send_trans.put_data(uuid);
927 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
928 m_send_trans.write_to_socket(client_socket);
931 void reload_config(int client) {
932 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
933 LOGD ("client id:%d\n", client);
935 m_send_trans.clear();
936 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
937 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
939 Socket client_socket(client);
940 m_send_trans.write_to_socket(client_socket);
943 void exit(int client, uint32 context) {
944 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
945 LOGD ("client id:%d\n", client);
947 m_send_trans.clear();
948 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
950 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
951 m_send_trans.put_data(context);
952 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
955 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
957 Socket client_socket(client);
958 m_send_trans.write_to_socket(client_socket);
961 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
962 LOGD("client id:%d\n", client);
964 Socket client_socket(client);
969 trans.put_command(SCIM_TRANS_CMD_REPLY);
970 trans.put_data(context);
971 trans.put_data(uuid);
972 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
973 trans.put_data(type);
974 trans.put_data(data, len);
977 if (trans.write_to_socket(client_socket)
978 && trans.read_from_socket(client_socket)
979 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
980 && trans.get_data(result)) {
981 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
985 LOGW("read failed\n");
991 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
992 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
993 LOGD ("client id:%d\n", client);
995 Socket client_socket(client);
997 m_send_trans.clear();
998 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
999 m_send_trans.put_data(context);
1000 m_send_trans.put_data(uuid);
1001 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1002 m_send_trans.put_data(text);
1003 m_send_trans.put_data(cursor);
1004 m_send_trans.write_to_socket(client_socket);
1007 void socket_remoteinput_focus_in (int client) {
1008 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1009 LOGD ("client id:%d\n", client);
1012 ret = (client == -1) ? false : true;
1015 Socket client_socket(client);
1017 m_send_trans.clear();
1018 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1019 m_send_trans.put_command(ISM_TRANS_CMD_RECV_REMOTE_FOCUS_IN);
1020 m_send_trans.write_to_socket(client_socket);
1024 void socket_remoteinput_focus_out (int client) {
1025 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1026 LOGD ("client id:%d\n", client);
1029 ret = (client == -1) ? false : true;
1032 Socket client_socket(client);
1034 m_send_trans.clear();
1035 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1036 m_send_trans.put_command(ISM_TRANS_CMD_RECV_REMOTE_FOCUS_OUT);
1037 m_send_trans.write_to_socket(client_socket);
1041 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type) {
1042 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1043 LOGD ("client id:%d\n", client);
1046 ret = (client == -1) ? false : true;
1049 Socket client_socket(client);
1051 m_send_trans.clear();
1052 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1053 m_send_trans.put_command(ISM_TRANS_CMD_RECV_REMOTE_ENTRY_METADATA);
1054 m_send_trans.put_data(hint);
1055 m_send_trans.put_data(layout);
1056 m_send_trans.put_data(variation);
1057 m_send_trans.put_data(autocapital_type);
1058 m_send_trans.write_to_socket(client_socket);
1062 void socket_remoteinput_default_text (int client, String& text, uint32 cursor) {
1063 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1064 LOGD ("client id:%d\n", client);
1067 ret = (client == -1) ? false : true;
1070 Socket client_socket(client);
1072 m_send_trans.clear();
1073 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1074 m_send_trans.put_command(ISM_TRANS_CMD_RECV_REMOTE_DEFAULT_TEXT);
1075 m_send_trans.put_data(text);
1076 m_send_trans.put_data(cursor);
1077 m_send_trans.write_to_socket(client_socket);
1081 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1082 LOGD ("client id:%d\n", client);
1084 Socket client_socket(client);
1086 m_send_trans.clear();
1087 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1088 m_send_trans.put_data(context);
1089 m_send_trans.put_data(uuid);
1090 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
1091 m_send_trans.put_data(text);
1092 m_send_trans.write_to_socket(client_socket);
1095 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1096 LOGD ("client id:%d\n", client);
1098 Socket socket_client(client);
1099 m_send_trans.clear();
1100 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1101 m_send_trans.put_data(context);
1102 m_send_trans.put_data(uuid);
1103 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1104 m_send_trans.put_data(list.size());
1106 for (unsigned int i = 0; i < list.size(); i++)
1107 m_send_trans.put_data(list[i]);
1109 m_send_trans.write_to_socket(socket_client);
1112 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1113 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1115 LOGD ("client id:%d\n", client);
1117 Socket socket_client(client);
1118 m_send_trans.clear();
1119 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1120 m_send_trans.put_data(context);
1121 m_send_trans.put_data(uuid);
1122 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1123 m_send_trans.put_data(style);
1124 m_send_trans.put_data(mode);
1125 m_send_trans.write_to_socket(socket_client);
1128 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1129 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1131 LOGD ("client id:%d\n", client);
1133 Socket socket_client(client);
1134 m_send_trans.clear();
1135 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1136 m_send_trans.put_data(context);
1137 m_send_trans.put_data(uuid);
1138 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1139 m_send_trans.put_data(info.pos_x);
1140 m_send_trans.put_data(info.pos_y);
1141 m_send_trans.put_data(info.width);
1142 m_send_trans.put_data(info.height);
1143 m_send_trans.write_to_socket(socket_client);
1146 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1147 LOGD ("client id:%d\n", client);
1149 Socket socket_client(client);
1150 m_send_trans.clear();
1151 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1152 m_send_trans.put_data(context);
1153 m_send_trans.put_data(uuid);
1154 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1155 m_send_trans.put_data(ise_name);
1156 m_send_trans.put_data(ise_uuid);
1157 m_send_trans.write_to_socket(socket_client);
1160 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1161 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1163 LOGD ("client id:%d\n", client);
1165 Socket client_socket(client);
1166 m_send_trans.clear();
1167 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1168 m_send_trans.put_data(context);
1169 m_send_trans.put_data(ic_uuid);
1170 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1171 m_send_trans.write_to_socket(client_socket);
1174 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1175 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1177 LOGD ("client id:%d\n", client);
1179 Socket client_socket(client);
1180 m_send_trans.clear();
1181 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1182 m_send_trans.put_data(context);
1183 m_send_trans.put_data(ic_uuid);
1184 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1185 m_send_trans.write_to_socket(client_socket);
1188 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1189 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1190 LOGD ("client id:%d\n", client);
1192 Socket client_socket(client);
1196 m_send_trans.clear();
1197 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1199 /* FIXME: We presume that client and context are both less than 65536.
1200 * Hopefully, it should be true in any UNIXs.
1201 * So it's ok to combine client and context into one uint32. */
1202 m_send_trans.put_data(context);
1203 m_send_trans.put_data(ic_uuid);
1204 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1205 m_send_trans.put_data(_nest_trans);
1206 m_send_trans.write_to_socket(client_socket);
1211 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1212 LOGD ("client id:%d\n", client);
1214 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1215 Socket socket_client(client);
1217 m_send_trans.clear();
1218 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1219 m_send_trans.put_data(context);
1220 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1221 m_send_trans.put_data(target_uuid);
1222 m_send_trans.put_data(active_uuid);
1223 m_send_trans.put_data(nest_trans);
1224 m_send_trans.write_to_socket(socket_client);
1229 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1230 LOGD ("client id:%d\n", client);
1232 Socket socket_client(client);
1234 m_send_trans.clear();
1235 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1236 m_send_trans.put_data(context);
1237 m_send_trans.put_command(cmd);
1238 m_send_trans.put_data(key);
1239 m_send_trans.write_to_socket(socket_client);
1243 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1244 LOGD ("client id:%d\n", client);
1246 Socket socket_client(client);
1248 m_send_trans.clear();
1249 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1250 m_send_trans.put_data(target_context);
1251 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1252 m_send_trans.put_data(wstr);
1253 m_send_trans.write_to_socket(socket_client);
1257 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1258 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1259 LOGD ("client id:%d\n", client);
1261 Socket socket_client(client);
1263 m_send_trans.clear();
1264 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1265 m_send_trans.put_data(context_id);
1266 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1267 m_send_trans.put_data(maxlen_before);
1268 m_send_trans.put_data(maxlen_after);
1269 m_send_trans.write_to_socket(socket_client);
1273 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1274 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1275 LOGD ("client id:%d\n", client);
1277 Socket socket_client(client);
1279 m_send_trans.clear();
1280 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1281 m_send_trans.put_data(context_id);
1282 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1283 m_send_trans.put_data(offset);
1284 m_send_trans.put_data(len);
1285 m_send_trans.write_to_socket(socket_client);
1289 void socket_helper_get_selection(int client, uint32 context_id) {
1290 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1291 LOGD ("client id:%d\n", client);
1294 Socket socket_client(client);
1296 m_send_trans.clear();
1297 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1298 m_send_trans.put_data(context_id);
1299 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1300 m_send_trans.write_to_socket(socket_client);
1304 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1305 LOGD ("client id:%d\n", client);
1307 Socket socket_client(client);
1309 m_send_trans.clear();
1310 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1311 m_send_trans.put_data(context_id);
1312 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1313 m_send_trans.put_data(start);
1314 m_send_trans.put_data(end);
1315 m_send_trans.write_to_socket(socket_client);
1319 void show_preedit_string(int client, uint32 target_context) {
1320 LOGD ("client id:%d\n", client);
1322 Socket socket_client(client);
1324 m_send_trans.clear();
1325 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1326 m_send_trans.put_data(target_context);
1327 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1328 m_send_trans.write_to_socket(socket_client);
1332 void hide_preedit_string(int client, uint32 target_context) {
1333 LOGD ("client id:%d\n", client);
1335 Socket socket_client(client);
1337 m_send_trans.clear();
1338 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1339 m_send_trans.put_data(target_context);
1340 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1341 m_send_trans.write_to_socket(socket_client);
1345 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1346 LOGD ("client id:%d\n", client);
1348 Socket socket_client(client);
1350 m_send_trans.clear();
1351 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1352 m_send_trans.put_data(target_context);
1353 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1354 m_send_trans.put_data(preedit);
1355 m_send_trans.put_data(commit);
1356 m_send_trans.put_data(attrs);
1357 m_send_trans.put_data(caret);
1358 m_send_trans.write_to_socket(socket_client);
1363 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1365 LOGD ("client id:%d\n", client);
1367 Socket socket_client(client);
1369 m_send_trans.clear();
1370 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1371 m_send_trans.put_data(focused_context);
1372 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1373 m_send_trans.put_data(caret);
1374 m_send_trans.write_to_socket(socket_client);
1379 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1380 LOGD ("client id:%d\n", client);
1382 Socket socket_client(client);
1383 m_send_trans.clear();
1384 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1385 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1386 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1388 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1389 m_send_trans.put_data(helper_ic_index[i].first);
1390 m_send_trans.put_data(helper_ic_index[i].second);
1393 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1394 m_send_trans.put_data((uint32)current_screen);
1395 m_send_trans.write_to_socket(socket_client);
1398 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1399 LOGD ("client id:%d\n", client);
1401 Socket client_socket(client);
1402 m_send_trans.clear();
1403 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1404 m_send_trans.put_data(focused_context);
1405 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1406 m_send_trans.put_data(type);
1407 m_send_trans.put_data(value);
1408 m_send_trans.write_to_socket(client_socket);
1412 void send_private_command(int client, uint32 focused_context, String command) {
1413 LOGD ("client id:%d\n", client);
1415 Socket socket_client(client);
1417 m_send_trans.clear();
1418 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1419 m_send_trans.put_data(focused_context);
1420 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1421 m_send_trans.put_data(command);
1422 m_send_trans.write_to_socket(socket_client);
1426 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1427 LOGD ("client id:%d\n", client);
1429 m_send_trans.clear();
1430 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1432 /* FIXME: We presume that client and context are both less than 65536.
1433 * Hopefully, it should be true in any UNIXs.
1434 * So it's ok to combine client and context into one uint32. */
1435 m_send_trans.put_data(context_id);
1436 m_send_trans.put_data(uuid);
1437 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1438 m_send_trans.put_data((uint32) x);
1439 m_send_trans.put_data((uint32) y);
1441 Socket client_socket(client);
1442 m_send_trans.write_to_socket(client_socket);
1446 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1447 LOGD ("client id:%d\n", client);
1449 m_send_trans.clear();
1450 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1451 m_send_trans.put_data(context_id);
1452 m_send_trans.put_data(uuid);
1453 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1454 m_send_trans.put_data((uint32) cursor_pos);
1456 Socket client_socket(client);
1457 m_send_trans.write_to_socket(client_socket);
1461 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1462 LOGD ("client id:%d\n", client);
1464 m_send_trans.clear();
1465 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1467 /* FIXME: We presume that client and context are both less than 65536.
1468 * Hopefully, it should be true in any UNIXs.
1469 * So it's ok to combine client and context into one uint32. */
1470 m_send_trans.put_data(context_id);
1471 m_send_trans.put_data(uuid);
1472 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1473 m_send_trans.put_data((uint32) screen);
1475 Socket client_socket(client);
1476 m_send_trans.write_to_socket(client_socket);
1480 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1481 LOGD ("client id:%d\n", client);
1483 m_send_trans.clear();
1484 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1486 m_send_trans.put_data(context);
1487 m_send_trans.put_data(uuid);
1488 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1489 m_send_trans.put_data((uint32) mode);
1491 Socket client_socket(client);
1492 m_send_trans.write_to_socket(client_socket);
1495 void update_preedit_string (int client, uint32 target_context, const WideString &str, const AttributeList &attrs) {
1496 LOGD("client id:%d\n", client);
1498 Socket client_socket(client);
1500 m_send_trans.clear();
1501 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1502 m_send_trans.put_data(target_context);
1503 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1504 m_send_trans.put_data(str);
1505 m_send_trans.put_data(attrs);
1506 m_send_trans.put_data(-1);
1507 m_send_trans.write_to_socket(client_socket);
1511 void send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1512 LOGD("client id:%d\n", client);
1514 Socket client_socket(client);
1516 m_send_trans.clear ();
1517 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1518 m_send_trans.put_data (target_context);
1519 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1520 m_send_trans.put_data (key);
1521 m_send_trans.write_to_socket (client_socket);
1525 void forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1526 LOGD("client id:%d\n", client);
1528 Socket client_socket(client);
1530 m_send_trans.clear ();
1531 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1532 m_send_trans.put_data (target_context);
1533 m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
1534 m_send_trans.put_data (key);
1535 m_send_trans.write_to_socket (client_socket);
1540 static void send_fail_reply (int client_id)
1542 Socket client_socket (client_id);
1545 trans.put_command (SCIM_TRANS_CMD_REPLY);
1546 trans.put_command (SCIM_TRANS_CMD_FAIL);
1547 trans.write_to_socket (client_socket);
1550 bool filter_event(int fd) {
1551 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1553 return m_socket_server.filter_event(fd);
1556 bool filter_exception_event(int fd) {
1557 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1559 return m_socket_server.filter_exception_event(fd);
1562 int get_server_id() {
1563 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1565 return m_socket_server.get_id();
1568 bool socket_check_client_connection(const Socket& client) {
1569 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1571 unsigned char buf [sizeof(uint32)];
1573 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1575 if (nbytes == sizeof(uint32))
1579 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1581 LOGW ("Timeout when reading socket\n");
1588 * @brief Callback function for ecore fd handler.
1590 * @param data The data to pass to this callback.
1591 * @param fd_handler The ecore fd handler.
1593 * @return ECORE_CALLBACK_RENEW
1595 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1596 if (fd_handler == NULL || data == NULL)
1597 return ECORE_CALLBACK_RENEW;
1599 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1601 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1603 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1604 if (fd_handler == _agent->_read_handler_list [i]) {
1605 if (!_agent->filter_event(fd)) {
1606 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1608 ecore_main_fd_handler_del(fd_handler);
1610 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1613 return ECORE_CALLBACK_RENEW;
1617 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1618 _agent->filter_exception_event(fd);
1620 ecore_main_fd_handler_del(fd_handler);
1622 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1623 return ECORE_CALLBACK_RENEW;
1626 void socket_accept_callback(SocketServer* server,
1627 const Socket& client) {
1628 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1632 if (m_should_exit) {
1633 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1636 //m_signal_accept_connection (client.get_id ());
1637 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1638 _read_handler_list.push_back(panel_agent_read_handler);
1644 void socket_receive_callback(SocketServer* server,
1645 const Socket& client) {
1646 int client_id = client.get_id();
1652 ClientInfo client_info;
1654 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1656 /* If the connection is closed then close this client. */
1657 if (!socket_check_client_connection(client)) {
1658 LOGW ("check client connection failed\n");
1659 socket_close_connection(server, client);
1663 client_info = m_info_manager->socket_get_client_info(client_id);
1665 /* If it's a new client, then request to open the connection first. */
1666 if (client_info.type == UNKNOWN_CLIENT) {
1667 socket_open_connection(server, client);
1671 /* If can not read the transaction,
1672 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1673 * or the key is mismatch,
1675 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1676 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1677 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1678 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1682 if (client_info.type == FRONTEND_ACT_CLIENT) {
1683 if (m_recv_trans.get_data(context)) {
1684 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1685 socket_transaction_start();
1687 while (m_recv_trans.get_command(cmd)) {
1688 LOGD ("PanelAgent::cmd = %d\n", cmd);
1690 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1693 if (m_recv_trans.get_data(id)) {
1694 m_info_manager->register_panel_client(client_id, id);
1696 LOGW ("wrong format of transaction\n");
1702 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1703 if (m_recv_trans.get_data(uuid)) {
1704 m_info_manager->register_input_context(client_id, context, uuid);
1706 LOGW ("wrong format of transaction\n");
1712 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1713 m_info_manager->remove_input_context(client_id, context);
1717 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1718 m_info_manager->socket_reset_input_context(client_id, context);
1722 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1723 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1725 if (m_recv_trans.get_data(uuid)) {
1726 m_info_manager->focus_in(client_id, context, uuid);
1728 LOGW ("wrong format of transaction\n");
1734 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1737 if (m_recv_trans.get_data(isOn)) {
1738 m_info_manager->socket_turn_on_log(isOn);
1740 LOGW ("wrong format of transaction\n");
1746 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1747 m_info_manager->show_isf_panel(client_id);
1749 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1750 m_info_manager->hide_isf_panel(client_id);
1752 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1759 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1762 LOGW ("wrong format of transaction\n");
1766 Socket client_socket(client_id);
1769 trans.put_command(SCIM_TRANS_CMD_REPLY);
1770 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1771 trans.put_data(ret);
1772 trans.write_to_socket(client_socket);
1778 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1781 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1785 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1786 m_info_manager->hide_ise_panel(client_id, client, context);
1788 LOGW ("wrong format of transaction\n");
1792 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1793 struct rectinfo info;
1794 m_info_manager->get_input_panel_geometry(client_id, info);
1796 Socket client_socket(client_id);
1799 trans.put_command(SCIM_TRANS_CMD_REPLY);
1800 trans.put_command(SCIM_TRANS_CMD_OK);
1801 trans.put_data(info.pos_x);
1802 trans.put_data(info.pos_y);
1803 trans.put_data(info.width);
1804 trans.put_data(info.height);
1805 trans.write_to_socket(client_socket);
1807 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1808 struct rectinfo info;
1809 m_info_manager->get_candidate_window_geometry(client_id, info);
1811 Socket client_socket(client_id);
1814 trans.put_command(SCIM_TRANS_CMD_REPLY);
1815 trans.put_command(SCIM_TRANS_CMD_OK);
1816 trans.put_data(info.pos_x);
1817 trans.put_data(info.pos_y);
1818 trans.put_data(info.width);
1819 trans.put_data(info.height);
1820 trans.write_to_socket(client_socket);
1822 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1825 m_info_manager->get_ise_language_locale(client_id, &data, len);
1828 trans.put_command(SCIM_TRANS_CMD_REPLY);
1830 if (data != NULL && len > 0) {
1831 trans.put_command(SCIM_TRANS_CMD_OK);
1832 trans.put_data(data, len);
1834 trans.put_command(SCIM_TRANS_CMD_FAIL);
1837 Socket client_socket(client_id);
1838 trans.write_to_socket(client_socket);
1844 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1847 if (m_recv_trans.get_data(language)) {
1848 m_info_manager->set_ise_language(client_id, language);
1850 LOGW ("wrong format of transaction\n");
1854 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1855 char* imdata = NULL;
1858 if (m_recv_trans.get_data(&imdata, len)) {
1859 m_info_manager->set_ise_imdata(client_id, imdata, len);
1861 LOGW ("wrong format of transaction\n");
1868 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1869 char* imdata = NULL;
1871 m_info_manager->get_ise_imdata(client_id, &imdata, len);
1873 Socket client_socket(client_id);
1876 trans.put_command(SCIM_TRANS_CMD_REPLY);
1879 trans.put_command(SCIM_TRANS_CMD_OK);
1880 trans.put_data(imdata, len);
1882 trans.put_command(SCIM_TRANS_CMD_FAIL);
1885 trans.write_to_socket(client_socket);
1891 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
1894 if (m_recv_trans.get_data(type)) {
1895 m_info_manager->set_ise_return_key_type(client_id, type);
1897 LOGW ("wrong format of transaction\n");
1901 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
1903 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
1905 Socket client_socket(client_id);
1908 trans.put_command(SCIM_TRANS_CMD_REPLY);
1911 trans.put_command(SCIM_TRANS_CMD_OK);
1912 trans.put_data(type);
1914 trans.put_command(SCIM_TRANS_CMD_FAIL);
1917 trans.write_to_socket(client_socket);
1919 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
1922 if (m_recv_trans.get_data(disabled)) {
1923 m_info_manager->set_ise_return_key_disable(client_id, disabled);
1925 LOGW ("wrong format of transaction\n");
1929 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
1932 m_info_manager->get_ise_return_key_disable(client_id, disabled);
1934 Socket client_socket(client_id);
1937 trans.put_command(SCIM_TRANS_CMD_REPLY);
1940 trans.put_command(SCIM_TRANS_CMD_OK);
1941 trans.put_data(disabled);
1943 trans.put_command(SCIM_TRANS_CMD_FAIL);
1946 trans.write_to_socket(client_socket);
1948 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
1950 bool ret = m_info_manager->get_ise_layout(client_id, layout);
1952 Socket client_socket(client_id);
1955 trans.put_command(SCIM_TRANS_CMD_REPLY);
1958 trans.put_command(SCIM_TRANS_CMD_OK);
1959 trans.put_data(layout);
1961 trans.put_command(SCIM_TRANS_CMD_FAIL);
1964 trans.write_to_socket(client_socket);
1966 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
1969 if (m_recv_trans.get_data(layout)) {
1970 m_info_manager->set_ise_layout(client_id, layout);
1972 LOGW ("wrong format of transaction\n");
1976 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
1979 if (m_recv_trans.get_data(mode)) {
1980 m_info_manager->set_ise_caps_mode(client_id, mode);
1982 LOGW ("wrong format of transaction\n");
1986 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
1987 m_info_manager->will_show_ack(client_id);
1989 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
1990 m_info_manager->will_hide_ack(client_id);
1992 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
1995 if (m_recv_trans.get_data(mode)) {
1996 m_info_manager->set_keyboard_mode(client_id, mode);
1998 LOGW ("wrong format of transaction\n");
2002 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2003 m_info_manager->candidate_will_hide_ack(client_id);
2005 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2011 if (m_recv_trans.get_data(key)) {
2013 m_info_manager->process_key_event(key, result);
2015 LOGW ("wrong format of transaction\n");
2019 Socket client_socket(client_id);
2022 trans.put_command(SCIM_TRANS_CMD_REPLY);
2025 trans.put_command(SCIM_TRANS_CMD_OK);
2026 trans.put_data(result);
2028 trans.put_command(SCIM_TRANS_CMD_FAIL);
2031 trans.write_to_socket(client_socket);
2033 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2035 m_info_manager->get_active_helper_option(client_id, option);
2037 Socket client_socket(client_id);
2040 trans.put_command(SCIM_TRANS_CMD_REPLY);
2041 trans.put_command(SCIM_TRANS_CMD_OK);
2042 trans.put_data(option);
2043 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2044 trans.write_to_socket(client_socket);
2046 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2048 m_info_manager->get_ise_state(client_id, state);
2050 Socket client_socket(client_id);
2053 trans.put_command(SCIM_TRANS_CMD_REPLY);
2054 trans.put_command(SCIM_TRANS_CMD_OK);
2055 trans.put_data(state);
2056 trans.write_to_socket(client_socket);
2058 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2061 if (m_recv_trans.get_data(input_mode)) {
2062 m_info_manager->set_ise_input_mode(client_id, input_mode);
2064 LOGW ("wrong format of transaction\n");
2068 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2071 if (m_recv_trans.get_data(input_hint)) {
2072 m_info_manager->set_ise_input_hint(client_id, input_hint);
2074 LOGW ("wrong format of transaction\n");
2078 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2079 uint32 bidi_direction;
2081 if (m_recv_trans.get_data(bidi_direction)) {
2082 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2084 LOGW ("wrong format of transaction\n");
2088 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2089 m_info_manager->show_ise_option_window(client_id);
2096 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2099 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2100 m_info_manager->socket_start_helper(client_id, context, uuid);
2102 LOGW ("wrong format of transaction\n");
2106 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2109 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2110 uuid.length() && m_nest_trans.valid()) {
2111 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2113 LOGW ("wrong format of transaction\n");
2117 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2120 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2121 m_info_manager->socket_stop_helper(client_id, context, uuid);
2123 LOGW ("wrong format of transaction\n");
2132 /* Client must focus in before do any other things. */
2133 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2134 m_info_manager->socket_turn_on();
2135 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2136 m_info_manager->socket_turn_off();
2137 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2140 if (m_recv_trans.get_data(num))
2141 m_info_manager->socket_update_screen(client_id, num);
2143 LOGW ("wrong format of transaction\n");
2144 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2147 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2148 m_info_manager->socket_update_spot_location(x, y, top_y);
2150 LOGW ("wrong format of transaction\n");
2152 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2155 if (m_recv_trans.get_data(cursor_pos)) {
2156 m_info_manager->socket_update_cursor_position(cursor_pos);
2158 LOGW ("wrong format of transaction\n");
2160 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2164 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2165 m_info_manager->socket_update_surrounding_text(text, cursor);
2167 LOGW ("wrong format of transaction\n");
2169 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2172 if (m_recv_trans.get_data(text)) {
2173 m_info_manager->socket_update_selection(text);
2175 LOGW ("wrong format of transaction\n");
2177 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2178 m_info_manager->expand_candidate();
2179 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2180 m_info_manager->contract_candidate();
2181 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2182 uint32 portrait_line, mode;
2184 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2185 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2187 LOGW ("wrong format of transaction\n");
2188 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2189 PanelFactoryInfo info;
2191 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2192 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2193 m_info_manager->socket_update_factory_info(info);
2195 LOGW ("wrong format of transaction\n");
2197 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2198 m_info_manager->socket_show_preedit_string();
2199 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2200 m_info_manager->socket_show_aux_string();
2201 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2202 m_info_manager->socket_show_lookup_table();
2203 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2204 m_info_manager->socket_show_associate_table();
2205 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2206 m_info_manager->socket_hide_preedit_string();
2207 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2208 m_info_manager->socket_hide_aux_string();
2209 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2210 m_info_manager->socket_hide_lookup_table();
2211 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2212 m_info_manager->socket_hide_associate_table();
2213 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2215 AttributeList attrs;
2218 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2219 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2221 LOGW ("wrong format of transaction\n");
2222 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2225 if (m_recv_trans.get_data(caret))
2226 m_info_manager->socket_update_preedit_caret(caret);
2228 LOGW ("wrong format of transaction\n");
2229 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2231 AttributeList attrs;
2233 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2234 m_info_manager->socket_update_aux_string(str, attrs);
2236 LOGW ("wrong format of transaction\n");
2237 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2238 CommonLookupTable _isf_candidate_table;
2240 if (m_recv_trans.get_data(_isf_candidate_table))
2241 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2243 LOGW ("wrong format of transaction\n");
2245 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2246 CommonLookupTable table;
2248 if (m_recv_trans.get_data(table))
2249 m_info_manager->socket_update_associate_table(table);
2251 LOGW ("wrong format of transaction\n");
2252 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2253 PropertyList properties;
2255 if (m_recv_trans.get_data(properties))
2256 m_info_manager->socket_register_properties(properties);
2258 LOGW ("wrong format of transaction\n");
2259 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2262 if (m_recv_trans.get_data(property))
2263 m_info_manager->socket_update_property(property);
2265 LOGW ("wrong format of transaction\n");
2266 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2269 if (m_recv_trans.get_data(help))
2270 m_info_manager->socket_show_help(help);
2272 LOGW ("wrong format of transaction\n");
2273 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2274 PanelFactoryInfo info;
2275 std::vector <PanelFactoryInfo> vec;
2277 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2278 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2279 info.lang = scim_get_normalized_language(info.lang);
2280 vec.push_back(info);
2283 m_info_manager->socket_show_factory_menu(vec);
2284 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2285 m_info_manager->focus_out(client_id, context);
2287 LOGW ("unknow cmd: %d\n", cmd);
2291 socket_transaction_end();
2293 } else if (client_info.type == FRONTEND_CLIENT) {
2294 if (m_recv_trans.get_data(context)) {
2295 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2296 socket_transaction_start();
2298 while (m_recv_trans.get_command(cmd)) {
2299 LOGD ("PanelAgent::cmd = %d\n", cmd);
2301 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2302 Socket client_socket(client_id);
2306 trans.put_command(SCIM_TRANS_CMD_REPLY);
2307 trans.put_command(SCIM_TRANS_CMD_OK);
2308 trans.put_data(client_id);
2309 trans.write_to_socket(client_socket);
2312 LOGW ("unknow cmd: %d\n", cmd);
2316 socket_transaction_end();
2318 } else if (client_info.type == HELPER_CLIENT) {
2319 socket_transaction_start();
2321 while (m_recv_trans.get_command(cmd)) {
2322 LOGD ("PanelAgent::cmd = %d\n", cmd);
2324 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2327 if (m_recv_trans.get_data(info.uuid) &&
2328 m_recv_trans.get_data(info.name) &&
2329 m_recv_trans.get_data(info.icon) &&
2330 m_recv_trans.get_data(info.description) &&
2331 m_recv_trans.get_data(info.option) &&
2332 info.uuid.length()) {
2333 m_info_manager->socket_helper_register_helper(client_id, info);
2336 LOGW ("unknow cmd: %d\n", cmd);
2340 socket_transaction_end();
2341 } else if (client_info.type == HELPER_ACT_CLIENT) {
2342 socket_transaction_start();
2344 while (m_recv_trans.get_command(cmd)) {
2345 LOGD ("PanelAgent::cmd = %d\n", cmd);
2347 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2350 if (m_recv_trans.get_data(info.uuid) &&
2351 m_recv_trans.get_data(info.name) &&
2352 m_recv_trans.get_data(info.icon) &&
2353 m_recv_trans.get_data(info.description) &&
2354 m_recv_trans.get_data(info.option) &&
2355 info.uuid.length()) {
2356 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2358 LOGW ("wrong format of transaction\n");
2360 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2365 if (m_recv_trans.get_data(target_ic) &&
2366 m_recv_trans.get_data(target_uuid) &&
2367 m_recv_trans.get_data(wstr) &&
2369 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2371 LOGW ("wrong format of transaction\n");
2373 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2377 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2378 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2380 LOGW ("wrong format of transaction\n");
2382 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2383 m_info_manager->socket_show_aux_string();
2384 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2385 m_info_manager->socket_show_lookup_table();
2386 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2387 m_info_manager->socket_show_associate_table();
2388 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2392 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2393 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2395 LOGW ("wrong format of transaction\n");
2397 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2398 m_info_manager->socket_hide_aux_string();
2399 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2400 m_info_manager->socket_hide_lookup_table();
2401 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2402 m_info_manager->socket_hide_associate_table();
2403 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2408 AttributeList attrs;
2411 if (m_recv_trans.get_data(target_ic) &&
2412 m_recv_trans.get_data(target_uuid) &&
2413 m_recv_trans.get_data(preedit) &&
2414 m_recv_trans.get_data(commit) &&
2415 m_recv_trans.get_data(attrs) &&
2416 m_recv_trans.get_data(caret)) {
2417 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2419 LOGW ("wrong format of transaction\n");
2421 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2424 if (m_recv_trans.get_data(caret)) {
2425 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2427 LOGW ("wrong format of transaction\n");
2429 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2431 AttributeList attrs;
2433 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2434 m_info_manager->socket_update_aux_string(str, attrs);
2436 LOGW ("wrong format of transaction\n");
2438 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2439 CommonLookupTable _isf_candidate_table;
2441 if (m_recv_trans.get_data(_isf_candidate_table)) {
2442 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2444 LOGW ("wrong format of transaction\n");
2446 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2447 CommonLookupTable _isf_candidate_table;
2449 if (m_recv_trans.get_data(_isf_candidate_table)) {
2450 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2452 LOGW ("wrong format of transaction\n");
2454 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2455 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2460 if (m_recv_trans.get_data(target_ic) &&
2461 m_recv_trans.get_data(target_uuid) &&
2462 m_recv_trans.get_data(key) &&
2464 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2466 LOGW ("wrong format of transaction\n");
2468 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2473 if (m_recv_trans.get_data(target_ic) &&
2474 m_recv_trans.get_data(target_uuid) &&
2475 m_recv_trans.get_data(key) &&
2477 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2479 LOGW ("wrong format of transaction\n");
2481 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2485 if (m_recv_trans.get_data(target_ic) &&
2486 m_recv_trans.get_data(target_uuid) &&
2487 m_recv_trans.get_data(m_nest_trans) &&
2488 m_nest_trans.valid()) {
2489 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2491 LOGW ("wrong format of transaction\n");
2493 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2494 PropertyList properties;
2496 if (m_recv_trans.get_data(properties))
2497 m_info_manager->socket_helper_register_properties(client_id, properties);
2499 LOGW ("wrong format of transaction\n");
2500 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2503 if (m_recv_trans.get_data(property))
2504 m_info_manager->socket_helper_update_property(client_id, property);
2506 LOGW ("wrong format of transaction\n");
2507 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2511 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2512 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2514 LOGW ("wrong format of transaction\n");
2516 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2519 if (m_recv_trans.get_data(uuid)) {
2520 m_info_manager->socket_get_keyboard_ise_list(uuid);
2522 LOGW ("wrong format of transaction\n");
2524 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2525 uint32 portrait_line, mode;
2527 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2528 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2530 LOGW ("wrong format of transaction\n");
2531 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2534 if (m_recv_trans.get_data(uuid)) {
2535 m_info_manager->socket_get_candidate_ui(uuid);
2537 LOGW ("wrong format of transaction\n");
2539 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2542 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2543 m_info_manager->socket_set_candidate_position(left, top);
2545 LOGW ("wrong format of transaction\n");
2546 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2547 m_info_manager->socket_hide_candidate();
2548 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2551 if (m_recv_trans.get_data(uuid)) {
2552 m_info_manager->socket_get_candidate_geometry(uuid);
2554 LOGW ("wrong format of transaction\n");
2556 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2557 m_info_manager->reset_keyboard_ise();
2558 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2561 if (m_recv_trans.get_data(uuid)) {
2562 m_info_manager->socket_set_keyboard_ise(uuid);
2564 LOGW ("wrong format of transaction\n");
2566 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2569 if (m_recv_trans.get_data(uuid)) {
2570 m_info_manager->socket_get_keyboard_ise(uuid);
2572 LOGW ("wrong format of transaction\n");
2574 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2575 uint32 x, y, width, height;
2577 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2578 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2579 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2581 LOGW ("wrong format of transaction\n");
2583 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2584 m_info_manager->expand_candidate();
2585 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2586 m_info_manager->contract_candidate();
2587 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2590 if (m_recv_trans.get_data(index))
2591 m_info_manager->socket_helper_select_candidate(index);
2593 LOGW ("wrong format of transaction\n");
2594 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2596 uint32 maxlen_before;
2597 uint32 maxlen_after;
2599 if (m_recv_trans.get_data(uuid) &&
2600 m_recv_trans.get_data(maxlen_before) &&
2601 m_recv_trans.get_data(maxlen_after)) {
2602 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2604 LOGW ("wrong format of transaction\n");
2606 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2610 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2611 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2613 LOGW ("wrong format of transaction\n");
2615 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2618 if (m_recv_trans.get_data(uuid)) {
2619 m_info_manager->socket_helper_get_selection(client_id, uuid);
2621 LOGW ("wrong format of transaction\n");
2623 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2627 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2628 m_info_manager->socket_helper_set_selection(client_id, start, end);
2630 LOGW ("wrong format of transaction\n");
2632 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2635 if (m_recv_trans.get_data(command)) {
2636 m_info_manager->socket_helper_send_private_command(client_id, command);
2638 LOGW ("wrong format of transaction\n");
2641 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2642 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2643 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2648 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2649 m_info_manager->process_key_event_done(key, ret, serial);
2651 LOGW ("wrong format of transaction\n");
2654 LOGW ("unknow cmd: %d\n", cmd);
2658 socket_transaction_end();
2659 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2660 socket_transaction_start();
2662 while (m_recv_trans.get_command(cmd)) {
2663 LOGD ("PanelAgent::cmd = %d\n", cmd);
2665 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2667 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2668 String default_uuid;
2669 m_info_manager->get_active_ise(client_id, default_uuid);
2671 Socket client_socket(client_id);
2674 trans.put_command(SCIM_TRANS_CMD_REPLY);
2675 trans.put_command(SCIM_TRANS_CMD_OK);
2676 trans.put_data(default_uuid);
2677 trans.write_to_socket(client_socket);
2680 LOGW ("Access denied to get active ise\n");
2681 send_fail_reply (client_id);
2683 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2684 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2689 if (m_recv_trans.get_data(&buf, len)) {
2690 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2692 LOGW ("wrong format of transaction\n");
2696 Socket client_socket(client_id);
2699 trans.put_command(SCIM_TRANS_CMD_REPLY);
2700 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2701 trans.write_to_socket(client_socket);
2707 LOGW ("Access denied to set active ise\n");
2708 send_fail_reply (client_id);
2710 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2711 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2717 //ret need be checked
2718 if (m_recv_trans.get_data(&buf, len)) {
2719 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2721 LOGW ("wrong format of transaction\n");
2725 Socket client_socket(client_id);
2728 trans.put_command(SCIM_TRANS_CMD_REPLY);
2729 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2730 trans.write_to_socket(client_socket);
2736 LOGW ("Access denied to set initial ise\n");
2737 send_fail_reply (client_id);
2739 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2740 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2741 std::vector<String> strlist;
2742 m_info_manager->get_ise_list(client_id, strlist);
2744 Socket client_socket(client_id);
2750 trans.put_command(SCIM_TRANS_CMD_REPLY);
2751 trans.put_command(SCIM_TRANS_CMD_OK);
2753 num = strlist.size();
2754 trans.put_data(num);
2756 for (unsigned int i = 0; i < num; i++) {
2757 buf = const_cast<char*>(strlist[i].c_str());
2758 len = strlen(buf) + 1;
2759 trans.put_data(buf, len);
2762 trans.write_to_socket(client_socket);
2765 LOGW ("Access denied to get ise list\n");
2766 send_fail_reply (client_id);
2768 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2769 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2770 HELPER_ISE_INFO info;
2771 m_info_manager->get_all_helper_ise_info(client_id, info);
2775 Socket client_socket(client_id);
2778 trans.put_command(SCIM_TRANS_CMD_REPLY);
2779 trans.put_command(SCIM_TRANS_CMD_OK);
2781 if (info.appid.size() > 0) {
2782 trans.put_data(info.appid);
2783 trans.put_data(info.label);
2784 trans.put_data(info.is_enabled);
2785 trans.put_data(info.is_preinstalled);
2786 trans.put_data(info.has_option);
2789 trans.write_to_socket(client_socket);
2793 LOGW ("Access denied to get all helper ise info\n");
2794 send_fail_reply (client_id);
2796 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2797 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2802 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2803 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2806 LOGW ("wrong format of transaction\n");
2810 Socket client_socket(client_id);
2813 trans.put_command(SCIM_TRANS_CMD_REPLY);
2814 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2815 trans.write_to_socket(client_socket);
2818 LOGW ("Access denied to set enable helper ise info\n");
2819 send_fail_reply (client_id);
2821 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
2822 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2823 String strUuid, strName, strLanguage, strModuleName;
2827 if (m_recv_trans.get_data(strUuid)) {
2828 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
2830 LOGW ("wrong format of transaction\n");
2834 Socket client_socket(client_id);
2836 trans.put_command(SCIM_TRANS_CMD_REPLY);
2837 trans.put_command(SCIM_TRANS_CMD_OK);
2838 trans.put_data(strName);
2839 trans.put_data(strLanguage);
2840 trans.put_data(nType);
2841 trans.put_data(nOption);
2842 trans.put_data(strModuleName);
2843 trans.write_to_socket(client_socket);
2846 LOGW ("Access denied to get ise information\n");
2847 send_fail_reply (client_id);
2849 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
2850 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2852 Socket client_socket(client_id);
2855 trans.put_command(SCIM_TRANS_CMD_REPLY);
2856 trans.put_command(SCIM_TRANS_CMD_OK);
2857 trans.write_to_socket(client_socket);
2858 m_info_manager->show_helper_ise_selector(client_id);
2859 m_info_manager->reset_ise_option(client_id);
2862 LOGW ("Access denied to reset ise option\n");
2863 send_fail_reply (client_id);
2865 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
2866 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2867 m_info_manager->reset_default_ise(client_id);
2870 LOGW ("Access denied to reset default ise\n");
2871 send_fail_reply (client_id);
2873 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
2874 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2875 m_info_manager->show_isf_panel(client_id);
2878 LOGW ("Access denied to show isf control\n");
2879 send_fail_reply (client_id);
2881 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2882 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2883 m_info_manager->show_ise_option_window(client_id);
2886 LOGW ("Access denied to show ise option window\n");
2887 send_fail_reply (client_id);
2889 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
2890 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2892 Socket client_socket(client_id);
2895 trans.put_command(SCIM_TRANS_CMD_REPLY);
2896 trans.put_command(SCIM_TRANS_CMD_OK);
2897 trans.write_to_socket(client_socket);
2899 m_info_manager->show_helper_ise_list(client_id);
2902 LOGW ("Access denied to show helper ise list\n");
2903 send_fail_reply (client_id);
2905 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
2906 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2908 Socket client_socket(client_id);
2911 trans.put_command(SCIM_TRANS_CMD_REPLY);
2912 trans.put_command(SCIM_TRANS_CMD_OK);
2913 trans.write_to_socket(client_socket);
2914 m_info_manager->show_helper_ise_selector(client_id);
2917 LOGW ("Access denied to show helper ise selector\n");
2918 send_fail_reply (client_id);
2920 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
2921 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2923 uint32 nEnabled = 0;
2926 //ret need be checked
2927 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
2929 Socket client_socket(client_id);
2931 trans.put_command(SCIM_TRANS_CMD_REPLY);
2934 trans.put_command(SCIM_TRANS_CMD_OK);
2935 trans.put_data(static_cast<uint32>(nEnabled));
2937 trans.put_command(SCIM_TRANS_CMD_FAIL);
2940 trans.write_to_socket(client_socket);
2943 LOGW ("Access denied to check helper ise enabled\n");
2944 send_fail_reply (client_id);
2946 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
2950 Socket client_socket(client_id);
2953 trans.put_command(SCIM_TRANS_CMD_REPLY);
2955 if (m_recv_trans.get_data(angle)) {
2956 struct rectinfo info = {0, 0, 0, 0};
2957 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
2959 trans.put_command(SCIM_TRANS_CMD_OK);
2960 trans.put_data(info.pos_x);
2961 trans.put_data(info.pos_y);
2962 trans.put_data(info.width);
2963 trans.put_data(info.height);
2965 trans.put_command(SCIM_TRANS_CMD_FAIL);
2968 trans.write_to_socket(client_socket);
2969 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
2971 Socket client_socket(client_id);
2974 trans.put_command(SCIM_TRANS_CMD_REPLY);
2975 trans.put_command(SCIM_TRANS_CMD_OK);
2976 trans.write_to_socket(client_socket);
2977 m_info_manager->hide_helper_ise ();
2979 LOGW ("unknow cmd: %d\n", cmd);
2983 socket_transaction_end();
2984 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
2985 socket_transaction_start();
2986 while (m_recv_trans.get_command(cmd)) {
2987 LOGD ("PanelAgent::cmd = %d\n", cmd);
2988 if (cmd == ISM_TRANS_CMD_SEND_REMOTE_INPUT_MESSAGE) {
2993 if (m_recv_trans.get_data(&buf, len)) {
2994 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
2996 LOGW ("wrong format of transaction\n");
3000 Socket client_socket(client_id);
3003 trans.put_command(SCIM_TRANS_CMD_REPLY);
3004 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3005 trans.write_to_socket(client_socket);
3009 } else if (cmd == ISM_TRANS_CMD_CHECK_REMOTE_PRIVILEGE) {
3012 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE))
3016 Socket client_socket(client_id);
3019 trans.put_command(SCIM_TRANS_CMD_REPLY);
3020 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3021 trans.write_to_socket(client_socket);
3023 LOGW ("unknow cmd: %d\n", cmd);
3027 socket_transaction_end();
3031 void socket_exception_callback(SocketServer* server,
3032 const Socket& client) {
3033 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3034 LOGD ("client id:%d\n", client.get_id());
3035 socket_close_connection(server, client);
3038 bool socket_open_connection(SocketServer* server,
3039 const Socket& client) {
3040 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3041 LOGD ("client id:%d\n", client.get_id());
3043 String type = scim_socket_accept_connection(key,
3045 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3049 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3050 if (type.length()) {
3051 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3052 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3053 ((type == "Helper") ? HELPER_CLIENT :
3054 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3055 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3056 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3057 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3058 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3060 m_info_manager->add_client(client.get_id(), key, _type);
3064 LOGW ("open_connection failed\n");
3066 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3067 server->close_connection(client);
3071 void socket_close_connection(SocketServer* server,
3072 const Socket& client) {
3073 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3074 LOGD ("client id:%d\n", client.get_id());
3076 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3078 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
3079 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3080 ::close (client.get_id ());
3081 ecore_main_fd_handler_del (_read_handler_list[i]);
3082 _read_handler_list.erase (IterPos);
3086 m_info_manager->del_client(client.get_id());
3089 void socket_transaction_start(void) {
3090 //m_signal_transaction_start ();
3093 void socket_transaction_end(void) {
3094 //m_signal_transaction_end ();
3101 //m_signal_unlock ();
3105 } /* namespace scim */
3107 /***************************************************/
3108 /*** Beginning of panel agent interface for ISF ***/
3109 /***************************************************/
3110 static scim::PanelAgentPointer instance;
3114 EXAPI void scim_module_init(void)
3118 EXAPI void scim_module_exit(void)
3123 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3128 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3130 scim::PanelAgentBase* _instance = NULL;
3131 if (instance.null()) {
3133 _instance = new scim::EcoreSocketPanelAgent();
3139 instance = _instance;
3146 vi:ts=4:nowrap:ai:expandtab