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() {
115 for (unsigned int ii = 0; ii < _read_handler_list.size(); ++ii) {
116 ecore_main_fd_handler_del(_read_handler_list[ii]);
118 _read_handler_list.clear();
121 bool initialize(InfoManager* info_manager, const String& display, bool resident) {
123 m_info_manager = info_manager;
124 m_socket_address = scim_get_default_panel_socket_address(display);
126 m_socket_server.shutdown();
128 if (m_socket_server.create(SocketAddress(m_socket_address))) {
129 Ecore_Fd_Handler* panel_agent_read_handler = NULL;
130 panel_agent_read_handler = ecore_main_fd_handler_add(get_server_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
131 _read_handler_list.push_back(panel_agent_read_handler);
134 LOGE("create server failed\n");
138 bool valid(void) const {
139 return m_socket_server.valid();
143 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
146 m_should_exit = true;
149 if (client.connect(SocketAddress(m_socket_address))) {
154 void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) {
155 LOGD ("client id:%d\n", client);
156 Socket client_socket(client);
157 m_send_trans.clear();
158 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
159 m_send_trans.put_data(context_id);
160 m_send_trans.put_command(cmd);
161 m_send_trans.put_data(nType);
162 m_send_trans.put_data(nValue);
163 m_send_trans.write_to_socket(client_socket);
166 void move_preedit_caret(int client, uint32 context_id, uint32 position) {
167 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
168 LOGD ("client id:%d\n", client);
169 Socket client_socket(client);
170 m_send_trans.clear();
171 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
172 m_send_trans.put_data((uint32) context_id);
173 m_send_trans.put_command(SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
174 m_send_trans.put_data((uint32) position);
175 m_send_trans.write_to_socket(client_socket);
180 void request_help(int client_id, uint32 context_id) {
181 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
182 LOGD ("client id:%d", client_id);
184 Socket client_socket(client_id);
185 m_send_trans.clear();
186 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
187 m_send_trans.put_data((uint32) context_id);
188 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
189 m_send_trans.write_to_socket(client_socket);
193 void request_factory_menu(int client_id, uint32 context_id) {
194 LOGD ("client id:%d", client_id);
195 Socket client_socket(client_id);
196 m_send_trans.clear();
197 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
198 m_send_trans.put_data((uint32) context_id);
199 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
200 m_send_trans.write_to_socket(client_socket);
204 void reset_keyboard_ise(int client, uint32 context_id) {
205 LOGD ("client id:%d\n", client);
206 Socket client_socket(client);
207 m_send_trans.clear();
208 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
209 m_send_trans.put_data((uint32) context_id);
210 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
211 m_send_trans.write_to_socket(client_socket);
214 void update_keyboard_ise_list(int client, uint32 context) {
215 LOGD ("client id:%d\n", client);
217 Socket client_socket(client);
218 m_send_trans.clear();
219 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
220 m_send_trans.put_data((uint32) context);
221 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
222 m_send_trans.write_to_socket(client_socket);
225 void change_factory(int client, uint32 context, const String& uuid) {
226 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
227 LOGD ("client id:%d\n", client);
229 Socket client_socket(client);
230 m_send_trans.clear();
231 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
232 m_send_trans.put_data((uint32) context);
233 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
234 m_send_trans.put_data(uuid);
235 m_send_trans.write_to_socket(client_socket);
238 void helper_candidate_show(int client, uint32 context, const String& uuid) {
239 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
240 LOGD ("client id:%d\n", client);
243 Socket client_socket(client);
245 m_send_trans.clear();
246 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
247 m_send_trans.put_data(context);
248 m_send_trans.put_data(uuid);
249 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
250 m_send_trans.write_to_socket(client_socket);
253 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
254 LOGD ("client id:%d\n", client);
256 Socket client_socket(client);
258 m_send_trans.clear();
259 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
260 m_send_trans.put_data(context);
261 m_send_trans.put_data(uuid);
262 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
263 m_send_trans.write_to_socket(client_socket);
266 void candidate_more_window_show(int client, uint32 context) {
267 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
268 LOGD ("client id:%d\n", client);
271 Socket client_socket(client);
273 m_send_trans.clear();
274 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
275 m_send_trans.put_data(context);
276 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
277 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
278 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
279 m_send_trans.write_to_socket(client_socket);
282 void candidate_more_window_hide(int client, uint32 context) {
283 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
284 LOGD ("client id:%d\n", client);
286 Socket client_socket(client);
288 m_send_trans.clear();
289 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
290 m_send_trans.put_data(context);
291 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
292 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
293 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
294 m_send_trans.write_to_socket(client_socket);
297 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
298 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
299 LOGD ("client id:%d\n", client);
301 Socket client_socket(client);
303 m_send_trans.clear();
304 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
305 m_send_trans.put_data(context);
306 m_send_trans.put_data(uuid);
307 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
308 m_send_trans.put_data(table);
309 m_send_trans.write_to_socket(client_socket);
312 void select_aux(int client, uint32 contextid, uint32 item) {
313 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
314 LOGD ("client id:%d\n", client);
316 Socket client_socket(client);
317 m_send_trans.clear();
318 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
319 m_send_trans.put_data((uint32) contextid);
321 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
322 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
324 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
325 m_send_trans.put_data((uint32)item);
326 m_send_trans.write_to_socket(client_socket);
329 void select_candidate(int client, uint32 context, uint32 item) {
330 LOGD ("client id:%d\n", client);
332 Socket client_socket(client);
333 m_send_trans.clear();
334 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
335 m_send_trans.put_data((uint32) context);
337 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
338 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
340 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
341 m_send_trans.put_data((uint32)item);
342 m_send_trans.write_to_socket(client_socket);
345 void lookup_table_page_up(int client, uint32 context) {
346 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
347 LOGD ("client id:%d\n", client);
349 Socket client_socket(client);
350 m_send_trans.clear();
351 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
352 m_send_trans.put_data((uint32) context);
354 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
355 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
357 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
358 m_send_trans.write_to_socket(client_socket);
361 void lookup_table_page_down(int client, uint32 context) {
362 LOGD ("client id:%d\n", client);
364 Socket client_socket(client);
365 m_send_trans.clear();
366 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
367 m_send_trans.put_data((uint32) context);
369 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
370 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
372 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
373 m_send_trans.write_to_socket(client_socket);
376 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
377 LOGD ("client id:%d\n", client);
379 Socket client_socket(client);
380 m_send_trans.clear();
381 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
382 m_send_trans.put_data((uint32) context);
384 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
385 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
387 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
388 m_send_trans.put_data(size);
389 m_send_trans.write_to_socket(client_socket);
392 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
393 LOGD ("client id:%d\n", client);
395 Socket client_socket(client);
396 m_send_trans.clear();
397 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
398 m_send_trans.put_data((uint32) context);
400 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
401 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
403 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
404 m_send_trans.put_data(row_items);
405 m_send_trans.write_to_socket(client_socket);
408 void select_associate(int client, uint32 context, uint32 item) {
409 LOGD ("client id:%d\n", client);
411 Socket client_socket(client);
412 m_send_trans.clear();
413 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
414 m_send_trans.put_data((uint32) context);
416 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
417 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
419 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
420 m_send_trans.put_data((uint32)item);
421 m_send_trans.write_to_socket(client_socket);
424 void associate_table_page_up(int client, uint32 context) {
425 LOGD ("client id:%d\n", client);
427 Socket client_socket(client);
428 m_send_trans.clear();
429 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
430 m_send_trans.put_data((uint32) context);
432 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
433 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
435 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
436 m_send_trans.write_to_socket(client_socket);
439 void associate_table_page_down(int client, uint32 context) {
440 LOGD ("client id:%d\n", client);
442 Socket client_socket(client);
443 m_send_trans.clear();
444 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
445 m_send_trans.put_data((uint32) context);
447 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
448 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
450 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
451 m_send_trans.write_to_socket(client_socket);
454 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
455 LOGD ("client id:%d\n", client);
457 Socket client_socket(client);
458 m_send_trans.clear();
459 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
460 m_send_trans.put_data((uint32) context);
462 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
463 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
465 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
466 m_send_trans.put_data(size);
467 m_send_trans.write_to_socket(client_socket);
470 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
471 LOGD ("client id:%d\n", client);
473 Socket client_socket(client);
474 m_send_trans.clear();
475 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
476 m_send_trans.put_data((uint32) context);
478 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
479 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
481 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
482 m_send_trans.put_data(size);
483 m_send_trans.write_to_socket(client_socket);
486 void send_longpress_event(int client, uint32 context, int index) {
487 LOGD ("client id:%d\n", client);
489 Socket client_socket(client);
490 m_send_trans.clear();
491 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
492 m_send_trans.put_data((uint32) context);
494 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
495 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
497 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
498 m_send_trans.put_data(index);
499 m_send_trans.write_to_socket(client_socket);
502 void trigger_property(int client, uint32 context, const String& property) {
503 LOGD ("client id:%d\n", client);
505 Socket client_socket(client);
506 m_send_trans.clear();
507 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
508 m_send_trans.put_data((uint32) context);
510 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
511 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
513 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
514 m_send_trans.put_data(property);
515 m_send_trans.write_to_socket(client_socket);
518 void focus_out_helper(int client, uint32 context, const String& uuid) {
519 LOGD ("client id:%d\n", client);
521 Socket client_socket(client);
522 m_send_trans.clear();
523 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
524 m_send_trans.put_data(context);
525 m_send_trans.put_data(uuid);
526 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
527 m_send_trans.write_to_socket(client_socket);
530 void focus_in_helper(int client, uint32 context, const String& uuid) {
531 LOGD ("client id:%d\n", client);
533 Socket client_socket(client);
534 m_send_trans.clear();
535 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
536 m_send_trans.put_data(context);
537 m_send_trans.put_data(uuid);
538 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
539 m_send_trans.write_to_socket(client_socket);
542 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
543 LOGD ("client id:%d\n", client);
545 Socket client_socket(client);
546 m_send_trans.clear();
547 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
548 m_send_trans.put_data(context);
549 m_send_trans.put_data(uuid);
550 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
551 m_send_trans.put_data(data, len);
552 m_send_trans.write_to_socket(client_socket);
555 void hide_helper(int client, uint32 context, const String& uuid) {
556 LOGD ("client id:%d\n", client);
558 Socket client_socket(client);
559 m_send_trans.clear();
560 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
561 m_send_trans.put_data(context);
562 m_send_trans.put_data(uuid);
563 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
564 m_send_trans.write_to_socket(client_socket);
567 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
568 LOGD ("client id:%d\n", client);
570 Socket client_socket(client);
571 m_send_trans.clear();
572 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
573 m_send_trans.put_data(context);
574 m_send_trans.put_data(uuid);
575 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
576 m_send_trans.put_data(mode);
577 m_send_trans.write_to_socket(client_socket);
580 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
581 LOGD ("client id:%d\n", client);
583 Socket client_socket(client);
584 m_send_trans.clear();
585 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
586 m_send_trans.put_data(context);
587 m_send_trans.put_data(uuid);
588 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
589 m_send_trans.put_data(language);
590 m_send_trans.write_to_socket(client_socket);
593 void set_helper_imdata(int client, uint32 context, const String& uuid, const char* imdata, size_t& len) {
594 LOGD ("client id:%d\n", client);
596 Socket client_socket(client);
597 m_send_trans.clear();
598 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
599 m_send_trans.put_data(context);
600 m_send_trans.put_data(uuid);
601 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
602 m_send_trans.put_data(imdata, len);
603 m_send_trans.write_to_socket(client_socket);
606 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
607 LOGD ("client id:%d\n", client);
609 Socket client_socket(client);
610 m_send_trans.clear();
611 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
612 m_send_trans.put_data(context);
613 m_send_trans.put_data(uuid);
614 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
615 m_send_trans.put_data(type);
616 m_send_trans.write_to_socket(client_socket);
619 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
620 LOGD ("client id:%d\n", client);
622 Socket client_socket(client);
625 trans.put_command(SCIM_TRANS_CMD_REPLY);
626 trans.put_data(context);
627 trans.put_data(uuid);
628 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
632 if (trans.write_to_socket(client_socket)
633 && trans.read_from_socket(client_socket)
634 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
635 && trans.get_data(type)) {
636 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
639 LOGW ("read failed\n");
643 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
644 LOGD ("client id:%d\n", client);
646 Socket client_socket(client);
647 m_send_trans.clear();
648 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
649 m_send_trans.put_data(context);
650 m_send_trans.put_data(uuid);
651 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
652 m_send_trans.put_data(disabled);
653 m_send_trans.write_to_socket(client_socket);
656 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
658 Socket client_socket(client);
659 LOGD ("client id:%d", client);
664 trans.put_command(SCIM_TRANS_CMD_REPLY);
665 trans.put_data(context);
666 trans.put_data(uuid);
667 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
671 if (trans.write_to_socket(client_socket)
672 && trans.read_from_socket(client_socket)
673 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
674 && trans.get_data(disabled)) {
675 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
678 LOGW ("read failed");
682 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
683 LOGD ("client id:%d\n", client);
685 Socket client_socket(client);
686 m_send_trans.clear();
687 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
688 m_send_trans.put_data(context);
689 m_send_trans.put_data(uuid);
690 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
691 m_send_trans.put_data(layout);
692 m_send_trans.write_to_socket(client_socket);
695 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
696 LOGD ("client id:%d\n", client);
698 Socket client_socket(client);
699 m_send_trans.clear();
700 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
701 m_send_trans.put_data(context);
702 m_send_trans.put_data(uuid);
703 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
704 m_send_trans.put_data(mode);
705 m_send_trans.write_to_socket(client_socket);
708 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
709 LOGD ("client id:%d\n", client);
711 Socket client_socket(client);
712 m_send_trans.clear();
713 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
714 m_send_trans.put_data(context);
715 m_send_trans.put_data(uuid);
716 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
717 m_send_trans.put_data(hint);
718 m_send_trans.write_to_socket(client_socket);
721 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
722 LOGD ("client id:%d\n", client);
724 Socket client_socket(client);
725 m_send_trans.clear();
726 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
727 m_send_trans.put_data(context);
728 m_send_trans.put_data(uuid);
729 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
730 m_send_trans.put_data(direction);
731 m_send_trans.write_to_socket(client_socket);
734 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
735 LOGD ("client id:%d\n", client);
737 Socket client_socket(client);
738 m_send_trans.clear();
739 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
740 m_send_trans.put_data(context);
741 m_send_trans.put_data(uuid);
742 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
743 m_send_trans.put_data(mode);
744 m_send_trans.write_to_socket(client_socket);
747 void show_helper_option_window(int client, uint32 context, const String& uuid) {
748 LOGD ("client id:%d\n", client);
750 Socket client_socket(client);
751 m_send_trans.clear();
752 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
753 m_send_trans.put_data(context);
754 m_send_trans.put_data(uuid);
755 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
756 m_send_trans.write_to_socket(client_socket);
759 void resume_helper_option_window(int client, uint32 context, const String& uuid) {
760 LOGD ("client id:%d\n", client);
762 Socket client_socket(client);
763 m_send_trans.clear();
764 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
765 m_send_trans.put_data(context);
766 m_send_trans.put_data(uuid);
767 m_send_trans.put_command(ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW);
768 m_send_trans.write_to_socket(client_socket);
771 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) {
772 LOGD ("client id:%d\n", client);
774 Socket client_socket(client);
779 trans.put_command(SCIM_TRANS_CMD_REPLY);
780 trans.put_data(context);
781 trans.put_data(uuid);
782 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
784 trans.put_data(serial);
786 if (trans.write_to_socket(client_socket)) {
787 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
790 LOGW ("read failed\n");
796 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
797 LOGD ("client id:%d\n", client);
799 Socket client_socket(client);
803 trans.put_command(SCIM_TRANS_CMD_REPLY);
804 trans.put_data(context);
805 trans.put_data(uuid);
806 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
808 if (trans.write_to_socket(client_socket)) {
813 if (trans.read_from_socket(client_socket)
814 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
815 && trans.get_data(info.pos_x)
816 && trans.get_data(info.pos_y)
817 && trans.get_data(info.width)
818 && trans.get_data(info.height)) {
819 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
822 LOGW ("read failed\n");
824 LOGW ("write failed\n");
829 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
830 LOGD ("client id:%d\n", client);
831 Socket client_socket(client);
835 trans.put_command(SCIM_TRANS_CMD_REPLY);
836 trans.put_data(context);
837 trans.put_data(uuid);
838 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
842 if (trans.write_to_socket(client_socket)
843 && trans.read_from_socket(client_socket)
844 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY) {
845 trans.get_data(imdata, len);
846 LOGD ("length of imdata is %d", len);
848 LOGW ("read imdata failed\n");
852 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
853 LOGD ("client id:%d\n", client);
855 Socket client_socket(client);
859 trans.put_command(SCIM_TRANS_CMD_REPLY);
860 trans.put_data(context);
861 trans.put_data(uuid);
862 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
866 if (trans.write_to_socket(client_socket)
867 && trans.read_from_socket(client_socket)
868 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
869 && trans.get_data(layout)) {
870 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
875 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
876 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
877 LOGD ("client id:%d\n", client);
882 trans.put_command(SCIM_TRANS_CMD_REPLY);
883 trans.put_data(context);
884 trans.put_data(uuid);
885 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
888 Socket client_socket(client);
890 if (trans.write_to_socket(client_socket)
891 && trans.read_from_socket(client_socket)
892 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
893 && trans.get_data(data, len)) {
899 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
900 LOGD ("client id:%d\n", client);
903 Socket client_socket(client);
908 trans.put_command(SCIM_TRANS_CMD_REPLY);
909 trans.put_data(context);
910 trans.put_data(uuid);
911 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
912 trans.write_to_socket(client_socket);
914 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
915 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
916 !trans.get_data(avail)) {
917 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed\n");
921 void reset_ise_option(int client, uint32 context) {
922 LOGD ("client id:%d\n", client);
924 Socket client_socket(client);
925 m_send_trans.clear();
926 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
927 m_send_trans.put_data((uint32) context);
928 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
929 m_send_trans.write_to_socket(client_socket);
932 void reset_helper_context(int client, uint32 context, const String& uuid) {
933 LOGD ("client id:%d\n", client);
935 Socket client_socket(client);
936 m_send_trans.clear();
937 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
938 m_send_trans.put_data(context);
939 m_send_trans.put_data(uuid);
940 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
941 m_send_trans.write_to_socket(client_socket);
944 void reload_config(int client) {
945 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
946 LOGD ("client id:%d\n", client);
948 m_send_trans.clear();
949 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
950 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
952 Socket client_socket(client);
953 m_send_trans.write_to_socket(client_socket);
956 void exit(int client, uint32 context) {
957 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
958 LOGD ("client id:%d\n", client);
960 m_send_trans.clear();
961 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
963 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
964 m_send_trans.put_data(context);
965 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
968 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
970 Socket client_socket(client);
971 m_send_trans.write_to_socket(client_socket);
974 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
975 LOGD("client id:%d\n", client);
977 Socket client_socket(client);
982 trans.put_command(SCIM_TRANS_CMD_REPLY);
983 trans.put_data(context);
984 trans.put_data(uuid);
985 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
986 trans.put_data(type);
987 trans.put_data(data, len);
990 if (trans.write_to_socket(client_socket)
991 && trans.read_from_socket(client_socket)
992 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
993 && trans.get_data(result)) {
994 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
998 LOGW("read failed\n");
1004 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
1005 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1006 LOGD ("client id:%d\n", client);
1008 Socket client_socket(client);
1010 m_send_trans.clear();
1011 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1012 m_send_trans.put_data(context);
1013 m_send_trans.put_data(uuid);
1014 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1015 m_send_trans.put_data(text);
1016 m_send_trans.put_data(cursor);
1017 m_send_trans.write_to_socket(client_socket);
1020 void socket_remoteinput_focus_in (int client) {
1021 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1022 LOGD ("client id:%d\n", client);
1025 ret = (client == -1) ? false : true;
1028 Socket client_socket(client);
1030 m_send_trans.clear();
1031 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1032 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_IN);
1033 m_send_trans.write_to_socket(client_socket);
1037 void socket_remoteinput_focus_out (int client) {
1038 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1039 LOGD ("client id:%d\n", client);
1042 ret = (client == -1) ? false : true;
1045 Socket client_socket(client);
1047 m_send_trans.clear();
1048 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1049 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_OUT);
1050 m_send_trans.write_to_socket(client_socket);
1054 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type, int return_key_disabled) {
1055 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1056 LOGD ("client id:%d\n", client);
1059 ret = (client == -1) ? false : true;
1062 Socket client_socket(client);
1064 m_send_trans.clear();
1065 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1066 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_ENTRY_METADATA);
1067 m_send_trans.put_data(hint);
1068 m_send_trans.put_data(layout);
1069 m_send_trans.put_data(variation);
1070 m_send_trans.put_data(autocapital_type);
1071 m_send_trans.put_data(return_key_disabled);
1072 m_send_trans.write_to_socket(client_socket);
1076 void socket_remoteinput_surrounding_text (int client, String& text, uint32 cursor) {
1077 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1078 LOGD ("client id:%d\n", client);
1081 ret = (client == -1) ? false : true;
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_command(ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT);
1089 m_send_trans.put_data(text);
1090 m_send_trans.put_data(cursor);
1091 m_send_trans.write_to_socket(client_socket);
1095 void socket_remoteinput_input_resource (int client, uint32 input_resource) {
1096 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1097 LOGD ("client id:%d\n", client);
1100 ret = (client == -1) ? false : true;
1103 Socket client_socket(client);
1105 m_send_trans.clear();
1106 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1107 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE);
1108 m_send_trans.put_data(input_resource);
1109 m_send_trans.write_to_socket(client_socket);
1113 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1114 LOGD ("client id:%d\n", client);
1116 Socket client_socket(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_SELECTION);
1123 m_send_trans.put_data(text);
1124 m_send_trans.write_to_socket(client_socket);
1127 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1128 LOGD ("client id:%d\n", client);
1130 Socket socket_client(client);
1131 m_send_trans.clear();
1132 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1133 m_send_trans.put_data(context);
1134 m_send_trans.put_data(uuid);
1135 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1136 m_send_trans.put_data(list.size());
1138 for (unsigned int i = 0; i < list.size(); i++)
1139 m_send_trans.put_data(list[i]);
1141 m_send_trans.write_to_socket(socket_client);
1144 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1145 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
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_CANDIDATE_UI);
1155 m_send_trans.put_data(style);
1156 m_send_trans.put_data(mode);
1157 m_send_trans.write_to_socket(socket_client);
1160 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1161 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1163 LOGD ("client id:%d\n", client);
1165 Socket socket_client(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(uuid);
1170 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1171 m_send_trans.put_data(info.pos_x);
1172 m_send_trans.put_data(info.pos_y);
1173 m_send_trans.put_data(info.width);
1174 m_send_trans.put_data(info.height);
1175 m_send_trans.write_to_socket(socket_client);
1178 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1179 LOGD ("client id:%d\n", client);
1181 Socket socket_client(client);
1182 m_send_trans.clear();
1183 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1184 m_send_trans.put_data(context);
1185 m_send_trans.put_data(uuid);
1186 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1187 m_send_trans.put_data(ise_name);
1188 m_send_trans.put_data(ise_uuid);
1189 m_send_trans.write_to_socket(socket_client);
1192 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1193 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1195 LOGD ("client id:%d\n", client);
1197 Socket client_socket(client);
1198 m_send_trans.clear();
1199 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1200 m_send_trans.put_data(context);
1201 m_send_trans.put_data(ic_uuid);
1202 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1203 m_send_trans.write_to_socket(client_socket);
1206 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1207 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1209 LOGD ("client id:%d\n", client);
1211 Socket client_socket(client);
1212 m_send_trans.clear();
1213 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1214 m_send_trans.put_data(context);
1215 m_send_trans.put_data(ic_uuid);
1216 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1217 m_send_trans.write_to_socket(client_socket);
1220 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1221 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1222 LOGD ("client id:%d\n", client);
1224 Socket client_socket(client);
1228 m_send_trans.clear();
1229 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1231 /* FIXME: We presume that client and context are both less than 65536.
1232 * Hopefully, it should be true in any UNIXs.
1233 * So it's ok to combine client and context into one uint32. */
1234 m_send_trans.put_data(context);
1235 m_send_trans.put_data(ic_uuid);
1236 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1237 m_send_trans.put_data(_nest_trans);
1238 m_send_trans.write_to_socket(client_socket);
1243 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1244 LOGD ("client id:%d\n", client);
1246 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1247 Socket socket_client(client);
1249 m_send_trans.clear();
1250 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1251 m_send_trans.put_data(context);
1252 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1253 m_send_trans.put_data(target_uuid);
1254 m_send_trans.put_data(active_uuid);
1255 m_send_trans.put_data(nest_trans);
1256 m_send_trans.write_to_socket(socket_client);
1261 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1262 LOGD ("client id:%d\n", client);
1264 Socket socket_client(client);
1266 m_send_trans.clear();
1267 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1268 m_send_trans.put_data(context);
1269 m_send_trans.put_command(cmd);
1270 m_send_trans.put_data(key);
1271 m_send_trans.write_to_socket(socket_client);
1275 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1276 LOGD ("client id:%d\n", client);
1278 Socket socket_client(client);
1280 m_send_trans.clear();
1281 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1282 m_send_trans.put_data(target_context);
1283 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1284 m_send_trans.put_data(wstr);
1285 m_send_trans.write_to_socket(socket_client);
1289 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1290 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1291 LOGD ("client id:%d\n", client);
1293 Socket socket_client(client);
1295 m_send_trans.clear();
1296 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1297 m_send_trans.put_data(context_id);
1298 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1299 m_send_trans.put_data(maxlen_before);
1300 m_send_trans.put_data(maxlen_after);
1301 m_send_trans.write_to_socket(socket_client);
1305 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1306 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1307 LOGD ("client id:%d\n", client);
1309 Socket socket_client(client);
1311 m_send_trans.clear();
1312 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1313 m_send_trans.put_data(context_id);
1314 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1315 m_send_trans.put_data(offset);
1316 m_send_trans.put_data(len);
1317 m_send_trans.write_to_socket(socket_client);
1321 void socket_helper_get_selection(int client, uint32 context_id) {
1322 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1323 LOGD ("client id:%d\n", client);
1326 Socket socket_client(client);
1328 m_send_trans.clear();
1329 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1330 m_send_trans.put_data(context_id);
1331 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1332 m_send_trans.write_to_socket(socket_client);
1336 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1337 LOGD ("client id:%d\n", client);
1339 Socket socket_client(client);
1341 m_send_trans.clear();
1342 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1343 m_send_trans.put_data(context_id);
1344 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1345 m_send_trans.put_data(start);
1346 m_send_trans.put_data(end);
1347 m_send_trans.write_to_socket(socket_client);
1351 void show_preedit_string(int client, uint32 target_context) {
1352 LOGD ("client id:%d\n", client);
1354 Socket socket_client(client);
1356 m_send_trans.clear();
1357 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1358 m_send_trans.put_data(target_context);
1359 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1360 m_send_trans.write_to_socket(socket_client);
1364 void hide_preedit_string(int client, uint32 target_context) {
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(target_context);
1372 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1373 m_send_trans.write_to_socket(socket_client);
1377 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1378 LOGD ("client id:%d\n", client);
1380 Socket socket_client(client);
1382 m_send_trans.clear();
1383 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1384 m_send_trans.put_data(target_context);
1385 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1386 m_send_trans.put_data(preedit);
1387 m_send_trans.put_data(commit);
1388 m_send_trans.put_data(attrs);
1389 m_send_trans.put_data(caret);
1390 m_send_trans.write_to_socket(socket_client);
1395 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1397 LOGD ("client id:%d\n", client);
1399 Socket socket_client(client);
1401 m_send_trans.clear();
1402 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1403 m_send_trans.put_data(focused_context);
1404 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1405 m_send_trans.put_data(caret);
1406 m_send_trans.write_to_socket(socket_client);
1411 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1412 LOGD ("client id:%d\n", client);
1414 Socket socket_client(client);
1415 m_send_trans.clear();
1416 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1417 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1418 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1420 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1421 m_send_trans.put_data(helper_ic_index[i].first);
1422 m_send_trans.put_data(helper_ic_index[i].second);
1425 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1426 m_send_trans.put_data((uint32)current_screen);
1427 m_send_trans.write_to_socket(socket_client);
1430 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1431 LOGD ("client id:%d\n", client);
1433 Socket client_socket(client);
1434 m_send_trans.clear();
1435 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1436 m_send_trans.put_data(focused_context);
1437 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1438 m_send_trans.put_data(type);
1439 m_send_trans.put_data(value);
1440 m_send_trans.write_to_socket(client_socket);
1444 void send_private_command(int client, uint32 focused_context, String command) {
1445 LOGD ("client id:%d\n", client);
1447 Socket socket_client(client);
1449 m_send_trans.clear();
1450 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1451 m_send_trans.put_data(focused_context);
1452 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1453 m_send_trans.put_data(command);
1454 m_send_trans.write_to_socket(socket_client);
1458 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1459 LOGD ("client id:%d\n", client);
1461 m_send_trans.clear();
1462 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1464 /* FIXME: We presume that client and context are both less than 65536.
1465 * Hopefully, it should be true in any UNIXs.
1466 * So it's ok to combine client and context into one uint32. */
1467 m_send_trans.put_data(context_id);
1468 m_send_trans.put_data(uuid);
1469 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1470 m_send_trans.put_data((uint32) x);
1471 m_send_trans.put_data((uint32) y);
1473 Socket client_socket(client);
1474 m_send_trans.write_to_socket(client_socket);
1478 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1479 LOGD ("client id:%d\n", client);
1481 m_send_trans.clear();
1482 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1483 m_send_trans.put_data(context_id);
1484 m_send_trans.put_data(uuid);
1485 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1486 m_send_trans.put_data((uint32) cursor_pos);
1488 Socket client_socket(client);
1489 m_send_trans.write_to_socket(client_socket);
1493 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1494 LOGD ("client id:%d\n", client);
1496 m_send_trans.clear();
1497 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1499 /* FIXME: We presume that client and context are both less than 65536.
1500 * Hopefully, it should be true in any UNIXs.
1501 * So it's ok to combine client and context into one uint32. */
1502 m_send_trans.put_data(context_id);
1503 m_send_trans.put_data(uuid);
1504 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1505 m_send_trans.put_data((uint32) screen);
1507 Socket client_socket(client);
1508 m_send_trans.write_to_socket(client_socket);
1512 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1513 LOGD ("client id:%d\n", client);
1515 m_send_trans.clear();
1516 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1518 m_send_trans.put_data(context);
1519 m_send_trans.put_data(uuid);
1520 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1521 m_send_trans.put_data((uint32) mode);
1523 Socket client_socket(client);
1524 m_send_trans.write_to_socket(client_socket);
1527 void remote_update_preedit_string (int client, uint32 target_context, const WideString str, const WideString commit, const AttributeList &attrs, uint32 caret) {
1528 LOGD("client id:%d\n", client);
1530 Socket client_socket(client);
1532 m_send_trans.clear();
1533 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1534 m_send_trans.put_data(target_context);
1535 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1536 m_send_trans.put_data(str);
1537 m_send_trans.put_data(commit);
1538 m_send_trans.put_data(attrs);
1539 m_send_trans.put_data(caret);
1540 m_send_trans.write_to_socket(client_socket);
1544 void remote_send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1545 LOGD("client id:%d\n", client);
1547 Socket client_socket(client);
1549 m_send_trans.clear ();
1550 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1551 m_send_trans.put_data (target_context);
1552 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1553 m_send_trans.put_data (key);
1554 m_send_trans.write_to_socket (client_socket);
1558 void remote_forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1559 LOGD("client id:%d\n", client);
1561 Socket client_socket(client);
1563 m_send_trans.clear ();
1564 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1565 m_send_trans.put_data (target_context);
1566 m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
1567 m_send_trans.put_data (key);
1568 m_send_trans.write_to_socket (client_socket);
1572 void remote_commit_string (int client, uint32 target_context, const WideString& wstr) {
1573 LOGD ("client id:%d\n", client);
1575 Socket socket_client(client);
1577 m_send_trans.clear();
1578 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1579 m_send_trans.put_data(target_context);
1580 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1581 m_send_trans.put_data(wstr);
1582 m_send_trans.write_to_socket(socket_client);
1586 void remote_delete_surrounding_text (int client, uint32 context_id, uint32 offset, uint32 len) {
1587 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1588 LOGD ("client id:%d\n", client);
1590 Socket socket_client(client);
1592 m_send_trans.clear();
1593 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1594 m_send_trans.put_data(context_id);
1595 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1596 m_send_trans.put_data(offset);
1597 m_send_trans.put_data(len);
1598 m_send_trans.write_to_socket(socket_client);
1602 void set_prediction_allow (int client, uint32 context, String uuid, int mode) {
1603 LOGD ("client id:%d\n", client);
1605 m_send_trans.clear();
1606 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1608 m_send_trans.put_data(context);
1609 m_send_trans.put_data(uuid);
1610 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_ALLOW);
1611 m_send_trans.put_data((uint32) mode);
1613 Socket client_socket(client);
1614 m_send_trans.write_to_socket(client_socket);
1618 static void send_fail_reply (int client_id)
1620 Socket client_socket (client_id);
1623 trans.put_command (SCIM_TRANS_CMD_REPLY);
1624 trans.put_command (SCIM_TRANS_CMD_FAIL);
1625 trans.write_to_socket (client_socket);
1628 bool filter_event(int fd) {
1629 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1631 return m_socket_server.filter_event(fd);
1634 bool filter_exception_event(int fd) {
1635 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1637 return m_socket_server.filter_exception_event(fd);
1640 int get_server_id() {
1641 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1643 return m_socket_server.get_id();
1646 bool socket_check_client_connection(const Socket& client) {
1647 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1649 unsigned char buf [sizeof(uint32)];
1651 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1653 if (nbytes == sizeof(uint32))
1657 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1659 LOGW ("Timeout when reading socket\n");
1666 * @brief Callback function for ecore fd handler.
1668 * @param data The data to pass to this callback.
1669 * @param fd_handler The ecore fd handler.
1671 * @return ECORE_CALLBACK_RENEW
1673 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1674 if (fd_handler == NULL || data == NULL)
1675 return ECORE_CALLBACK_RENEW;
1677 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1679 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1681 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1682 if (fd_handler == _agent->_read_handler_list [i]) {
1683 if (!_agent->filter_event(fd)) {
1684 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1686 ecore_main_fd_handler_del(fd_handler);
1688 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1691 return ECORE_CALLBACK_RENEW;
1695 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1696 _agent->filter_exception_event(fd);
1698 ecore_main_fd_handler_del(fd_handler);
1700 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1701 return ECORE_CALLBACK_RENEW;
1704 void socket_accept_callback(SocketServer* server,
1705 const Socket& client) {
1706 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1710 if (m_should_exit) {
1711 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1714 //m_signal_accept_connection (client.get_id ());
1715 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1716 _read_handler_list.push_back(panel_agent_read_handler);
1722 void socket_receive_callback(SocketServer* server,
1723 const Socket& client) {
1724 int client_id = client.get_id();
1730 ClientInfo client_info;
1732 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1734 /* If the connection is closed then close this client. */
1735 if (!socket_check_client_connection(client)) {
1736 LOGW ("check client connection failed\n");
1737 socket_close_connection(server, client);
1741 client_info = m_info_manager->socket_get_client_info(client_id);
1743 /* If it's a new client, then request to open the connection first. */
1744 if (client_info.type == UNKNOWN_CLIENT) {
1745 socket_open_connection(server, client);
1749 /* If can not read the transaction,
1750 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1751 * or the key is mismatch,
1753 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1754 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1755 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1756 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1760 if (client_info.type == FRONTEND_ACT_CLIENT) {
1761 if (m_recv_trans.get_data(context)) {
1762 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1763 socket_transaction_start();
1765 while (m_recv_trans.get_command(cmd)) {
1766 LOGD ("PanelAgent::cmd = %d\n", cmd);
1768 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1771 if (m_recv_trans.get_data(id)) {
1772 m_info_manager->register_panel_client(client_id, id);
1774 LOGW ("wrong format of transaction\n");
1780 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1781 if (m_recv_trans.get_data(uuid)) {
1782 m_info_manager->register_input_context(client_id, context, uuid);
1784 LOGW ("wrong format of transaction\n");
1790 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1791 m_info_manager->remove_input_context(client_id, context);
1795 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1796 m_info_manager->socket_reset_input_context(client_id, context);
1800 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1801 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1803 if (m_recv_trans.get_data(uuid)) {
1804 m_info_manager->focus_in(client_id, context, uuid);
1806 LOGW ("wrong format of transaction\n");
1812 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1815 if (m_recv_trans.get_data(isOn)) {
1816 m_info_manager->socket_turn_on_log(isOn);
1818 LOGW ("wrong format of transaction\n");
1824 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1825 m_info_manager->show_isf_panel(client_id);
1827 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1828 m_info_manager->hide_isf_panel(client_id);
1830 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1837 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1840 LOGW ("wrong format of transaction\n");
1844 Socket client_socket(client_id);
1847 trans.put_command(SCIM_TRANS_CMD_REPLY);
1848 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1849 trans.put_data(ret);
1850 trans.write_to_socket(client_socket);
1856 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1859 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1863 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1864 m_info_manager->hide_ise_panel(client_id, client, context);
1866 LOGW ("wrong format of transaction\n");
1870 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1871 struct rectinfo info;
1872 m_info_manager->get_input_panel_geometry(client_id, info);
1874 Socket client_socket(client_id);
1877 trans.put_command(SCIM_TRANS_CMD_REPLY);
1878 trans.put_command(SCIM_TRANS_CMD_OK);
1879 trans.put_data(info.pos_x);
1880 trans.put_data(info.pos_y);
1881 trans.put_data(info.width);
1882 trans.put_data(info.height);
1883 trans.write_to_socket(client_socket);
1885 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1886 struct rectinfo info;
1887 m_info_manager->get_candidate_window_geometry(client_id, info);
1889 Socket client_socket(client_id);
1892 trans.put_command(SCIM_TRANS_CMD_REPLY);
1893 trans.put_command(SCIM_TRANS_CMD_OK);
1894 trans.put_data(info.pos_x);
1895 trans.put_data(info.pos_y);
1896 trans.put_data(info.width);
1897 trans.put_data(info.height);
1898 trans.write_to_socket(client_socket);
1900 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1903 m_info_manager->get_ise_language_locale(client_id, &data, len);
1906 trans.put_command(SCIM_TRANS_CMD_REPLY);
1908 if (data != NULL && len > 0) {
1909 trans.put_command(SCIM_TRANS_CMD_OK);
1910 trans.put_data(data, len);
1912 trans.put_command(SCIM_TRANS_CMD_FAIL);
1915 Socket client_socket(client_id);
1916 trans.write_to_socket(client_socket);
1922 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1925 if (m_recv_trans.get_data(language)) {
1926 m_info_manager->set_ise_language(client_id, language);
1928 LOGW ("wrong format of transaction\n");
1932 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1933 char* imdata = NULL;
1936 if (m_recv_trans.get_data(&imdata, len)) {
1937 m_info_manager->set_ise_imdata(client_id, imdata, len);
1939 LOGW ("wrong format of transaction\n");
1946 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1947 char* imdata = NULL;
1949 m_info_manager->get_ise_imdata(client_id, &imdata, len);
1951 Socket client_socket(client_id);
1954 trans.put_command(SCIM_TRANS_CMD_REPLY);
1957 trans.put_command(SCIM_TRANS_CMD_OK);
1958 trans.put_data(imdata, len);
1960 trans.put_command(SCIM_TRANS_CMD_FAIL);
1963 trans.write_to_socket(client_socket);
1969 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
1972 if (m_recv_trans.get_data(type)) {
1973 m_info_manager->set_ise_return_key_type(client_id, type);
1975 LOGW ("wrong format of transaction\n");
1979 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
1981 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
1983 Socket client_socket(client_id);
1986 trans.put_command(SCIM_TRANS_CMD_REPLY);
1989 trans.put_command(SCIM_TRANS_CMD_OK);
1990 trans.put_data(type);
1992 trans.put_command(SCIM_TRANS_CMD_FAIL);
1995 trans.write_to_socket(client_socket);
1997 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
2000 if (m_recv_trans.get_data(disabled)) {
2001 m_info_manager->set_ise_return_key_disable(client_id, disabled);
2003 LOGW ("wrong format of transaction\n");
2007 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
2010 m_info_manager->get_ise_return_key_disable(client_id, disabled);
2012 Socket client_socket(client_id);
2015 trans.put_command(SCIM_TRANS_CMD_REPLY);
2018 trans.put_command(SCIM_TRANS_CMD_OK);
2019 trans.put_data(disabled);
2021 trans.put_command(SCIM_TRANS_CMD_FAIL);
2024 trans.write_to_socket(client_socket);
2026 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
2028 bool ret = m_info_manager->get_ise_layout(client_id, layout);
2030 Socket client_socket(client_id);
2033 trans.put_command(SCIM_TRANS_CMD_REPLY);
2036 trans.put_command(SCIM_TRANS_CMD_OK);
2037 trans.put_data(layout);
2039 trans.put_command(SCIM_TRANS_CMD_FAIL);
2042 trans.write_to_socket(client_socket);
2044 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
2047 if (m_recv_trans.get_data(layout)) {
2048 m_info_manager->set_ise_layout(client_id, layout);
2050 LOGW ("wrong format of transaction\n");
2054 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
2057 if (m_recv_trans.get_data(mode)) {
2058 m_info_manager->set_ise_caps_mode(client_id, mode);
2060 LOGW ("wrong format of transaction\n");
2064 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
2065 m_info_manager->will_show_ack(client_id);
2067 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
2068 m_info_manager->will_hide_ack(client_id);
2070 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
2073 if (m_recv_trans.get_data(mode)) {
2074 m_info_manager->set_keyboard_mode(client_id, mode);
2076 LOGW ("wrong format of transaction\n");
2080 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2081 m_info_manager->candidate_will_hide_ack(client_id);
2083 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2089 if (m_recv_trans.get_data(key)) {
2091 m_info_manager->process_key_event(key, result);
2093 LOGW ("wrong format of transaction\n");
2097 Socket client_socket(client_id);
2100 trans.put_command(SCIM_TRANS_CMD_REPLY);
2103 trans.put_command(SCIM_TRANS_CMD_OK);
2104 trans.put_data(result);
2106 trans.put_command(SCIM_TRANS_CMD_FAIL);
2109 trans.write_to_socket(client_socket);
2111 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2113 m_info_manager->get_active_helper_option(client_id, option);
2115 Socket client_socket(client_id);
2118 trans.put_command(SCIM_TRANS_CMD_REPLY);
2119 trans.put_command(SCIM_TRANS_CMD_OK);
2120 trans.put_data(option);
2121 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2122 trans.write_to_socket(client_socket);
2124 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2126 m_info_manager->get_ise_state(client_id, state);
2128 Socket client_socket(client_id);
2131 trans.put_command(SCIM_TRANS_CMD_REPLY);
2132 trans.put_command(SCIM_TRANS_CMD_OK);
2133 trans.put_data(state);
2134 trans.write_to_socket(client_socket);
2136 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2139 if (m_recv_trans.get_data(input_mode)) {
2140 m_info_manager->set_ise_input_mode(client_id, input_mode);
2142 LOGW ("wrong format of transaction\n");
2146 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2149 if (m_recv_trans.get_data(input_hint)) {
2150 m_info_manager->set_ise_input_hint(client_id, input_hint);
2152 LOGW ("wrong format of transaction\n");
2156 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2157 uint32 bidi_direction;
2159 if (m_recv_trans.get_data(bidi_direction)) {
2160 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2162 LOGW ("wrong format of transaction\n");
2166 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2167 m_info_manager->show_ise_option_window(client_id);
2169 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
2170 m_info_manager->resume_ise_option_window(client_id);
2177 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2180 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2181 m_info_manager->socket_start_helper(client_id, context, uuid);
2183 LOGW ("wrong format of transaction\n");
2187 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2190 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2191 uuid.length() && m_nest_trans.valid()) {
2192 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2194 LOGW ("wrong format of transaction\n");
2198 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2201 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2202 m_info_manager->socket_stop_helper(client_id, context, uuid);
2204 LOGW ("wrong format of transaction\n");
2213 /* Client must focus in before do any other things. */
2214 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2215 m_info_manager->socket_turn_on();
2216 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2217 m_info_manager->socket_turn_off();
2218 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2221 if (m_recv_trans.get_data(num))
2222 m_info_manager->socket_update_screen(client_id, num);
2224 LOGW ("wrong format of transaction\n");
2225 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2228 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2229 m_info_manager->socket_update_spot_location(x, y, top_y);
2231 LOGW ("wrong format of transaction\n");
2233 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2236 if (m_recv_trans.get_data(cursor_pos)) {
2237 m_info_manager->socket_update_cursor_position(cursor_pos);
2239 LOGW ("wrong format of transaction\n");
2241 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2245 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2246 m_info_manager->socket_update_surrounding_text(text, cursor);
2248 LOGW ("wrong format of transaction\n");
2250 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2253 if (m_recv_trans.get_data(text)) {
2254 m_info_manager->socket_update_selection(text);
2256 LOGW ("wrong format of transaction\n");
2258 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2259 m_info_manager->expand_candidate();
2260 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2261 m_info_manager->contract_candidate();
2262 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2263 uint32 portrait_line, mode;
2265 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2266 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2268 LOGW ("wrong format of transaction\n");
2269 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2270 PanelFactoryInfo info;
2272 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2273 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2274 m_info_manager->socket_update_factory_info(info);
2276 LOGW ("wrong format of transaction\n");
2278 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2279 m_info_manager->socket_show_preedit_string();
2280 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2281 m_info_manager->socket_show_aux_string();
2282 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2283 m_info_manager->socket_show_lookup_table();
2284 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2285 m_info_manager->socket_show_associate_table();
2286 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2287 m_info_manager->socket_hide_preedit_string();
2288 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2289 m_info_manager->socket_hide_aux_string();
2290 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2291 m_info_manager->socket_hide_lookup_table();
2292 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2293 m_info_manager->socket_hide_associate_table();
2294 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2296 AttributeList attrs;
2299 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2300 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2302 LOGW ("wrong format of transaction\n");
2303 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2306 if (m_recv_trans.get_data(caret))
2307 m_info_manager->socket_update_preedit_caret(caret);
2309 LOGW ("wrong format of transaction\n");
2310 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2312 AttributeList attrs;
2314 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2315 m_info_manager->socket_update_aux_string(str, attrs);
2317 LOGW ("wrong format of transaction\n");
2318 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2319 CommonLookupTable _isf_candidate_table;
2321 if (m_recv_trans.get_data(_isf_candidate_table))
2322 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2324 LOGW ("wrong format of transaction\n");
2326 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2327 CommonLookupTable table;
2329 if (m_recv_trans.get_data(table))
2330 m_info_manager->socket_update_associate_table(table);
2332 LOGW ("wrong format of transaction\n");
2333 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2334 PropertyList properties;
2336 if (m_recv_trans.get_data(properties))
2337 m_info_manager->socket_register_properties(properties);
2339 LOGW ("wrong format of transaction\n");
2340 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2343 if (m_recv_trans.get_data(property))
2344 m_info_manager->socket_update_property(property);
2346 LOGW ("wrong format of transaction\n");
2347 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2350 if (m_recv_trans.get_data(help))
2351 m_info_manager->socket_show_help(help);
2353 LOGW ("wrong format of transaction\n");
2354 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2355 PanelFactoryInfo info;
2356 std::vector <PanelFactoryInfo> vec;
2358 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2359 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2360 info.lang = scim_get_normalized_language(info.lang);
2361 vec.push_back(info);
2364 m_info_manager->socket_show_factory_menu(vec);
2365 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2366 m_info_manager->focus_out(client_id, context);
2368 LOGW ("unknow cmd: %d\n", cmd);
2372 socket_transaction_end();
2374 } else if (client_info.type == FRONTEND_CLIENT) {
2375 if (m_recv_trans.get_data(context)) {
2376 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2377 socket_transaction_start();
2379 while (m_recv_trans.get_command(cmd)) {
2380 LOGD ("PanelAgent::cmd = %d\n", cmd);
2382 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2383 Socket client_socket(client_id);
2387 trans.put_command(SCIM_TRANS_CMD_REPLY);
2388 trans.put_command(SCIM_TRANS_CMD_OK);
2389 trans.put_data(client_id);
2390 trans.write_to_socket(client_socket);
2393 LOGW ("unknow cmd: %d\n", cmd);
2397 socket_transaction_end();
2399 } else if (client_info.type == HELPER_CLIENT) {
2400 socket_transaction_start();
2402 while (m_recv_trans.get_command(cmd)) {
2403 LOGD ("PanelAgent::cmd = %d\n", cmd);
2405 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2408 if (m_recv_trans.get_data(info.uuid) &&
2409 m_recv_trans.get_data(info.name) &&
2410 m_recv_trans.get_data(info.icon) &&
2411 m_recv_trans.get_data(info.description) &&
2412 m_recv_trans.get_data(info.option) &&
2413 info.uuid.length()) {
2414 m_info_manager->socket_helper_register_helper(client_id, info);
2417 LOGW ("unknow cmd: %d\n", cmd);
2421 socket_transaction_end();
2422 } else if (client_info.type == HELPER_ACT_CLIENT) {
2423 socket_transaction_start();
2425 while (m_recv_trans.get_command(cmd)) {
2426 LOGD ("PanelAgent::cmd = %d\n", cmd);
2428 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2431 if (m_recv_trans.get_data(info.uuid) &&
2432 m_recv_trans.get_data(info.name) &&
2433 m_recv_trans.get_data(info.icon) &&
2434 m_recv_trans.get_data(info.description) &&
2435 m_recv_trans.get_data(info.option) &&
2436 info.uuid.length()) {
2437 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2439 LOGW ("wrong format of transaction\n");
2441 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2446 if (m_recv_trans.get_data(target_ic) &&
2447 m_recv_trans.get_data(target_uuid) &&
2448 m_recv_trans.get_data(wstr) &&
2450 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2452 LOGW ("wrong format of transaction\n");
2454 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2458 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2459 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2461 LOGW ("wrong format of transaction\n");
2463 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2464 m_info_manager->socket_show_aux_string();
2465 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2466 m_info_manager->socket_show_lookup_table();
2467 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2468 m_info_manager->socket_show_associate_table();
2469 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2473 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2474 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2476 LOGW ("wrong format of transaction\n");
2478 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2479 m_info_manager->socket_hide_aux_string();
2480 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2481 m_info_manager->socket_hide_lookup_table();
2482 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2483 m_info_manager->socket_hide_associate_table();
2484 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2489 AttributeList attrs;
2492 if (m_recv_trans.get_data(target_ic) &&
2493 m_recv_trans.get_data(target_uuid) &&
2494 m_recv_trans.get_data(preedit) &&
2495 m_recv_trans.get_data(commit) &&
2496 m_recv_trans.get_data(attrs) &&
2497 m_recv_trans.get_data(caret)) {
2498 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2500 LOGW ("wrong format of transaction\n");
2502 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2505 if (m_recv_trans.get_data(caret)) {
2506 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2508 LOGW ("wrong format of transaction\n");
2510 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2512 AttributeList attrs;
2514 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2515 m_info_manager->socket_update_aux_string(str, attrs);
2517 LOGW ("wrong format of transaction\n");
2519 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2520 CommonLookupTable _isf_candidate_table;
2522 if (m_recv_trans.get_data(_isf_candidate_table)) {
2523 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2525 LOGW ("wrong format of transaction\n");
2527 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2528 CommonLookupTable _isf_candidate_table;
2530 if (m_recv_trans.get_data(_isf_candidate_table)) {
2531 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2533 LOGW ("wrong format of transaction\n");
2535 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2536 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2541 if (m_recv_trans.get_data(target_ic) &&
2542 m_recv_trans.get_data(target_uuid) &&
2543 m_recv_trans.get_data(key) &&
2545 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2547 LOGW ("wrong format of transaction\n");
2549 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2554 if (m_recv_trans.get_data(target_ic) &&
2555 m_recv_trans.get_data(target_uuid) &&
2556 m_recv_trans.get_data(key) &&
2558 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2560 LOGW ("wrong format of transaction\n");
2562 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2566 if (m_recv_trans.get_data(target_ic) &&
2567 m_recv_trans.get_data(target_uuid) &&
2568 m_recv_trans.get_data(m_nest_trans) &&
2569 m_nest_trans.valid()) {
2570 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2572 LOGW ("wrong format of transaction\n");
2574 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2575 PropertyList properties;
2577 if (m_recv_trans.get_data(properties))
2578 m_info_manager->socket_helper_register_properties(client_id, properties);
2580 LOGW ("wrong format of transaction\n");
2581 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2584 if (m_recv_trans.get_data(property))
2585 m_info_manager->socket_helper_update_property(client_id, property);
2587 LOGW ("wrong format of transaction\n");
2588 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2592 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2593 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2595 LOGW ("wrong format of transaction\n");
2597 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2600 if (m_recv_trans.get_data(uuid)) {
2601 m_info_manager->socket_get_keyboard_ise_list(uuid);
2603 LOGW ("wrong format of transaction\n");
2605 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2606 uint32 portrait_line, mode;
2608 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2609 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2611 LOGW ("wrong format of transaction\n");
2612 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2615 if (m_recv_trans.get_data(uuid)) {
2616 m_info_manager->socket_get_candidate_ui(uuid);
2618 LOGW ("wrong format of transaction\n");
2620 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2623 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2624 m_info_manager->socket_set_candidate_position(left, top);
2626 LOGW ("wrong format of transaction\n");
2627 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2628 m_info_manager->socket_hide_candidate();
2629 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2632 if (m_recv_trans.get_data(uuid)) {
2633 m_info_manager->socket_get_candidate_geometry(uuid);
2635 LOGW ("wrong format of transaction\n");
2637 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2638 m_info_manager->reset_keyboard_ise();
2639 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2642 if (m_recv_trans.get_data(uuid)) {
2643 m_info_manager->socket_set_keyboard_ise(uuid);
2645 LOGW ("wrong format of transaction\n");
2647 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2650 if (m_recv_trans.get_data(uuid)) {
2651 m_info_manager->socket_get_keyboard_ise(uuid);
2653 LOGW ("wrong format of transaction\n");
2655 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2656 uint32 x, y, width, height;
2658 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2659 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2660 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2662 LOGW ("wrong format of transaction\n");
2664 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2665 m_info_manager->expand_candidate();
2666 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2667 m_info_manager->contract_candidate();
2668 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2671 if (m_recv_trans.get_data(index))
2672 m_info_manager->socket_helper_select_candidate(index);
2674 LOGW ("wrong format of transaction\n");
2675 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2677 uint32 maxlen_before;
2678 uint32 maxlen_after;
2680 if (m_recv_trans.get_data(uuid) &&
2681 m_recv_trans.get_data(maxlen_before) &&
2682 m_recv_trans.get_data(maxlen_after)) {
2683 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2685 LOGW ("wrong format of transaction\n");
2687 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2691 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2692 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2694 LOGW ("wrong format of transaction\n");
2696 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2699 if (m_recv_trans.get_data(uuid)) {
2700 m_info_manager->socket_helper_get_selection(client_id, uuid);
2702 LOGW ("wrong format of transaction\n");
2704 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2708 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2709 m_info_manager->socket_helper_set_selection(client_id, start, end);
2711 LOGW ("wrong format of transaction\n");
2713 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2716 if (m_recv_trans.get_data(command)) {
2717 m_info_manager->socket_helper_send_private_command(client_id, command);
2719 LOGW ("wrong format of transaction\n");
2722 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2723 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2724 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2729 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2730 m_info_manager->process_key_event_done(key, ret, serial);
2732 LOGW ("wrong format of transaction\n");
2734 } else if (cmd == ISM_TRANS_CMD_REQUEST_ISE_HIDE) {
2735 m_info_manager->request_ise_hide();
2737 LOGW ("unknow cmd: %d\n", cmd);
2741 socket_transaction_end();
2742 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2743 socket_transaction_start();
2745 while (m_recv_trans.get_command(cmd)) {
2746 LOGD ("PanelAgent::cmd = %d\n", cmd);
2748 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2750 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2751 String default_uuid;
2752 m_info_manager->get_active_ise(client_id, default_uuid);
2754 Socket client_socket(client_id);
2757 trans.put_command(SCIM_TRANS_CMD_REPLY);
2758 trans.put_command(SCIM_TRANS_CMD_OK);
2759 trans.put_data(default_uuid);
2760 trans.write_to_socket(client_socket);
2763 LOGW ("Access denied to get active ise\n");
2764 send_fail_reply (client_id);
2766 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2767 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2772 if (m_recv_trans.get_data(&buf, len)) {
2773 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2775 LOGW ("wrong format of transaction\n");
2779 Socket client_socket(client_id);
2782 trans.put_command(SCIM_TRANS_CMD_REPLY);
2783 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2784 trans.write_to_socket(client_socket);
2790 LOGW ("Access denied to set active ise\n");
2791 send_fail_reply (client_id);
2793 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2794 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2800 //ret need be checked
2801 if (m_recv_trans.get_data(&buf, len)) {
2802 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2804 LOGW ("wrong format of transaction\n");
2808 Socket client_socket(client_id);
2811 trans.put_command(SCIM_TRANS_CMD_REPLY);
2812 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2813 trans.write_to_socket(client_socket);
2819 LOGW ("Access denied to set initial ise\n");
2820 send_fail_reply (client_id);
2822 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2823 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2824 std::vector<String> strlist;
2825 m_info_manager->get_ise_list(client_id, strlist);
2827 Socket client_socket(client_id);
2833 trans.put_command(SCIM_TRANS_CMD_REPLY);
2834 trans.put_command(SCIM_TRANS_CMD_OK);
2836 num = strlist.size();
2837 trans.put_data(num);
2839 for (unsigned int i = 0; i < num; i++) {
2840 buf = const_cast<char*>(strlist[i].c_str());
2841 len = strlen(buf) + 1;
2842 trans.put_data(buf, len);
2845 trans.write_to_socket(client_socket);
2848 LOGW ("Access denied to get ise list\n");
2849 send_fail_reply (client_id);
2851 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2852 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2853 HELPER_ISE_INFO info;
2854 m_info_manager->get_all_helper_ise_info(client_id, info);
2858 Socket client_socket(client_id);
2861 trans.put_command(SCIM_TRANS_CMD_REPLY);
2862 trans.put_command(SCIM_TRANS_CMD_OK);
2864 if (info.appid.size() > 0) {
2865 trans.put_data(info.appid);
2866 trans.put_data(info.label);
2867 trans.put_data(info.is_enabled);
2868 trans.put_data(info.is_preinstalled);
2869 trans.put_data(info.has_option);
2872 trans.write_to_socket(client_socket);
2876 LOGW ("Access denied to get all helper ise info\n");
2877 send_fail_reply (client_id);
2879 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2880 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2885 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2886 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2889 LOGW ("wrong format of transaction\n");
2893 Socket client_socket(client_id);
2896 trans.put_command(SCIM_TRANS_CMD_REPLY);
2897 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2898 trans.write_to_socket(client_socket);
2901 LOGW ("Access denied to set enable helper ise info\n");
2902 send_fail_reply (client_id);
2904 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
2905 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2906 String strUuid, strName, strLanguage, strModuleName;
2910 if (m_recv_trans.get_data(strUuid)) {
2911 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
2913 LOGW ("wrong format of transaction\n");
2917 Socket client_socket(client_id);
2919 trans.put_command(SCIM_TRANS_CMD_REPLY);
2920 trans.put_command(SCIM_TRANS_CMD_OK);
2921 trans.put_data(strName);
2922 trans.put_data(strLanguage);
2923 trans.put_data(nType);
2924 trans.put_data(nOption);
2925 trans.put_data(strModuleName);
2926 trans.write_to_socket(client_socket);
2929 LOGW ("Access denied to get ise information\n");
2930 send_fail_reply (client_id);
2932 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
2933 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2935 Socket client_socket(client_id);
2938 trans.put_command(SCIM_TRANS_CMD_REPLY);
2939 trans.put_command(SCIM_TRANS_CMD_OK);
2940 trans.write_to_socket(client_socket);
2941 m_info_manager->show_helper_ise_selector(client_id);
2942 m_info_manager->reset_ise_option(client_id);
2945 LOGW ("Access denied to reset ise option\n");
2946 send_fail_reply (client_id);
2948 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
2949 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2950 m_info_manager->reset_default_ise(client_id);
2953 LOGW ("Access denied to reset default ise\n");
2954 send_fail_reply (client_id);
2956 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
2957 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2958 m_info_manager->show_isf_panel(client_id);
2961 LOGW ("Access denied to show isf control\n");
2962 send_fail_reply (client_id);
2964 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2965 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2966 m_info_manager->show_ise_option_window(client_id);
2969 LOGW ("Access denied to show ise option window\n");
2970 send_fail_reply (client_id);
2972 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
2973 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2974 m_info_manager->resume_ise_option_window(client_id);
2977 LOGW ("Access denied to resume ise option window\n");
2978 send_fail_reply (client_id);
2980 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
2981 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2983 Socket client_socket(client_id);
2986 trans.put_command(SCIM_TRANS_CMD_REPLY);
2987 trans.put_command(SCIM_TRANS_CMD_OK);
2988 trans.write_to_socket(client_socket);
2990 m_info_manager->show_helper_ise_list(client_id);
2993 LOGW ("Access denied to show helper ise list\n");
2994 send_fail_reply (client_id);
2996 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
2997 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2999 Socket client_socket(client_id);
3002 trans.put_command(SCIM_TRANS_CMD_REPLY);
3003 trans.put_command(SCIM_TRANS_CMD_OK);
3004 trans.write_to_socket(client_socket);
3005 m_info_manager->show_helper_ise_selector(client_id);
3008 LOGW ("Access denied to show helper ise selector\n");
3009 send_fail_reply (client_id);
3011 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
3012 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3014 uint32 nEnabled = 0;
3017 //ret need be checked
3018 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
3020 Socket client_socket(client_id);
3022 trans.put_command(SCIM_TRANS_CMD_REPLY);
3025 trans.put_command(SCIM_TRANS_CMD_OK);
3026 trans.put_data(static_cast<uint32>(nEnabled));
3028 trans.put_command(SCIM_TRANS_CMD_FAIL);
3031 trans.write_to_socket(client_socket);
3034 LOGW ("Access denied to check helper ise enabled\n");
3035 send_fail_reply (client_id);
3037 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
3041 Socket client_socket(client_id);
3044 trans.put_command(SCIM_TRANS_CMD_REPLY);
3046 if (m_recv_trans.get_data(angle)) {
3047 struct rectinfo info = {0, 0, 0, 0};
3048 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
3050 trans.put_command(SCIM_TRANS_CMD_OK);
3051 trans.put_data(info.pos_x);
3052 trans.put_data(info.pos_y);
3053 trans.put_data(info.width);
3054 trans.put_data(info.height);
3056 trans.put_command(SCIM_TRANS_CMD_FAIL);
3059 trans.write_to_socket(client_socket);
3060 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
3062 Socket client_socket(client_id);
3065 trans.put_command(SCIM_TRANS_CMD_REPLY);
3066 trans.put_command(SCIM_TRANS_CMD_OK);
3067 trans.write_to_socket(client_socket);
3068 m_info_manager->hide_helper_ise ();
3070 LOGW ("unknow cmd: %d\n", cmd);
3074 socket_transaction_end();
3075 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
3076 socket_transaction_start();
3077 while (m_recv_trans.get_command(cmd)) {
3078 LOGD ("PanelAgent::cmd = %d\n", cmd);
3079 if (cmd == ISM_REMOTE_TRANS_CMD_SEND_INPUT_MESSAGE) {
3084 if (m_recv_trans.get_data(&buf, len)) {
3085 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
3087 LOGW ("wrong format of transaction\n");
3091 Socket client_socket(client_id);
3094 trans.put_command(SCIM_TRANS_CMD_REPLY);
3095 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3096 trans.write_to_socket(client_socket);
3100 } else if (cmd == ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE) {
3103 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE))
3107 Socket client_socket(client_id);
3110 trans.put_command(SCIM_TRANS_CMD_REPLY);
3111 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3112 trans.write_to_socket(client_socket);
3113 } else if (cmd == ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3118 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
3119 ret = m_info_manager->remoteinput_delete_surrounding_text(offset, len);
3121 LOGW ("wrong format of transaction\n");
3125 Socket client_socket(client_id);
3128 trans.put_command(SCIM_TRANS_CMD_REPLY);
3129 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3130 trans.write_to_socket(client_socket);
3132 LOGW ("unknow cmd: %d\n", cmd);
3136 socket_transaction_end ();
3140 void socket_exception_callback(SocketServer* server,
3141 const Socket& client) {
3142 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3143 LOGD ("client id:%d\n", client.get_id());
3144 socket_close_connection(server, client);
3147 bool socket_open_connection(SocketServer* server,
3148 const Socket& client) {
3149 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3150 LOGD ("client id:%d\n", client.get_id());
3152 String type = scim_socket_accept_connection(key,
3154 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3158 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3159 if (type.length()) {
3160 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3161 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3162 ((type == "Helper") ? HELPER_CLIENT :
3163 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3164 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3165 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3166 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3167 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3169 m_info_manager->add_client(client.get_id(), key, _type);
3173 LOGW ("open_connection failed\n");
3175 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3176 server->close_connection(client);
3180 void socket_close_connection(SocketServer* server,
3181 const Socket& client) {
3182 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3183 LOGD ("client id:%d\n", client.get_id());
3185 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3187 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
3188 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3189 ::close (client.get_id ());
3190 ecore_main_fd_handler_del (_read_handler_list[i]);
3191 _read_handler_list.erase (IterPos);
3195 m_info_manager->del_client(client.get_id());
3198 void socket_transaction_start(void) {
3199 //m_signal_transaction_start ();
3202 void socket_transaction_end(void) {
3203 //m_signal_transaction_end ();
3210 //m_signal_unlock ();
3214 } /* namespace scim */
3216 /***************************************************/
3217 /*** Beginning of panel agent interface for ISF ***/
3218 /***************************************************/
3219 static scim::PanelAgentPointer instance;
3223 EXAPI void scim_module_init(void)
3227 EXAPI void scim_module_exit(void)
3232 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3237 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3239 scim::PanelAgentBase* _instance = NULL;
3240 if (instance.null()) {
3242 _instance = new scim::EcoreSocketPanelAgent();
3248 instance = _instance;
3255 vi:ts=4:nowrap:ai:expandtab