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 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) {
760 LOGD ("client id:%d\n", client);
762 Socket client_socket(client);
767 trans.put_command(SCIM_TRANS_CMD_REPLY);
768 trans.put_data(context);
769 trans.put_data(uuid);
770 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
772 trans.put_data(serial);
774 if (trans.write_to_socket(client_socket)) {
775 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
778 LOGW ("read failed\n");
784 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
785 LOGD ("client id:%d\n", client);
787 Socket client_socket(client);
791 trans.put_command(SCIM_TRANS_CMD_REPLY);
792 trans.put_data(context);
793 trans.put_data(uuid);
794 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
796 if (trans.write_to_socket(client_socket)) {
801 if (trans.read_from_socket(client_socket)
802 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
803 && trans.get_data(info.pos_x)
804 && trans.get_data(info.pos_y)
805 && trans.get_data(info.width)
806 && trans.get_data(info.height)) {
807 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
810 LOGW ("read failed\n");
812 LOGW ("write failed\n");
817 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
818 LOGD ("client id:%d\n", client);
819 Socket client_socket(client);
823 trans.put_command(SCIM_TRANS_CMD_REPLY);
824 trans.put_data(context);
825 trans.put_data(uuid);
826 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
830 if (trans.write_to_socket(client_socket)
831 && trans.read_from_socket(client_socket)
832 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY) {
833 trans.get_data(imdata, len);
834 LOGD ("length of imdata is %d", len);
836 LOGW ("read imdata failed\n");
840 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
841 LOGD ("client id:%d\n", client);
843 Socket client_socket(client);
847 trans.put_command(SCIM_TRANS_CMD_REPLY);
848 trans.put_data(context);
849 trans.put_data(uuid);
850 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
854 if (trans.write_to_socket(client_socket)
855 && trans.read_from_socket(client_socket)
856 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
857 && trans.get_data(layout)) {
858 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
863 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
864 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
865 LOGD ("client id:%d\n", client);
870 trans.put_command(SCIM_TRANS_CMD_REPLY);
871 trans.put_data(context);
872 trans.put_data(uuid);
873 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
876 Socket client_socket(client);
878 if (trans.write_to_socket(client_socket)
879 && trans.read_from_socket(client_socket)
880 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
881 && trans.get_data(data, len)) {
887 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
888 LOGD ("client id:%d\n", client);
891 Socket client_socket(client);
896 trans.put_command(SCIM_TRANS_CMD_REPLY);
897 trans.put_data(context);
898 trans.put_data(uuid);
899 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
900 trans.write_to_socket(client_socket);
902 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
903 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
904 !trans.get_data(avail)) {
905 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed\n");
909 void reset_ise_option(int client, uint32 context) {
910 LOGD ("client id:%d\n", client);
912 Socket client_socket(client);
913 m_send_trans.clear();
914 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
915 m_send_trans.put_data((uint32) context);
916 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
917 m_send_trans.write_to_socket(client_socket);
920 void reset_helper_context(int client, uint32 context, const String& uuid) {
921 LOGD ("client id:%d\n", client);
923 Socket client_socket(client);
924 m_send_trans.clear();
925 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
926 m_send_trans.put_data(context);
927 m_send_trans.put_data(uuid);
928 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
929 m_send_trans.write_to_socket(client_socket);
932 void reload_config(int client) {
933 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
934 LOGD ("client id:%d\n", client);
936 m_send_trans.clear();
937 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
938 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
940 Socket client_socket(client);
941 m_send_trans.write_to_socket(client_socket);
944 void exit(int client, uint32 context) {
945 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
946 LOGD ("client id:%d\n", client);
948 m_send_trans.clear();
949 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
951 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
952 m_send_trans.put_data(context);
953 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
956 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
958 Socket client_socket(client);
959 m_send_trans.write_to_socket(client_socket);
962 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
963 LOGD("client id:%d\n", client);
965 Socket client_socket(client);
970 trans.put_command(SCIM_TRANS_CMD_REPLY);
971 trans.put_data(context);
972 trans.put_data(uuid);
973 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
974 trans.put_data(type);
975 trans.put_data(data, len);
978 if (trans.write_to_socket(client_socket)
979 && trans.read_from_socket(client_socket)
980 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
981 && trans.get_data(result)) {
982 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
986 LOGW("read failed\n");
992 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
993 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
994 LOGD ("client id:%d\n", client);
996 Socket client_socket(client);
998 m_send_trans.clear();
999 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1000 m_send_trans.put_data(context);
1001 m_send_trans.put_data(uuid);
1002 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1003 m_send_trans.put_data(text);
1004 m_send_trans.put_data(cursor);
1005 m_send_trans.write_to_socket(client_socket);
1008 void socket_remoteinput_focus_in (int client) {
1009 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1010 LOGD ("client id:%d\n", client);
1013 ret = (client == -1) ? false : true;
1016 Socket client_socket(client);
1018 m_send_trans.clear();
1019 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1020 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_IN);
1021 m_send_trans.write_to_socket(client_socket);
1025 void socket_remoteinput_focus_out (int client) {
1026 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1027 LOGD ("client id:%d\n", client);
1030 ret = (client == -1) ? false : true;
1033 Socket client_socket(client);
1035 m_send_trans.clear();
1036 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1037 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_OUT);
1038 m_send_trans.write_to_socket(client_socket);
1042 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type, int return_key_disabled) {
1043 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1044 LOGD ("client id:%d\n", client);
1047 ret = (client == -1) ? false : true;
1050 Socket client_socket(client);
1052 m_send_trans.clear();
1053 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1054 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_ENTRY_METADATA);
1055 m_send_trans.put_data(hint);
1056 m_send_trans.put_data(layout);
1057 m_send_trans.put_data(variation);
1058 m_send_trans.put_data(autocapital_type);
1059 m_send_trans.put_data(return_key_disabled);
1060 m_send_trans.write_to_socket(client_socket);
1064 void socket_remoteinput_surrounding_text (int client, String& text, uint32 cursor) {
1065 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1066 LOGD ("client id:%d\n", client);
1069 ret = (client == -1) ? false : true;
1072 Socket client_socket(client);
1074 m_send_trans.clear();
1075 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1076 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT);
1077 m_send_trans.put_data(text);
1078 m_send_trans.put_data(cursor);
1079 m_send_trans.write_to_socket(client_socket);
1083 void socket_remoteinput_input_resource (int client, uint32 input_resource) {
1084 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1085 LOGD ("client id:%d\n", client);
1088 ret = (client == -1) ? false : true;
1091 Socket client_socket(client);
1093 m_send_trans.clear();
1094 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1095 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE);
1096 m_send_trans.put_data(input_resource);
1097 m_send_trans.write_to_socket(client_socket);
1101 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1102 LOGD ("client id:%d\n", client);
1104 Socket client_socket(client);
1106 m_send_trans.clear();
1107 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1108 m_send_trans.put_data(context);
1109 m_send_trans.put_data(uuid);
1110 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
1111 m_send_trans.put_data(text);
1112 m_send_trans.write_to_socket(client_socket);
1115 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1116 LOGD ("client id:%d\n", client);
1118 Socket socket_client(client);
1119 m_send_trans.clear();
1120 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1121 m_send_trans.put_data(context);
1122 m_send_trans.put_data(uuid);
1123 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1124 m_send_trans.put_data(list.size());
1126 for (unsigned int i = 0; i < list.size(); i++)
1127 m_send_trans.put_data(list[i]);
1129 m_send_trans.write_to_socket(socket_client);
1132 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1133 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1135 LOGD ("client id:%d\n", client);
1137 Socket socket_client(client);
1138 m_send_trans.clear();
1139 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1140 m_send_trans.put_data(context);
1141 m_send_trans.put_data(uuid);
1142 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1143 m_send_trans.put_data(style);
1144 m_send_trans.put_data(mode);
1145 m_send_trans.write_to_socket(socket_client);
1148 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1149 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1151 LOGD ("client id:%d\n", client);
1153 Socket socket_client(client);
1154 m_send_trans.clear();
1155 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1156 m_send_trans.put_data(context);
1157 m_send_trans.put_data(uuid);
1158 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1159 m_send_trans.put_data(info.pos_x);
1160 m_send_trans.put_data(info.pos_y);
1161 m_send_trans.put_data(info.width);
1162 m_send_trans.put_data(info.height);
1163 m_send_trans.write_to_socket(socket_client);
1166 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1167 LOGD ("client id:%d\n", client);
1169 Socket socket_client(client);
1170 m_send_trans.clear();
1171 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1172 m_send_trans.put_data(context);
1173 m_send_trans.put_data(uuid);
1174 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1175 m_send_trans.put_data(ise_name);
1176 m_send_trans.put_data(ise_uuid);
1177 m_send_trans.write_to_socket(socket_client);
1180 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1181 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1183 LOGD ("client id:%d\n", client);
1185 Socket client_socket(client);
1186 m_send_trans.clear();
1187 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1188 m_send_trans.put_data(context);
1189 m_send_trans.put_data(ic_uuid);
1190 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1191 m_send_trans.write_to_socket(client_socket);
1194 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1195 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1197 LOGD ("client id:%d\n", client);
1199 Socket client_socket(client);
1200 m_send_trans.clear();
1201 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1202 m_send_trans.put_data(context);
1203 m_send_trans.put_data(ic_uuid);
1204 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1205 m_send_trans.write_to_socket(client_socket);
1208 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1209 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1210 LOGD ("client id:%d\n", client);
1212 Socket client_socket(client);
1216 m_send_trans.clear();
1217 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1219 /* FIXME: We presume that client and context are both less than 65536.
1220 * Hopefully, it should be true in any UNIXs.
1221 * So it's ok to combine client and context into one uint32. */
1222 m_send_trans.put_data(context);
1223 m_send_trans.put_data(ic_uuid);
1224 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1225 m_send_trans.put_data(_nest_trans);
1226 m_send_trans.write_to_socket(client_socket);
1231 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1232 LOGD ("client id:%d\n", client);
1234 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1235 Socket socket_client(client);
1237 m_send_trans.clear();
1238 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1239 m_send_trans.put_data(context);
1240 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1241 m_send_trans.put_data(target_uuid);
1242 m_send_trans.put_data(active_uuid);
1243 m_send_trans.put_data(nest_trans);
1244 m_send_trans.write_to_socket(socket_client);
1249 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1250 LOGD ("client id:%d\n", client);
1252 Socket socket_client(client);
1254 m_send_trans.clear();
1255 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1256 m_send_trans.put_data(context);
1257 m_send_trans.put_command(cmd);
1258 m_send_trans.put_data(key);
1259 m_send_trans.write_to_socket(socket_client);
1263 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1264 LOGD ("client id:%d\n", client);
1266 Socket socket_client(client);
1268 m_send_trans.clear();
1269 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1270 m_send_trans.put_data(target_context);
1271 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1272 m_send_trans.put_data(wstr);
1273 m_send_trans.write_to_socket(socket_client);
1277 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1278 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1279 LOGD ("client id:%d\n", client);
1281 Socket socket_client(client);
1283 m_send_trans.clear();
1284 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1285 m_send_trans.put_data(context_id);
1286 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1287 m_send_trans.put_data(maxlen_before);
1288 m_send_trans.put_data(maxlen_after);
1289 m_send_trans.write_to_socket(socket_client);
1293 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1294 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1295 LOGD ("client id:%d\n", client);
1297 Socket socket_client(client);
1299 m_send_trans.clear();
1300 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1301 m_send_trans.put_data(context_id);
1302 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1303 m_send_trans.put_data(offset);
1304 m_send_trans.put_data(len);
1305 m_send_trans.write_to_socket(socket_client);
1309 void socket_helper_get_selection(int client, uint32 context_id) {
1310 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1311 LOGD ("client id:%d\n", client);
1314 Socket socket_client(client);
1316 m_send_trans.clear();
1317 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1318 m_send_trans.put_data(context_id);
1319 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1320 m_send_trans.write_to_socket(socket_client);
1324 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1325 LOGD ("client id:%d\n", client);
1327 Socket socket_client(client);
1329 m_send_trans.clear();
1330 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1331 m_send_trans.put_data(context_id);
1332 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1333 m_send_trans.put_data(start);
1334 m_send_trans.put_data(end);
1335 m_send_trans.write_to_socket(socket_client);
1339 void show_preedit_string(int client, uint32 target_context) {
1340 LOGD ("client id:%d\n", client);
1342 Socket socket_client(client);
1344 m_send_trans.clear();
1345 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1346 m_send_trans.put_data(target_context);
1347 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1348 m_send_trans.write_to_socket(socket_client);
1352 void hide_preedit_string(int client, uint32 target_context) {
1353 LOGD ("client id:%d\n", client);
1355 Socket socket_client(client);
1357 m_send_trans.clear();
1358 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1359 m_send_trans.put_data(target_context);
1360 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1361 m_send_trans.write_to_socket(socket_client);
1365 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1366 LOGD ("client id:%d\n", client);
1368 Socket socket_client(client);
1370 m_send_trans.clear();
1371 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1372 m_send_trans.put_data(target_context);
1373 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1374 m_send_trans.put_data(preedit);
1375 m_send_trans.put_data(commit);
1376 m_send_trans.put_data(attrs);
1377 m_send_trans.put_data(caret);
1378 m_send_trans.write_to_socket(socket_client);
1383 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1385 LOGD ("client id:%d\n", client);
1387 Socket socket_client(client);
1389 m_send_trans.clear();
1390 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1391 m_send_trans.put_data(focused_context);
1392 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1393 m_send_trans.put_data(caret);
1394 m_send_trans.write_to_socket(socket_client);
1399 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1400 LOGD ("client id:%d\n", client);
1402 Socket socket_client(client);
1403 m_send_trans.clear();
1404 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1405 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1406 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1408 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1409 m_send_trans.put_data(helper_ic_index[i].first);
1410 m_send_trans.put_data(helper_ic_index[i].second);
1413 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1414 m_send_trans.put_data((uint32)current_screen);
1415 m_send_trans.write_to_socket(socket_client);
1418 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1419 LOGD ("client id:%d\n", client);
1421 Socket client_socket(client);
1422 m_send_trans.clear();
1423 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1424 m_send_trans.put_data(focused_context);
1425 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1426 m_send_trans.put_data(type);
1427 m_send_trans.put_data(value);
1428 m_send_trans.write_to_socket(client_socket);
1432 void send_private_command(int client, uint32 focused_context, String command) {
1433 LOGD ("client id:%d\n", client);
1435 Socket socket_client(client);
1437 m_send_trans.clear();
1438 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1439 m_send_trans.put_data(focused_context);
1440 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1441 m_send_trans.put_data(command);
1442 m_send_trans.write_to_socket(socket_client);
1446 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1447 LOGD ("client id:%d\n", client);
1449 m_send_trans.clear();
1450 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1452 /* FIXME: We presume that client and context are both less than 65536.
1453 * Hopefully, it should be true in any UNIXs.
1454 * So it's ok to combine client and context into one uint32. */
1455 m_send_trans.put_data(context_id);
1456 m_send_trans.put_data(uuid);
1457 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1458 m_send_trans.put_data((uint32) x);
1459 m_send_trans.put_data((uint32) y);
1461 Socket client_socket(client);
1462 m_send_trans.write_to_socket(client_socket);
1466 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1467 LOGD ("client id:%d\n", client);
1469 m_send_trans.clear();
1470 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1471 m_send_trans.put_data(context_id);
1472 m_send_trans.put_data(uuid);
1473 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1474 m_send_trans.put_data((uint32) cursor_pos);
1476 Socket client_socket(client);
1477 m_send_trans.write_to_socket(client_socket);
1481 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1482 LOGD ("client id:%d\n", client);
1484 m_send_trans.clear();
1485 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1487 /* FIXME: We presume that client and context are both less than 65536.
1488 * Hopefully, it should be true in any UNIXs.
1489 * So it's ok to combine client and context into one uint32. */
1490 m_send_trans.put_data(context_id);
1491 m_send_trans.put_data(uuid);
1492 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1493 m_send_trans.put_data((uint32) screen);
1495 Socket client_socket(client);
1496 m_send_trans.write_to_socket(client_socket);
1500 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1501 LOGD ("client id:%d\n", client);
1503 m_send_trans.clear();
1504 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1506 m_send_trans.put_data(context);
1507 m_send_trans.put_data(uuid);
1508 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1509 m_send_trans.put_data((uint32) mode);
1511 Socket client_socket(client);
1512 m_send_trans.write_to_socket(client_socket);
1515 void remote_update_preedit_string (int client, uint32 target_context, const WideString str, const WideString commit, const AttributeList &attrs, uint32 caret) {
1516 LOGD("client id:%d\n", client);
1518 Socket client_socket(client);
1520 m_send_trans.clear();
1521 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1522 m_send_trans.put_data(target_context);
1523 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1524 m_send_trans.put_data(str);
1525 m_send_trans.put_data(commit);
1526 m_send_trans.put_data(attrs);
1527 m_send_trans.put_data(caret);
1528 m_send_trans.write_to_socket(client_socket);
1532 void remote_send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1533 LOGD("client id:%d\n", client);
1535 Socket client_socket(client);
1537 m_send_trans.clear ();
1538 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1539 m_send_trans.put_data (target_context);
1540 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1541 m_send_trans.put_data (key);
1542 m_send_trans.write_to_socket (client_socket);
1546 void remote_forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1547 LOGD("client id:%d\n", client);
1549 Socket client_socket(client);
1551 m_send_trans.clear ();
1552 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1553 m_send_trans.put_data (target_context);
1554 m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
1555 m_send_trans.put_data (key);
1556 m_send_trans.write_to_socket (client_socket);
1560 void remote_commit_string (int client, uint32 target_context, const WideString& wstr) {
1561 LOGD ("client id:%d\n", client);
1563 Socket socket_client(client);
1565 m_send_trans.clear();
1566 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1567 m_send_trans.put_data(target_context);
1568 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1569 m_send_trans.put_data(wstr);
1570 m_send_trans.write_to_socket(socket_client);
1574 void remote_delete_surrounding_text (int client, uint32 context_id, uint32 offset, uint32 len) {
1575 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1576 LOGD ("client id:%d\n", client);
1578 Socket socket_client(client);
1580 m_send_trans.clear();
1581 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1582 m_send_trans.put_data(context_id);
1583 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1584 m_send_trans.put_data(offset);
1585 m_send_trans.put_data(len);
1586 m_send_trans.write_to_socket(socket_client);
1590 void set_prediction_allow (int client, uint32 context, String uuid, int mode) {
1591 LOGD ("client id:%d\n", client);
1593 m_send_trans.clear();
1594 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1596 m_send_trans.put_data(context);
1597 m_send_trans.put_data(uuid);
1598 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_ALLOW);
1599 m_send_trans.put_data((uint32) mode);
1601 Socket client_socket(client);
1602 m_send_trans.write_to_socket(client_socket);
1606 static void send_fail_reply (int client_id)
1608 Socket client_socket (client_id);
1611 trans.put_command (SCIM_TRANS_CMD_REPLY);
1612 trans.put_command (SCIM_TRANS_CMD_FAIL);
1613 trans.write_to_socket (client_socket);
1616 bool filter_event(int fd) {
1617 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1619 return m_socket_server.filter_event(fd);
1622 bool filter_exception_event(int fd) {
1623 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1625 return m_socket_server.filter_exception_event(fd);
1628 int get_server_id() {
1629 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1631 return m_socket_server.get_id();
1634 bool socket_check_client_connection(const Socket& client) {
1635 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1637 unsigned char buf [sizeof(uint32)];
1639 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1641 if (nbytes == sizeof(uint32))
1645 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1647 LOGW ("Timeout when reading socket\n");
1654 * @brief Callback function for ecore fd handler.
1656 * @param data The data to pass to this callback.
1657 * @param fd_handler The ecore fd handler.
1659 * @return ECORE_CALLBACK_RENEW
1661 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1662 if (fd_handler == NULL || data == NULL)
1663 return ECORE_CALLBACK_RENEW;
1665 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1667 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1669 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1670 if (fd_handler == _agent->_read_handler_list [i]) {
1671 if (!_agent->filter_event(fd)) {
1672 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1674 ecore_main_fd_handler_del(fd_handler);
1676 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1679 return ECORE_CALLBACK_RENEW;
1683 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1684 _agent->filter_exception_event(fd);
1686 ecore_main_fd_handler_del(fd_handler);
1688 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1689 return ECORE_CALLBACK_RENEW;
1692 void socket_accept_callback(SocketServer* server,
1693 const Socket& client) {
1694 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1698 if (m_should_exit) {
1699 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1702 //m_signal_accept_connection (client.get_id ());
1703 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1704 _read_handler_list.push_back(panel_agent_read_handler);
1710 void socket_receive_callback(SocketServer* server,
1711 const Socket& client) {
1712 int client_id = client.get_id();
1718 ClientInfo client_info;
1720 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1722 /* If the connection is closed then close this client. */
1723 if (!socket_check_client_connection(client)) {
1724 LOGW ("check client connection failed\n");
1725 socket_close_connection(server, client);
1729 client_info = m_info_manager->socket_get_client_info(client_id);
1731 /* If it's a new client, then request to open the connection first. */
1732 if (client_info.type == UNKNOWN_CLIENT) {
1733 socket_open_connection(server, client);
1737 /* If can not read the transaction,
1738 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1739 * or the key is mismatch,
1741 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1742 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1743 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1744 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1748 if (client_info.type == FRONTEND_ACT_CLIENT) {
1749 if (m_recv_trans.get_data(context)) {
1750 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1751 socket_transaction_start();
1753 while (m_recv_trans.get_command(cmd)) {
1754 LOGD ("PanelAgent::cmd = %d\n", cmd);
1756 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1759 if (m_recv_trans.get_data(id)) {
1760 m_info_manager->register_panel_client(client_id, id);
1762 LOGW ("wrong format of transaction\n");
1768 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1769 if (m_recv_trans.get_data(uuid)) {
1770 m_info_manager->register_input_context(client_id, context, uuid);
1772 LOGW ("wrong format of transaction\n");
1778 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1779 m_info_manager->remove_input_context(client_id, context);
1783 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1784 m_info_manager->socket_reset_input_context(client_id, context);
1788 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1789 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1791 if (m_recv_trans.get_data(uuid)) {
1792 m_info_manager->focus_in(client_id, context, uuid);
1794 LOGW ("wrong format of transaction\n");
1800 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1803 if (m_recv_trans.get_data(isOn)) {
1804 m_info_manager->socket_turn_on_log(isOn);
1806 LOGW ("wrong format of transaction\n");
1812 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1813 m_info_manager->show_isf_panel(client_id);
1815 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1816 m_info_manager->hide_isf_panel(client_id);
1818 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1825 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1828 LOGW ("wrong format of transaction\n");
1832 Socket client_socket(client_id);
1835 trans.put_command(SCIM_TRANS_CMD_REPLY);
1836 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1837 trans.put_data(ret);
1838 trans.write_to_socket(client_socket);
1844 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1847 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1851 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1852 m_info_manager->hide_ise_panel(client_id, client, context);
1854 LOGW ("wrong format of transaction\n");
1858 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1859 struct rectinfo info;
1860 m_info_manager->get_input_panel_geometry(client_id, info);
1862 Socket client_socket(client_id);
1865 trans.put_command(SCIM_TRANS_CMD_REPLY);
1866 trans.put_command(SCIM_TRANS_CMD_OK);
1867 trans.put_data(info.pos_x);
1868 trans.put_data(info.pos_y);
1869 trans.put_data(info.width);
1870 trans.put_data(info.height);
1871 trans.write_to_socket(client_socket);
1873 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1874 struct rectinfo info;
1875 m_info_manager->get_candidate_window_geometry(client_id, info);
1877 Socket client_socket(client_id);
1880 trans.put_command(SCIM_TRANS_CMD_REPLY);
1881 trans.put_command(SCIM_TRANS_CMD_OK);
1882 trans.put_data(info.pos_x);
1883 trans.put_data(info.pos_y);
1884 trans.put_data(info.width);
1885 trans.put_data(info.height);
1886 trans.write_to_socket(client_socket);
1888 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1891 m_info_manager->get_ise_language_locale(client_id, &data, len);
1894 trans.put_command(SCIM_TRANS_CMD_REPLY);
1896 if (data != NULL && len > 0) {
1897 trans.put_command(SCIM_TRANS_CMD_OK);
1898 trans.put_data(data, len);
1900 trans.put_command(SCIM_TRANS_CMD_FAIL);
1903 Socket client_socket(client_id);
1904 trans.write_to_socket(client_socket);
1910 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1913 if (m_recv_trans.get_data(language)) {
1914 m_info_manager->set_ise_language(client_id, language);
1916 LOGW ("wrong format of transaction\n");
1920 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1921 char* imdata = NULL;
1924 if (m_recv_trans.get_data(&imdata, len)) {
1925 m_info_manager->set_ise_imdata(client_id, imdata, len);
1927 LOGW ("wrong format of transaction\n");
1934 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1935 char* imdata = NULL;
1937 m_info_manager->get_ise_imdata(client_id, &imdata, len);
1939 Socket client_socket(client_id);
1942 trans.put_command(SCIM_TRANS_CMD_REPLY);
1945 trans.put_command(SCIM_TRANS_CMD_OK);
1946 trans.put_data(imdata, len);
1948 trans.put_command(SCIM_TRANS_CMD_FAIL);
1951 trans.write_to_socket(client_socket);
1957 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
1960 if (m_recv_trans.get_data(type)) {
1961 m_info_manager->set_ise_return_key_type(client_id, type);
1963 LOGW ("wrong format of transaction\n");
1967 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
1969 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
1971 Socket client_socket(client_id);
1974 trans.put_command(SCIM_TRANS_CMD_REPLY);
1977 trans.put_command(SCIM_TRANS_CMD_OK);
1978 trans.put_data(type);
1980 trans.put_command(SCIM_TRANS_CMD_FAIL);
1983 trans.write_to_socket(client_socket);
1985 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
1988 if (m_recv_trans.get_data(disabled)) {
1989 m_info_manager->set_ise_return_key_disable(client_id, disabled);
1991 LOGW ("wrong format of transaction\n");
1995 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
1998 m_info_manager->get_ise_return_key_disable(client_id, disabled);
2000 Socket client_socket(client_id);
2003 trans.put_command(SCIM_TRANS_CMD_REPLY);
2006 trans.put_command(SCIM_TRANS_CMD_OK);
2007 trans.put_data(disabled);
2009 trans.put_command(SCIM_TRANS_CMD_FAIL);
2012 trans.write_to_socket(client_socket);
2014 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
2016 bool ret = m_info_manager->get_ise_layout(client_id, layout);
2018 Socket client_socket(client_id);
2021 trans.put_command(SCIM_TRANS_CMD_REPLY);
2024 trans.put_command(SCIM_TRANS_CMD_OK);
2025 trans.put_data(layout);
2027 trans.put_command(SCIM_TRANS_CMD_FAIL);
2030 trans.write_to_socket(client_socket);
2032 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
2035 if (m_recv_trans.get_data(layout)) {
2036 m_info_manager->set_ise_layout(client_id, layout);
2038 LOGW ("wrong format of transaction\n");
2042 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
2045 if (m_recv_trans.get_data(mode)) {
2046 m_info_manager->set_ise_caps_mode(client_id, mode);
2048 LOGW ("wrong format of transaction\n");
2052 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
2053 m_info_manager->will_show_ack(client_id);
2055 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
2056 m_info_manager->will_hide_ack(client_id);
2058 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
2061 if (m_recv_trans.get_data(mode)) {
2062 m_info_manager->set_keyboard_mode(client_id, mode);
2064 LOGW ("wrong format of transaction\n");
2068 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2069 m_info_manager->candidate_will_hide_ack(client_id);
2071 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2077 if (m_recv_trans.get_data(key)) {
2079 m_info_manager->process_key_event(key, result);
2081 LOGW ("wrong format of transaction\n");
2085 Socket client_socket(client_id);
2088 trans.put_command(SCIM_TRANS_CMD_REPLY);
2091 trans.put_command(SCIM_TRANS_CMD_OK);
2092 trans.put_data(result);
2094 trans.put_command(SCIM_TRANS_CMD_FAIL);
2097 trans.write_to_socket(client_socket);
2099 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2101 m_info_manager->get_active_helper_option(client_id, option);
2103 Socket client_socket(client_id);
2106 trans.put_command(SCIM_TRANS_CMD_REPLY);
2107 trans.put_command(SCIM_TRANS_CMD_OK);
2108 trans.put_data(option);
2109 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2110 trans.write_to_socket(client_socket);
2112 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2114 m_info_manager->get_ise_state(client_id, state);
2116 Socket client_socket(client_id);
2119 trans.put_command(SCIM_TRANS_CMD_REPLY);
2120 trans.put_command(SCIM_TRANS_CMD_OK);
2121 trans.put_data(state);
2122 trans.write_to_socket(client_socket);
2124 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2127 if (m_recv_trans.get_data(input_mode)) {
2128 m_info_manager->set_ise_input_mode(client_id, input_mode);
2130 LOGW ("wrong format of transaction\n");
2134 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2137 if (m_recv_trans.get_data(input_hint)) {
2138 m_info_manager->set_ise_input_hint(client_id, input_hint);
2140 LOGW ("wrong format of transaction\n");
2144 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2145 uint32 bidi_direction;
2147 if (m_recv_trans.get_data(bidi_direction)) {
2148 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2150 LOGW ("wrong format of transaction\n");
2154 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2155 m_info_manager->show_ise_option_window(client_id);
2162 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2165 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2166 m_info_manager->socket_start_helper(client_id, context, uuid);
2168 LOGW ("wrong format of transaction\n");
2172 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2175 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2176 uuid.length() && m_nest_trans.valid()) {
2177 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2179 LOGW ("wrong format of transaction\n");
2183 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2186 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2187 m_info_manager->socket_stop_helper(client_id, context, uuid);
2189 LOGW ("wrong format of transaction\n");
2198 /* Client must focus in before do any other things. */
2199 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2200 m_info_manager->socket_turn_on();
2201 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2202 m_info_manager->socket_turn_off();
2203 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2206 if (m_recv_trans.get_data(num))
2207 m_info_manager->socket_update_screen(client_id, num);
2209 LOGW ("wrong format of transaction\n");
2210 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2213 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2214 m_info_manager->socket_update_spot_location(x, y, top_y);
2216 LOGW ("wrong format of transaction\n");
2218 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2221 if (m_recv_trans.get_data(cursor_pos)) {
2222 m_info_manager->socket_update_cursor_position(cursor_pos);
2224 LOGW ("wrong format of transaction\n");
2226 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2230 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2231 m_info_manager->socket_update_surrounding_text(text, cursor);
2233 LOGW ("wrong format of transaction\n");
2235 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2238 if (m_recv_trans.get_data(text)) {
2239 m_info_manager->socket_update_selection(text);
2241 LOGW ("wrong format of transaction\n");
2243 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2244 m_info_manager->expand_candidate();
2245 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2246 m_info_manager->contract_candidate();
2247 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2248 uint32 portrait_line, mode;
2250 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2251 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2253 LOGW ("wrong format of transaction\n");
2254 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2255 PanelFactoryInfo info;
2257 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2258 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2259 m_info_manager->socket_update_factory_info(info);
2261 LOGW ("wrong format of transaction\n");
2263 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2264 m_info_manager->socket_show_preedit_string();
2265 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2266 m_info_manager->socket_show_aux_string();
2267 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2268 m_info_manager->socket_show_lookup_table();
2269 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2270 m_info_manager->socket_show_associate_table();
2271 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2272 m_info_manager->socket_hide_preedit_string();
2273 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2274 m_info_manager->socket_hide_aux_string();
2275 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2276 m_info_manager->socket_hide_lookup_table();
2277 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2278 m_info_manager->socket_hide_associate_table();
2279 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2281 AttributeList attrs;
2284 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2285 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2287 LOGW ("wrong format of transaction\n");
2288 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2291 if (m_recv_trans.get_data(caret))
2292 m_info_manager->socket_update_preedit_caret(caret);
2294 LOGW ("wrong format of transaction\n");
2295 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2297 AttributeList attrs;
2299 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2300 m_info_manager->socket_update_aux_string(str, attrs);
2302 LOGW ("wrong format of transaction\n");
2303 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2304 CommonLookupTable _isf_candidate_table;
2306 if (m_recv_trans.get_data(_isf_candidate_table))
2307 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2309 LOGW ("wrong format of transaction\n");
2311 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2312 CommonLookupTable table;
2314 if (m_recv_trans.get_data(table))
2315 m_info_manager->socket_update_associate_table(table);
2317 LOGW ("wrong format of transaction\n");
2318 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2319 PropertyList properties;
2321 if (m_recv_trans.get_data(properties))
2322 m_info_manager->socket_register_properties(properties);
2324 LOGW ("wrong format of transaction\n");
2325 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2328 if (m_recv_trans.get_data(property))
2329 m_info_manager->socket_update_property(property);
2331 LOGW ("wrong format of transaction\n");
2332 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2335 if (m_recv_trans.get_data(help))
2336 m_info_manager->socket_show_help(help);
2338 LOGW ("wrong format of transaction\n");
2339 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2340 PanelFactoryInfo info;
2341 std::vector <PanelFactoryInfo> vec;
2343 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2344 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2345 info.lang = scim_get_normalized_language(info.lang);
2346 vec.push_back(info);
2349 m_info_manager->socket_show_factory_menu(vec);
2350 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2351 m_info_manager->focus_out(client_id, context);
2353 LOGW ("unknow cmd: %d\n", cmd);
2357 socket_transaction_end();
2359 } else if (client_info.type == FRONTEND_CLIENT) {
2360 if (m_recv_trans.get_data(context)) {
2361 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2362 socket_transaction_start();
2364 while (m_recv_trans.get_command(cmd)) {
2365 LOGD ("PanelAgent::cmd = %d\n", cmd);
2367 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2368 Socket client_socket(client_id);
2372 trans.put_command(SCIM_TRANS_CMD_REPLY);
2373 trans.put_command(SCIM_TRANS_CMD_OK);
2374 trans.put_data(client_id);
2375 trans.write_to_socket(client_socket);
2378 LOGW ("unknow cmd: %d\n", cmd);
2382 socket_transaction_end();
2384 } else if (client_info.type == HELPER_CLIENT) {
2385 socket_transaction_start();
2387 while (m_recv_trans.get_command(cmd)) {
2388 LOGD ("PanelAgent::cmd = %d\n", cmd);
2390 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2393 if (m_recv_trans.get_data(info.uuid) &&
2394 m_recv_trans.get_data(info.name) &&
2395 m_recv_trans.get_data(info.icon) &&
2396 m_recv_trans.get_data(info.description) &&
2397 m_recv_trans.get_data(info.option) &&
2398 info.uuid.length()) {
2399 m_info_manager->socket_helper_register_helper(client_id, info);
2402 LOGW ("unknow cmd: %d\n", cmd);
2406 socket_transaction_end();
2407 } else if (client_info.type == HELPER_ACT_CLIENT) {
2408 socket_transaction_start();
2410 while (m_recv_trans.get_command(cmd)) {
2411 LOGD ("PanelAgent::cmd = %d\n", cmd);
2413 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2416 if (m_recv_trans.get_data(info.uuid) &&
2417 m_recv_trans.get_data(info.name) &&
2418 m_recv_trans.get_data(info.icon) &&
2419 m_recv_trans.get_data(info.description) &&
2420 m_recv_trans.get_data(info.option) &&
2421 info.uuid.length()) {
2422 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2424 LOGW ("wrong format of transaction\n");
2426 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2431 if (m_recv_trans.get_data(target_ic) &&
2432 m_recv_trans.get_data(target_uuid) &&
2433 m_recv_trans.get_data(wstr) &&
2435 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2437 LOGW ("wrong format of transaction\n");
2439 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2443 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2444 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2446 LOGW ("wrong format of transaction\n");
2448 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2449 m_info_manager->socket_show_aux_string();
2450 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2451 m_info_manager->socket_show_lookup_table();
2452 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2453 m_info_manager->socket_show_associate_table();
2454 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2458 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2459 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2461 LOGW ("wrong format of transaction\n");
2463 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2464 m_info_manager->socket_hide_aux_string();
2465 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2466 m_info_manager->socket_hide_lookup_table();
2467 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2468 m_info_manager->socket_hide_associate_table();
2469 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2474 AttributeList attrs;
2477 if (m_recv_trans.get_data(target_ic) &&
2478 m_recv_trans.get_data(target_uuid) &&
2479 m_recv_trans.get_data(preedit) &&
2480 m_recv_trans.get_data(commit) &&
2481 m_recv_trans.get_data(attrs) &&
2482 m_recv_trans.get_data(caret)) {
2483 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2485 LOGW ("wrong format of transaction\n");
2487 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2490 if (m_recv_trans.get_data(caret)) {
2491 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2493 LOGW ("wrong format of transaction\n");
2495 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2497 AttributeList attrs;
2499 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2500 m_info_manager->socket_update_aux_string(str, attrs);
2502 LOGW ("wrong format of transaction\n");
2504 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2505 CommonLookupTable _isf_candidate_table;
2507 if (m_recv_trans.get_data(_isf_candidate_table)) {
2508 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2510 LOGW ("wrong format of transaction\n");
2512 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2513 CommonLookupTable _isf_candidate_table;
2515 if (m_recv_trans.get_data(_isf_candidate_table)) {
2516 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2518 LOGW ("wrong format of transaction\n");
2520 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2521 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2526 if (m_recv_trans.get_data(target_ic) &&
2527 m_recv_trans.get_data(target_uuid) &&
2528 m_recv_trans.get_data(key) &&
2530 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2532 LOGW ("wrong format of transaction\n");
2534 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2539 if (m_recv_trans.get_data(target_ic) &&
2540 m_recv_trans.get_data(target_uuid) &&
2541 m_recv_trans.get_data(key) &&
2543 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2545 LOGW ("wrong format of transaction\n");
2547 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2551 if (m_recv_trans.get_data(target_ic) &&
2552 m_recv_trans.get_data(target_uuid) &&
2553 m_recv_trans.get_data(m_nest_trans) &&
2554 m_nest_trans.valid()) {
2555 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2557 LOGW ("wrong format of transaction\n");
2559 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2560 PropertyList properties;
2562 if (m_recv_trans.get_data(properties))
2563 m_info_manager->socket_helper_register_properties(client_id, properties);
2565 LOGW ("wrong format of transaction\n");
2566 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2569 if (m_recv_trans.get_data(property))
2570 m_info_manager->socket_helper_update_property(client_id, property);
2572 LOGW ("wrong format of transaction\n");
2573 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2577 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2578 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2580 LOGW ("wrong format of transaction\n");
2582 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2585 if (m_recv_trans.get_data(uuid)) {
2586 m_info_manager->socket_get_keyboard_ise_list(uuid);
2588 LOGW ("wrong format of transaction\n");
2590 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2591 uint32 portrait_line, mode;
2593 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2594 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2596 LOGW ("wrong format of transaction\n");
2597 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2600 if (m_recv_trans.get_data(uuid)) {
2601 m_info_manager->socket_get_candidate_ui(uuid);
2603 LOGW ("wrong format of transaction\n");
2605 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2608 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2609 m_info_manager->socket_set_candidate_position(left, top);
2611 LOGW ("wrong format of transaction\n");
2612 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2613 m_info_manager->socket_hide_candidate();
2614 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2617 if (m_recv_trans.get_data(uuid)) {
2618 m_info_manager->socket_get_candidate_geometry(uuid);
2620 LOGW ("wrong format of transaction\n");
2622 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2623 m_info_manager->reset_keyboard_ise();
2624 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2627 if (m_recv_trans.get_data(uuid)) {
2628 m_info_manager->socket_set_keyboard_ise(uuid);
2630 LOGW ("wrong format of transaction\n");
2632 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2635 if (m_recv_trans.get_data(uuid)) {
2636 m_info_manager->socket_get_keyboard_ise(uuid);
2638 LOGW ("wrong format of transaction\n");
2640 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2641 uint32 x, y, width, height;
2643 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2644 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2645 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2647 LOGW ("wrong format of transaction\n");
2649 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2650 m_info_manager->expand_candidate();
2651 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2652 m_info_manager->contract_candidate();
2653 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2656 if (m_recv_trans.get_data(index))
2657 m_info_manager->socket_helper_select_candidate(index);
2659 LOGW ("wrong format of transaction\n");
2660 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2662 uint32 maxlen_before;
2663 uint32 maxlen_after;
2665 if (m_recv_trans.get_data(uuid) &&
2666 m_recv_trans.get_data(maxlen_before) &&
2667 m_recv_trans.get_data(maxlen_after)) {
2668 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2670 LOGW ("wrong format of transaction\n");
2672 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2676 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2677 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2679 LOGW ("wrong format of transaction\n");
2681 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2684 if (m_recv_trans.get_data(uuid)) {
2685 m_info_manager->socket_helper_get_selection(client_id, uuid);
2687 LOGW ("wrong format of transaction\n");
2689 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2693 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2694 m_info_manager->socket_helper_set_selection(client_id, start, end);
2696 LOGW ("wrong format of transaction\n");
2698 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2701 if (m_recv_trans.get_data(command)) {
2702 m_info_manager->socket_helper_send_private_command(client_id, command);
2704 LOGW ("wrong format of transaction\n");
2707 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2708 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2709 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2714 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2715 m_info_manager->process_key_event_done(key, ret, serial);
2717 LOGW ("wrong format of transaction\n");
2719 } else if (cmd == ISM_TRANS_CMD_REQUEST_ISE_HIDE) {
2720 m_info_manager->request_ise_hide();
2722 LOGW ("unknow cmd: %d\n", cmd);
2726 socket_transaction_end();
2727 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2728 socket_transaction_start();
2730 while (m_recv_trans.get_command(cmd)) {
2731 LOGD ("PanelAgent::cmd = %d\n", cmd);
2733 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2735 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2736 String default_uuid;
2737 m_info_manager->get_active_ise(client_id, default_uuid);
2739 Socket client_socket(client_id);
2742 trans.put_command(SCIM_TRANS_CMD_REPLY);
2743 trans.put_command(SCIM_TRANS_CMD_OK);
2744 trans.put_data(default_uuid);
2745 trans.write_to_socket(client_socket);
2748 LOGW ("Access denied to get active ise\n");
2749 send_fail_reply (client_id);
2751 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2752 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2757 if (m_recv_trans.get_data(&buf, len)) {
2758 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2760 LOGW ("wrong format of transaction\n");
2764 Socket client_socket(client_id);
2767 trans.put_command(SCIM_TRANS_CMD_REPLY);
2768 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2769 trans.write_to_socket(client_socket);
2775 LOGW ("Access denied to set active ise\n");
2776 send_fail_reply (client_id);
2778 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2779 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2785 //ret need be checked
2786 if (m_recv_trans.get_data(&buf, len)) {
2787 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2789 LOGW ("wrong format of transaction\n");
2793 Socket client_socket(client_id);
2796 trans.put_command(SCIM_TRANS_CMD_REPLY);
2797 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2798 trans.write_to_socket(client_socket);
2804 LOGW ("Access denied to set initial ise\n");
2805 send_fail_reply (client_id);
2807 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2808 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2809 std::vector<String> strlist;
2810 m_info_manager->get_ise_list(client_id, strlist);
2812 Socket client_socket(client_id);
2818 trans.put_command(SCIM_TRANS_CMD_REPLY);
2819 trans.put_command(SCIM_TRANS_CMD_OK);
2821 num = strlist.size();
2822 trans.put_data(num);
2824 for (unsigned int i = 0; i < num; i++) {
2825 buf = const_cast<char*>(strlist[i].c_str());
2826 len = strlen(buf) + 1;
2827 trans.put_data(buf, len);
2830 trans.write_to_socket(client_socket);
2833 LOGW ("Access denied to get ise list\n");
2834 send_fail_reply (client_id);
2836 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2837 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2838 HELPER_ISE_INFO info;
2839 m_info_manager->get_all_helper_ise_info(client_id, info);
2843 Socket client_socket(client_id);
2846 trans.put_command(SCIM_TRANS_CMD_REPLY);
2847 trans.put_command(SCIM_TRANS_CMD_OK);
2849 if (info.appid.size() > 0) {
2850 trans.put_data(info.appid);
2851 trans.put_data(info.label);
2852 trans.put_data(info.is_enabled);
2853 trans.put_data(info.is_preinstalled);
2854 trans.put_data(info.has_option);
2857 trans.write_to_socket(client_socket);
2861 LOGW ("Access denied to get all helper ise info\n");
2862 send_fail_reply (client_id);
2864 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2865 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2870 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2871 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2874 LOGW ("wrong format of transaction\n");
2878 Socket client_socket(client_id);
2881 trans.put_command(SCIM_TRANS_CMD_REPLY);
2882 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2883 trans.write_to_socket(client_socket);
2886 LOGW ("Access denied to set enable helper ise info\n");
2887 send_fail_reply (client_id);
2889 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
2890 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2891 String strUuid, strName, strLanguage, strModuleName;
2895 if (m_recv_trans.get_data(strUuid)) {
2896 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
2898 LOGW ("wrong format of transaction\n");
2902 Socket client_socket(client_id);
2904 trans.put_command(SCIM_TRANS_CMD_REPLY);
2905 trans.put_command(SCIM_TRANS_CMD_OK);
2906 trans.put_data(strName);
2907 trans.put_data(strLanguage);
2908 trans.put_data(nType);
2909 trans.put_data(nOption);
2910 trans.put_data(strModuleName);
2911 trans.write_to_socket(client_socket);
2914 LOGW ("Access denied to get ise information\n");
2915 send_fail_reply (client_id);
2917 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
2918 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2920 Socket client_socket(client_id);
2923 trans.put_command(SCIM_TRANS_CMD_REPLY);
2924 trans.put_command(SCIM_TRANS_CMD_OK);
2925 trans.write_to_socket(client_socket);
2926 m_info_manager->show_helper_ise_selector(client_id);
2927 m_info_manager->reset_ise_option(client_id);
2930 LOGW ("Access denied to reset ise option\n");
2931 send_fail_reply (client_id);
2933 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
2934 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2935 m_info_manager->reset_default_ise(client_id);
2938 LOGW ("Access denied to reset default ise\n");
2939 send_fail_reply (client_id);
2941 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
2942 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2943 m_info_manager->show_isf_panel(client_id);
2946 LOGW ("Access denied to show isf control\n");
2947 send_fail_reply (client_id);
2949 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2950 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2951 m_info_manager->show_ise_option_window(client_id);
2954 LOGW ("Access denied to show ise option window\n");
2955 send_fail_reply (client_id);
2957 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
2958 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2960 Socket client_socket(client_id);
2963 trans.put_command(SCIM_TRANS_CMD_REPLY);
2964 trans.put_command(SCIM_TRANS_CMD_OK);
2965 trans.write_to_socket(client_socket);
2967 m_info_manager->show_helper_ise_list(client_id);
2970 LOGW ("Access denied to show helper ise list\n");
2971 send_fail_reply (client_id);
2973 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
2974 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2976 Socket client_socket(client_id);
2979 trans.put_command(SCIM_TRANS_CMD_REPLY);
2980 trans.put_command(SCIM_TRANS_CMD_OK);
2981 trans.write_to_socket(client_socket);
2982 m_info_manager->show_helper_ise_selector(client_id);
2985 LOGW ("Access denied to show helper ise selector\n");
2986 send_fail_reply (client_id);
2988 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
2989 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2991 uint32 nEnabled = 0;
2994 //ret need be checked
2995 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
2997 Socket client_socket(client_id);
2999 trans.put_command(SCIM_TRANS_CMD_REPLY);
3002 trans.put_command(SCIM_TRANS_CMD_OK);
3003 trans.put_data(static_cast<uint32>(nEnabled));
3005 trans.put_command(SCIM_TRANS_CMD_FAIL);
3008 trans.write_to_socket(client_socket);
3011 LOGW ("Access denied to check helper ise enabled\n");
3012 send_fail_reply (client_id);
3014 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
3018 Socket client_socket(client_id);
3021 trans.put_command(SCIM_TRANS_CMD_REPLY);
3023 if (m_recv_trans.get_data(angle)) {
3024 struct rectinfo info = {0, 0, 0, 0};
3025 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
3027 trans.put_command(SCIM_TRANS_CMD_OK);
3028 trans.put_data(info.pos_x);
3029 trans.put_data(info.pos_y);
3030 trans.put_data(info.width);
3031 trans.put_data(info.height);
3033 trans.put_command(SCIM_TRANS_CMD_FAIL);
3036 trans.write_to_socket(client_socket);
3037 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
3039 Socket client_socket(client_id);
3042 trans.put_command(SCIM_TRANS_CMD_REPLY);
3043 trans.put_command(SCIM_TRANS_CMD_OK);
3044 trans.write_to_socket(client_socket);
3045 m_info_manager->hide_helper_ise ();
3047 LOGW ("unknow cmd: %d\n", cmd);
3051 socket_transaction_end();
3052 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
3053 socket_transaction_start();
3054 while (m_recv_trans.get_command(cmd)) {
3055 LOGD ("PanelAgent::cmd = %d\n", cmd);
3056 if (cmd == ISM_REMOTE_TRANS_CMD_SEND_INPUT_MESSAGE) {
3061 if (m_recv_trans.get_data(&buf, len)) {
3062 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
3064 LOGW ("wrong format of transaction\n");
3068 Socket client_socket(client_id);
3071 trans.put_command(SCIM_TRANS_CMD_REPLY);
3072 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3073 trans.write_to_socket(client_socket);
3077 } else if (cmd == ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE) {
3080 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE))
3084 Socket client_socket(client_id);
3087 trans.put_command(SCIM_TRANS_CMD_REPLY);
3088 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3089 trans.write_to_socket(client_socket);
3090 } else if (cmd == ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3095 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
3096 ret = m_info_manager->remoteinput_delete_surrounding_text(offset, len);
3098 LOGW ("wrong format of transaction\n");
3102 Socket client_socket(client_id);
3105 trans.put_command(SCIM_TRANS_CMD_REPLY);
3106 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3107 trans.write_to_socket(client_socket);
3109 LOGW ("unknow cmd: %d\n", cmd);
3113 socket_transaction_end ();
3117 void socket_exception_callback(SocketServer* server,
3118 const Socket& client) {
3119 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3120 LOGD ("client id:%d\n", client.get_id());
3121 socket_close_connection(server, client);
3124 bool socket_open_connection(SocketServer* server,
3125 const Socket& client) {
3126 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3127 LOGD ("client id:%d\n", client.get_id());
3129 String type = scim_socket_accept_connection(key,
3131 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3135 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3136 if (type.length()) {
3137 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3138 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3139 ((type == "Helper") ? HELPER_CLIENT :
3140 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3141 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3142 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3143 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3144 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3146 m_info_manager->add_client(client.get_id(), key, _type);
3150 LOGW ("open_connection failed\n");
3152 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3153 server->close_connection(client);
3157 void socket_close_connection(SocketServer* server,
3158 const Socket& client) {
3159 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3160 LOGD ("client id:%d\n", client.get_id());
3162 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3164 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
3165 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3166 ::close (client.get_id ());
3167 ecore_main_fd_handler_del (_read_handler_list[i]);
3168 _read_handler_list.erase (IterPos);
3172 m_info_manager->del_client(client.get_id());
3175 void socket_transaction_start(void) {
3176 //m_signal_transaction_start ();
3179 void socket_transaction_end(void) {
3180 //m_signal_transaction_end ();
3187 //m_signal_unlock ();
3191 } /* namespace scim */
3193 /***************************************************/
3194 /*** Beginning of panel agent interface for ISF ***/
3195 /***************************************************/
3196 static scim::PanelAgentPointer instance;
3200 EXAPI void scim_module_init(void)
3204 EXAPI void scim_module_exit(void)
3209 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3214 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3216 scim::PanelAgentBase* _instance = NULL;
3217 if (instance.null()) {
3219 _instance = new scim::EcoreSocketPanelAgent();
3225 instance = _instance;
3232 vi:ts=4:nowrap:ai:expandtab