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>
39 #include <sys/socket.h>
44 #include "scim_private.h"
46 #include "scim_stl_map.h"
47 #include "isf_debug.h"
53 #define LOG_TAG "ISF_ECORE_SOCKET_MODULE"
55 #define IMEMANAGER_PRIVILEGE "http://tizen.org/privilege/imemanager"
57 #define SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY "/Panel/Socket/ConfigReadOnly"
62 struct HelperClientStub {
66 HelperClientStub(int i = 0, int r = 0) : id(i), ref(r) { }
69 struct IMControlStub {
70 std::vector<ISE_INFO> info;
71 std::vector<int> count;
74 void aul_wakeup_ime_application(int sockfd)
77 socklen_t len = sizeof(struct ucred);
78 if (getsockopt(sockfd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) {
79 int ret = aul_update_freezer_status((long)ucred.pid, "wakeup");
80 LOGD("aul_update_freezer_status : %d %d", ucred.pid, ret);
82 LOGD("getsockopt failed : %d", errno);
85 #define DEFAULT_CONTEXT_VALUE 0xfff
87 #define scim_module_init ecoresocket_LTX_scim_module_init
88 #define scim_module_exit ecoresocket_LTX_scim_module_exit
89 #define scim_panel_agent_module_init ecoresocket_LTX_scim_panel_agent_module_init
90 #define scim_panel_agent_module_get_instance ecoresocket_LTX_scim_panel_agent_module_get_instance
93 //==================================== PanelAgent ===========================
94 class EcoreSocketPanelAgent: public PanelAgentBase
99 String m_socket_address;
100 SocketServer m_socket_server;
102 Transaction m_send_trans;
103 Transaction m_recv_trans;
104 Transaction m_nest_trans;
106 bool m_should_shared_ise;
109 std::vector<Ecore_Fd_Handler*> _read_handler_list;
111 InfoManager* m_info_manager;
114 EcoreSocketPanelAgent()
115 : PanelAgentBase ("ecore_socket"),
116 m_should_exit(false),
117 m_socket_timeout(scim_get_default_socket_timeout()),
118 m_should_shared_ise(false),
119 m_ise_exiting(false),
120 m_info_manager(NULL) {
121 m_socket_server.signal_connect_accept(slot(this, &EcoreSocketPanelAgent::socket_accept_callback));
122 m_socket_server.signal_connect_receive(slot(this, &EcoreSocketPanelAgent::socket_receive_callback));
123 m_socket_server.signal_connect_exception(slot(this, &EcoreSocketPanelAgent::socket_exception_callback));
126 ~EcoreSocketPanelAgent() {
128 for (unsigned int ii = 0; ii < _read_handler_list.size(); ++ii) {
129 ecore_main_fd_handler_del(_read_handler_list[ii]);
131 _read_handler_list.clear();
134 bool initialize(InfoManager* info_manager, const String& display, bool resident) {
135 m_info_manager = info_manager;
136 m_socket_address = scim_get_default_panel_socket_address(display);
138 m_socket_server.shutdown();
140 if (m_socket_server.create(SocketAddress(m_socket_address))) {
141 Ecore_Fd_Handler* panel_agent_read_handler = NULL;
142 panel_agent_read_handler = ecore_main_fd_handler_add(get_server_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
143 _read_handler_list.push_back(panel_agent_read_handler);
146 LOGE("create server failed");
150 bool valid(void) const {
151 return m_socket_server.valid();
155 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
157 m_should_exit = true;
160 if (client.connect(SocketAddress(m_socket_address))) {
165 void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) {
166 LOGD ("client id:%d", client);
167 Socket client_socket(client);
168 m_send_trans.clear();
169 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
170 m_send_trans.put_data(context_id);
171 m_send_trans.put_command(cmd);
172 m_send_trans.put_data(nType);
173 m_send_trans.put_data(nValue);
174 m_send_trans.write_to_socket(client_socket);
177 void move_preedit_caret(int client, uint32 context_id, uint32 position) {
178 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
179 LOGD ("client id:%d", client);
180 Socket client_socket(client);
181 m_send_trans.clear();
182 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
183 m_send_trans.put_data((uint32) context_id);
184 m_send_trans.put_command(SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
185 m_send_trans.put_data((uint32) position);
186 m_send_trans.write_to_socket(client_socket);
191 void request_help(int client_id, uint32 context_id) {
192 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
193 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_HELP);
200 m_send_trans.write_to_socket(client_socket);
203 void request_factory_menu(int client_id, uint32 context_id) {
204 LOGD ("client id:%d", client_id);
205 Socket client_socket(client_id);
206 m_send_trans.clear();
207 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
208 m_send_trans.put_data((uint32) context_id);
209 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
210 m_send_trans.write_to_socket(client_socket);
214 void reset_keyboard_ise(int client, uint32 context_id) {
215 LOGD ("client id:%d", client);
216 Socket client_socket(client);
217 m_send_trans.clear();
218 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
219 m_send_trans.put_data((uint32) context_id);
220 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
221 m_send_trans.write_to_socket(client_socket);
224 void update_keyboard_ise_list(int client, uint32 context) {
225 LOGD ("client id:%d", client);
227 Socket client_socket(client);
228 m_send_trans.clear();
229 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
230 m_send_trans.put_data((uint32) context);
231 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
232 m_send_trans.write_to_socket(client_socket);
235 void change_factory(int client, uint32 context, const String& uuid) {
236 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
237 LOGD ("client id:%d", client);
239 Socket client_socket(client);
240 m_send_trans.clear();
241 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
242 m_send_trans.put_data((uint32) context);
243 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
244 m_send_trans.put_data(uuid);
245 m_send_trans.write_to_socket(client_socket);
248 void helper_candidate_show(int client, uint32 context, const String& uuid) {
249 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
250 LOGD ("client id:%d", client);
252 Socket client_socket(client);
254 m_send_trans.clear();
255 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
256 m_send_trans.put_data(context);
257 m_send_trans.put_data(uuid);
258 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
259 m_send_trans.write_to_socket(client_socket);
262 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
263 LOGD ("client id:%d", client);
265 Socket client_socket(client);
267 m_send_trans.clear();
268 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
269 m_send_trans.put_data(context);
270 m_send_trans.put_data(uuid);
271 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
272 m_send_trans.write_to_socket(client_socket);
275 void candidate_more_window_show(int client, uint32 context) {
276 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
277 LOGD ("client id:%d", client);
279 Socket client_socket(client);
281 m_send_trans.clear();
282 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
283 m_send_trans.put_data(context);
284 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
285 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
286 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
287 m_send_trans.write_to_socket(client_socket);
290 void candidate_more_window_hide(int client, uint32 context) {
291 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
292 LOGD ("client id:%d", client);
294 Socket client_socket(client);
296 m_send_trans.clear();
297 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
298 m_send_trans.put_data(context);
299 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
300 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
301 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
302 m_send_trans.write_to_socket(client_socket);
305 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
306 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
307 LOGD ("client id:%d", client);
309 Socket client_socket(client);
311 m_send_trans.clear();
312 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
313 m_send_trans.put_data(context);
314 m_send_trans.put_data(uuid);
315 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
316 m_send_trans.put_data(table);
317 m_send_trans.write_to_socket(client_socket);
320 void select_aux(int client, uint32 contextid, uint32 item) {
321 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
322 LOGD ("client id:%d", client);
324 Socket client_socket(client);
325 m_send_trans.clear();
326 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
327 m_send_trans.put_data((uint32) contextid);
329 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
330 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
332 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
333 m_send_trans.put_data((uint32)item);
334 m_send_trans.write_to_socket(client_socket);
337 void select_candidate(int client, uint32 context, uint32 item) {
338 LOGD ("client id:%d", client);
340 Socket client_socket(client);
341 m_send_trans.clear();
342 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
343 m_send_trans.put_data((uint32) context);
345 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
346 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
348 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
349 m_send_trans.put_data((uint32)item);
350 m_send_trans.write_to_socket(client_socket);
353 void lookup_table_page_up(int client, uint32 context) {
354 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
355 LOGD ("client id:%d", client);
357 Socket client_socket(client);
358 m_send_trans.clear();
359 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
360 m_send_trans.put_data((uint32) context);
362 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
363 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
365 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
366 m_send_trans.write_to_socket(client_socket);
369 void lookup_table_page_down(int client, uint32 context) {
370 LOGD ("client id:%d", client);
372 Socket client_socket(client);
373 m_send_trans.clear();
374 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
375 m_send_trans.put_data((uint32) context);
377 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
378 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
380 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
381 m_send_trans.write_to_socket(client_socket);
384 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
385 LOGD ("client id:%d", client);
387 Socket client_socket(client);
388 m_send_trans.clear();
389 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
390 m_send_trans.put_data((uint32) context);
392 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
393 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
395 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
396 m_send_trans.put_data(size);
397 m_send_trans.write_to_socket(client_socket);
400 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
401 LOGD ("client id:%d", client);
403 Socket client_socket(client);
404 m_send_trans.clear();
405 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
406 m_send_trans.put_data((uint32) context);
408 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
409 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
411 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
412 m_send_trans.put_data(row_items);
413 m_send_trans.write_to_socket(client_socket);
416 void select_associate(int client, uint32 context, uint32 item) {
417 LOGD ("client id:%d", client);
419 Socket client_socket(client);
420 m_send_trans.clear();
421 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
422 m_send_trans.put_data((uint32) context);
424 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
425 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
427 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
428 m_send_trans.put_data((uint32)item);
429 m_send_trans.write_to_socket(client_socket);
432 void associate_table_page_up(int client, uint32 context) {
433 LOGD ("client id:%d", client);
435 Socket client_socket(client);
436 m_send_trans.clear();
437 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
438 m_send_trans.put_data((uint32) context);
440 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
441 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
443 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
444 m_send_trans.write_to_socket(client_socket);
447 void associate_table_page_down(int client, uint32 context) {
448 LOGD ("client id:%d", client);
450 Socket client_socket(client);
451 m_send_trans.clear();
452 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
453 m_send_trans.put_data((uint32) context);
455 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
456 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
458 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
459 m_send_trans.write_to_socket(client_socket);
462 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
463 LOGD ("client id:%d", client);
465 Socket client_socket(client);
466 m_send_trans.clear();
467 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
468 m_send_trans.put_data((uint32) context);
470 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
471 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
473 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
474 m_send_trans.put_data(size);
475 m_send_trans.write_to_socket(client_socket);
478 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
479 LOGD ("client id:%d", client);
481 Socket client_socket(client);
482 m_send_trans.clear();
483 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
484 m_send_trans.put_data((uint32) context);
486 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
487 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
489 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
490 m_send_trans.put_data(size);
491 m_send_trans.write_to_socket(client_socket);
494 void send_longpress_event(int client, uint32 context, int index) {
495 LOGD ("client id:%d", client);
497 Socket client_socket(client);
498 m_send_trans.clear();
499 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
500 m_send_trans.put_data((uint32) context);
502 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
503 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
505 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
506 m_send_trans.put_data(index);
507 m_send_trans.write_to_socket(client_socket);
510 void trigger_property(int client, uint32 context, const String& property) {
511 LOGD ("client id:%d", client);
513 Socket client_socket(client);
514 m_send_trans.clear();
515 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
516 m_send_trans.put_data((uint32) context);
518 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
519 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
521 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
522 m_send_trans.put_data(property);
523 m_send_trans.write_to_socket(client_socket);
526 void focus_out_helper(int client, uint32 context, const String& uuid) {
527 LOGD ("client id:%d", client);
529 Socket client_socket(client);
530 m_send_trans.clear();
531 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
532 m_send_trans.put_data(context);
533 m_send_trans.put_data(uuid);
534 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
535 m_send_trans.write_to_socket(client_socket);
538 void focus_in_helper(int client, uint32 context, const String& uuid) {
539 LOGD ("client id:%d", client);
541 Socket client_socket(client);
542 m_send_trans.clear();
543 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
544 m_send_trans.put_data(context);
545 m_send_trans.put_data(uuid);
546 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
547 m_send_trans.write_to_socket(client_socket);
550 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
551 LOGD ("client id:%d", client);
553 Socket client_socket(client);
555 aul_wakeup_ime_application(client_socket.get_id());
557 m_send_trans.clear();
558 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
559 m_send_trans.put_data(context);
560 m_send_trans.put_data(uuid);
561 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
562 m_send_trans.put_data(data, len);
563 m_send_trans.write_to_socket(client_socket);
566 void hide_helper(int client, uint32 context, const String& uuid) {
567 LOGD ("client id:%d", client);
569 Socket client_socket(client);
570 m_send_trans.clear();
571 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
572 m_send_trans.put_data(context);
573 m_send_trans.put_data(uuid);
574 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
575 m_send_trans.write_to_socket(client_socket);
578 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
579 LOGD ("client id:%d", client);
581 Socket client_socket(client);
582 m_send_trans.clear();
583 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
584 m_send_trans.put_data(context);
585 m_send_trans.put_data(uuid);
586 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
587 m_send_trans.put_data(mode);
588 m_send_trans.write_to_socket(client_socket);
591 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
592 LOGD ("client id:%d", client);
594 Socket client_socket(client);
595 m_send_trans.clear();
596 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
597 m_send_trans.put_data(context);
598 m_send_trans.put_data(uuid);
599 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
600 m_send_trans.put_data(language);
601 m_send_trans.write_to_socket(client_socket);
604 void set_helper_imdata(int client, uint32 context, const String& uuid, const char* imdata, size_t& len) {
605 LOGD ("client id:%d", client);
607 Socket client_socket(client);
608 m_send_trans.clear();
609 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
610 m_send_trans.put_data(context);
611 m_send_trans.put_data(uuid);
612 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
613 m_send_trans.put_data(imdata, len);
614 m_send_trans.write_to_socket(client_socket);
617 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
618 LOGD ("client id:%d", client);
620 Socket client_socket(client);
621 m_send_trans.clear();
622 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
623 m_send_trans.put_data(context);
624 m_send_trans.put_data(uuid);
625 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
626 m_send_trans.put_data(type);
627 m_send_trans.write_to_socket(client_socket);
630 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
631 LOGD ("client id:%d", client);
633 Socket client_socket(client);
636 trans.put_command(SCIM_TRANS_CMD_REPLY);
637 trans.put_data(context);
638 trans.put_data(uuid);
639 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
643 if (trans.write_to_socket(client_socket)
644 && trans.read_from_socket(client_socket)
645 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
646 && trans.get_data(type)) {
647 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
650 LOGW ("read failed");
654 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
655 LOGD ("client id:%d", client);
657 Socket client_socket(client);
658 m_send_trans.clear();
659 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
660 m_send_trans.put_data(context);
661 m_send_trans.put_data(uuid);
662 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
663 m_send_trans.put_data(disabled);
664 m_send_trans.write_to_socket(client_socket);
667 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
668 Socket client_socket(client);
669 LOGD ("client id:%d", client);
674 trans.put_command(SCIM_TRANS_CMD_REPLY);
675 trans.put_data(context);
676 trans.put_data(uuid);
677 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
681 if (trans.write_to_socket(client_socket)
682 && trans.read_from_socket(client_socket)
683 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
684 && trans.get_data(disabled)) {
685 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
688 LOGW ("read failed");
692 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
693 LOGD ("client id:%d", client);
695 Socket client_socket(client);
696 m_send_trans.clear();
697 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
698 m_send_trans.put_data(context);
699 m_send_trans.put_data(uuid);
700 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
701 m_send_trans.put_data(layout);
702 m_send_trans.write_to_socket(client_socket);
705 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
706 LOGD ("client id:%d", client);
708 Socket client_socket(client);
709 m_send_trans.clear();
710 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
711 m_send_trans.put_data(context);
712 m_send_trans.put_data(uuid);
713 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
714 m_send_trans.put_data(mode);
715 m_send_trans.write_to_socket(client_socket);
718 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
719 LOGD ("client id:%d", client);
721 Socket client_socket(client);
722 m_send_trans.clear();
723 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
724 m_send_trans.put_data(context);
725 m_send_trans.put_data(uuid);
726 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
727 m_send_trans.put_data(hint);
728 m_send_trans.write_to_socket(client_socket);
731 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
732 LOGD ("client id:%d", client);
734 Socket client_socket(client);
735 m_send_trans.clear();
736 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
737 m_send_trans.put_data(context);
738 m_send_trans.put_data(uuid);
739 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
740 m_send_trans.put_data(direction);
741 m_send_trans.write_to_socket(client_socket);
744 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
745 LOGD ("client id:%d", client);
747 Socket client_socket(client);
748 m_send_trans.clear();
749 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
750 m_send_trans.put_data(context);
751 m_send_trans.put_data(uuid);
752 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
753 m_send_trans.put_data(mode);
754 m_send_trans.write_to_socket(client_socket);
757 void show_helper_option_window(int client, uint32 context, const String& uuid) {
758 LOGD ("client id:%d", client);
760 Socket client_socket(client);
762 aul_wakeup_ime_application(client_socket.get_id());
764 m_send_trans.clear();
765 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
766 m_send_trans.put_data(context);
767 m_send_trans.put_data(uuid);
768 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
769 m_send_trans.write_to_socket(client_socket);
772 void resume_helper_option_window(int client, uint32 context, const String& uuid) {
773 LOGD ("client id:%d", client);
775 Socket client_socket(client);
777 aul_wakeup_ime_application(client_socket.get_id());
779 m_send_trans.clear();
780 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
781 m_send_trans.put_data(context);
782 m_send_trans.put_data(uuid);
783 m_send_trans.put_command(ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW);
784 m_send_trans.write_to_socket(client_socket);
787 void set_helper_keyboard_mode(int client, uint32 context, const String& uuid, uint32& mode) {
788 LOGD ("client id:%d", client);
790 Socket client_socket(client);
791 m_send_trans.clear();
792 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
793 m_send_trans.put_data(context);
794 m_send_trans.put_data(uuid);
795 m_send_trans.put_command(ISM_TRANS_CMD_SET_KEYBOARD_MODE);
796 m_send_trans.put_data(mode);
797 m_send_trans.write_to_socket(client_socket);
800 void set_helper_prediction_hint(int client, uint32 context, const String& uuid, String& prediction_hint) {
801 LOGD ("client id:%d", client);
803 Socket client_socket(client);
804 m_send_trans.clear();
805 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
806 m_send_trans.put_data(context);
807 m_send_trans.put_data(uuid);
808 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_HINT);
809 m_send_trans.put_data(prediction_hint);
810 m_send_trans.write_to_socket(client_socket);
813 void set_helper_mime_type(int client, uint32 context, const String& uuid, String& mime_type) {
814 LOGD ("client id:%d", client);
816 Socket client_socket(client);
817 m_send_trans.clear();
818 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
819 m_send_trans.put_data(context);
820 m_send_trans.put_data(uuid);
821 m_send_trans.put_command(ISM_TRANS_CMD_SET_MIME_TYPE);
822 m_send_trans.put_data(mime_type);
823 m_send_trans.write_to_socket(client_socket);
826 void set_helper_prediction_hint_data(int client, uint32 context, const String& uuid, String& key, String &value) {
827 Socket client_socket(client);
828 m_send_trans.clear();
829 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
830 m_send_trans.put_data(context);
831 m_send_trans.put_data(uuid);
832 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_HINT_DATA);
833 m_send_trans.put_data(key);
834 m_send_trans.put_data(value);
835 m_send_trans.write_to_socket(client_socket);
838 void finalize_content_helper(int client, uint32 context, const String& uuid, String& text, uint32& cursor_pos) {
839 LOGD("client id:%d", client);
841 Socket client_socket(client);
842 m_send_trans.clear();
843 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
844 m_send_trans.put_data(context);
845 m_send_trans.put_data(uuid);
846 m_send_trans.put_command(ISM_TRANS_CMD_FINALIZE_CONTENT);
847 m_send_trans.put_data(text);
848 m_send_trans.put_data(cursor_pos);
849 m_send_trans.write_to_socket(client_socket);
852 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) {
853 LOGD ("client id:%d", client);
855 Socket client_socket(client);
860 trans.put_command(SCIM_TRANS_CMD_REPLY);
861 trans.put_data(context);
862 trans.put_data(uuid);
863 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
865 trans.put_data(serial);
867 if (trans.write_to_socket(client_socket)) {
868 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
871 LOGW ("read failed");
877 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
878 LOGD ("client id:%d", client);
880 Socket client_socket(client);
884 trans.put_command(SCIM_TRANS_CMD_REPLY);
885 trans.put_data(context);
886 trans.put_data(uuid);
887 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
889 if (trans.write_to_socket(client_socket)) {
894 if (trans.read_from_socket(client_socket)
895 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
896 && trans.get_data(info.pos_x)
897 && trans.get_data(info.pos_y)
898 && trans.get_data(info.width)
899 && trans.get_data(info.height)) {
900 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
903 LOGW ("read failed");
905 LOGW ("write failed");
910 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
911 LOGD ("client id:%d", client);
912 Socket client_socket(client);
916 trans.put_command(SCIM_TRANS_CMD_REPLY);
917 trans.put_data(context);
918 trans.put_data(uuid);
919 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
923 if (trans.write_to_socket(client_socket)
924 && trans.read_from_socket(client_socket)
925 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
926 && trans.get_data(imdata, len)) {
927 LOGD ("length of imdata is %d", len);
929 LOGW ("read imdata failed");
933 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
934 LOGD ("client id:%d", client);
936 Socket client_socket(client);
940 trans.put_command(SCIM_TRANS_CMD_REPLY);
941 trans.put_data(context);
942 trans.put_data(uuid);
943 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
947 if (trans.write_to_socket(client_socket)
948 && trans.read_from_socket(client_socket)
949 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
950 && trans.get_data(layout)) {
951 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
956 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
957 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
958 LOGD ("client id:%d", client);
963 trans.put_command(SCIM_TRANS_CMD_REPLY);
964 trans.put_data(context);
965 trans.put_data(uuid);
966 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
969 Socket client_socket(client);
971 if (trans.write_to_socket(client_socket)
972 && trans.read_from_socket(client_socket)
973 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
974 && trans.get_data(data, len)) {
980 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
981 LOGD ("client id:%d", client);
984 Socket client_socket(client);
989 trans.put_command(SCIM_TRANS_CMD_REPLY);
990 trans.put_data(context);
991 trans.put_data(uuid);
992 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
993 trans.write_to_socket(client_socket);
995 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
996 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
997 !trans.get_data(avail)) {
998 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed");
1002 void reset_ise_option(int client, uint32 context) {
1003 LOGD ("client id:%d", client);
1005 Socket client_socket(client);
1006 m_send_trans.clear();
1007 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1008 m_send_trans.put_data((uint32) context);
1009 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
1010 m_send_trans.write_to_socket(client_socket);
1013 void reset_helper_context(int client, uint32 context, const String& uuid) {
1014 LOGD ("client id:%d", client);
1016 Socket client_socket(client);
1017 m_send_trans.clear();
1018 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1019 m_send_trans.put_data(context);
1020 m_send_trans.put_data(uuid);
1021 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
1022 m_send_trans.write_to_socket(client_socket);
1025 void reload_config(int client) {
1026 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
1027 LOGD ("client id:%d", client);
1029 m_send_trans.clear();
1030 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1031 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
1033 Socket client_socket(client);
1034 m_send_trans.write_to_socket(client_socket);
1037 void exit(int client, uint32 context) {
1038 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
1039 LOGD ("client id:%d", client);
1041 m_send_trans.clear();
1042 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1044 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
1045 m_send_trans.put_data(context);
1046 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
1049 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
1051 Socket client_socket(client);
1052 m_send_trans.write_to_socket(client_socket);
1054 m_info_manager->del_client(client_socket.get_id());
1057 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
1058 LOGD("client id:%d", client);
1060 Socket client_socket(client);
1065 trans.put_command(SCIM_TRANS_CMD_REPLY);
1066 trans.put_data(context);
1067 trans.put_data(uuid);
1068 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
1069 trans.put_data(type);
1070 trans.put_data(data, len);
1072 if (trans.write_to_socket(client_socket)) {
1073 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
1077 LOGW("read failed");
1083 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
1084 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1085 LOGD ("client id:%d", client);
1087 Socket client_socket(client);
1089 m_send_trans.clear();
1090 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1091 m_send_trans.put_data(context);
1092 m_send_trans.put_data(uuid);
1093 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1094 m_send_trans.put_data(text);
1095 m_send_trans.put_data(cursor);
1096 m_send_trans.write_to_socket(client_socket);
1098 m_send_trans.clear();
1099 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1100 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1101 m_send_trans.write_to_socket(client_socket);
1104 void socket_remoteinput_focus_in (int client) {
1105 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1106 LOGD ("client id:%d", client);
1109 ret = (client == -1) ? false : true;
1112 Socket client_socket(client);
1114 m_send_trans.clear();
1115 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1116 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_IN);
1117 m_send_trans.write_to_socket(client_socket);
1121 void socket_remoteinput_focus_out (int client) {
1122 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1123 LOGD ("client id:%d", client);
1126 ret = (client == -1) ? false : true;
1129 Socket client_socket(client);
1131 m_send_trans.clear();
1132 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1133 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_OUT);
1134 m_send_trans.write_to_socket(client_socket);
1138 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type, int return_key_disabled) {
1139 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1140 LOGD ("client id:%d", client);
1143 ret = (client == -1) ? false : true;
1146 Socket client_socket(client);
1148 m_send_trans.clear();
1149 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1150 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_ENTRY_METADATA);
1151 m_send_trans.put_data(hint);
1152 m_send_trans.put_data(layout);
1153 m_send_trans.put_data(variation);
1154 m_send_trans.put_data(autocapital_type);
1155 m_send_trans.put_data(return_key_disabled);
1156 m_send_trans.write_to_socket(client_socket);
1160 void socket_remoteinput_surrounding_text (int client, String& text, uint32 cursor) {
1161 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1162 LOGD ("client id:%d", client);
1165 ret = (client == -1) ? false : true;
1168 Socket client_socket(client);
1170 m_send_trans.clear();
1171 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1172 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT);
1173 m_send_trans.put_data(text);
1174 m_send_trans.put_data(cursor);
1175 m_send_trans.write_to_socket(client_socket);
1179 void socket_remoteinput_input_resource (int client, uint32 input_resource) {
1180 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1181 LOGD ("client id:%d", client);
1184 ret = (client == -1) ? false : true;
1187 Socket client_socket(client);
1189 m_send_trans.clear();
1190 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1191 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE);
1192 m_send_trans.put_data(input_resource);
1193 m_send_trans.write_to_socket(client_socket);
1197 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1198 LOGD ("client id:%d", client);
1200 Socket client_socket(client);
1202 m_send_trans.clear();
1203 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1204 m_send_trans.put_data(context);
1205 m_send_trans.put_data(uuid);
1206 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
1207 m_send_trans.put_data(text);
1208 m_send_trans.write_to_socket(client_socket);
1210 m_send_trans.clear();
1211 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1212 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1213 m_send_trans.write_to_socket(client_socket);
1216 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1217 LOGD ("client id:%d", client);
1219 Socket socket_client(client);
1220 m_send_trans.clear();
1221 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1222 m_send_trans.put_data(context);
1223 m_send_trans.put_data(uuid);
1224 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1225 m_send_trans.put_data(list.size());
1227 for (unsigned int i = 0; i < list.size(); i++)
1228 m_send_trans.put_data(list[i]);
1230 m_send_trans.write_to_socket(socket_client);
1233 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1234 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1236 LOGD ("client id:%d", client);
1238 Socket socket_client(client);
1239 m_send_trans.clear();
1240 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1241 m_send_trans.put_data(context);
1242 m_send_trans.put_data(uuid);
1243 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1244 m_send_trans.put_data(style);
1245 m_send_trans.put_data(mode);
1246 m_send_trans.write_to_socket(socket_client);
1249 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1250 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1252 LOGD ("client id:%d", client);
1254 Socket socket_client(client);
1255 m_send_trans.clear();
1256 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1257 m_send_trans.put_data(context);
1258 m_send_trans.put_data(uuid);
1259 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1260 m_send_trans.put_data(info.pos_x);
1261 m_send_trans.put_data(info.pos_y);
1262 m_send_trans.put_data(info.width);
1263 m_send_trans.put_data(info.height);
1264 m_send_trans.write_to_socket(socket_client);
1267 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1268 LOGD ("client id:%d", client);
1270 Socket socket_client(client);
1271 m_send_trans.clear();
1272 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1273 m_send_trans.put_data(context);
1274 m_send_trans.put_data(uuid);
1275 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1276 m_send_trans.put_data(ise_name);
1277 m_send_trans.put_data(ise_uuid);
1278 m_send_trans.write_to_socket(socket_client);
1281 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1282 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1284 LOGD ("client id:%d", client);
1286 Socket client_socket(client);
1287 m_send_trans.clear();
1288 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1289 m_send_trans.put_data(context);
1290 m_send_trans.put_data(ic_uuid);
1291 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1292 m_send_trans.write_to_socket(client_socket);
1295 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1296 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1298 LOGD ("client id:%d", client);
1300 Socket client_socket(client);
1301 m_send_trans.clear();
1302 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1303 m_send_trans.put_data(context);
1304 m_send_trans.put_data(ic_uuid);
1305 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1306 m_send_trans.write_to_socket(client_socket);
1309 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1310 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1311 LOGD ("client id:%d", client);
1313 Socket client_socket(client);
1317 m_send_trans.clear();
1318 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1320 /* FIXME: We presume that client and context are both less than 65536.
1321 * Hopefully, it should be true in any UNIXs.
1322 * So it's ok to combine client and context into one uint32. */
1323 m_send_trans.put_data(context);
1324 m_send_trans.put_data(ic_uuid);
1325 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1326 m_send_trans.put_data(_nest_trans);
1327 m_send_trans.write_to_socket(client_socket);
1332 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1333 LOGD ("client id:%d", client);
1335 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1336 Socket socket_client(client);
1338 m_send_trans.clear();
1339 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1340 m_send_trans.put_data(context);
1341 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1342 m_send_trans.put_data(target_uuid);
1343 m_send_trans.put_data(active_uuid);
1344 m_send_trans.put_data(nest_trans);
1345 m_send_trans.write_to_socket(socket_client);
1349 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1350 LOGD ("client id:%d", client);
1352 Socket socket_client(client);
1354 m_send_trans.clear();
1355 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1356 m_send_trans.put_data(context);
1357 m_send_trans.put_command(cmd);
1358 m_send_trans.put_data(key);
1359 m_send_trans.write_to_socket(socket_client);
1363 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1364 LOGD ("client id:%d", client);
1366 Socket socket_client(client);
1368 m_send_trans.clear();
1369 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1370 m_send_trans.put_data(target_context);
1371 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1372 m_send_trans.put_data(wstr);
1373 m_send_trans.write_to_socket(socket_client);
1377 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1378 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1379 LOGD ("client id:%d", client);
1381 Socket socket_client(client);
1383 m_send_trans.clear();
1384 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1385 m_send_trans.put_data(context_id);
1386 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1387 m_send_trans.put_data(maxlen_before);
1388 m_send_trans.put_data(maxlen_after);
1389 m_send_trans.write_to_socket(socket_client);
1393 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1394 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1395 LOGD ("client id:%d", client);
1397 Socket socket_client(client);
1399 m_send_trans.clear();
1400 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1401 m_send_trans.put_data(context_id);
1402 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1403 m_send_trans.put_data(offset);
1404 m_send_trans.put_data(len);
1405 m_send_trans.write_to_socket(socket_client);
1409 void socket_helper_get_selection(int client, uint32 context_id) {
1410 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1411 LOGD ("client id:%d", client);
1414 Socket socket_client(client);
1416 m_send_trans.clear();
1417 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1418 m_send_trans.put_data(context_id);
1419 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1420 m_send_trans.write_to_socket(socket_client);
1424 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1425 LOGD ("client id:%d", client);
1427 Socket socket_client(client);
1429 m_send_trans.clear();
1430 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1431 m_send_trans.put_data(context_id);
1432 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1433 m_send_trans.put_data(start);
1434 m_send_trans.put_data(end);
1435 m_send_trans.write_to_socket(socket_client);
1439 void show_preedit_string(int client, uint32 target_context) {
1440 LOGD ("client id:%d", client);
1442 Socket socket_client(client);
1444 m_send_trans.clear();
1445 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1446 m_send_trans.put_data(target_context);
1447 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1448 m_send_trans.write_to_socket(socket_client);
1452 void hide_preedit_string(int client, uint32 target_context) {
1453 LOGD ("client id:%d", client);
1455 Socket socket_client(client);
1457 m_send_trans.clear();
1458 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1459 m_send_trans.put_data(target_context);
1460 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1461 m_send_trans.write_to_socket(socket_client);
1465 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1466 LOGD ("client id:%d", client);
1468 Socket socket_client(client);
1470 m_send_trans.clear();
1471 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1472 m_send_trans.put_data(target_context);
1473 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1474 m_send_trans.put_data(preedit);
1475 m_send_trans.put_data(commit);
1476 m_send_trans.put_data(attrs);
1477 m_send_trans.put_data(caret);
1478 m_send_trans.write_to_socket(socket_client);
1482 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1483 LOGD ("client id:%d", client);
1485 Socket socket_client(client);
1487 m_send_trans.clear();
1488 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1489 m_send_trans.put_data(focused_context);
1490 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1491 m_send_trans.put_data(caret);
1492 m_send_trans.write_to_socket(socket_client);
1496 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1497 LOGD ("client id:%d", client);
1499 Socket socket_client(client);
1500 m_send_trans.clear();
1501 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1502 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1503 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1505 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1506 m_send_trans.put_data(helper_ic_index[i].first);
1507 m_send_trans.put_data(helper_ic_index[i].second);
1510 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1511 m_send_trans.put_data((uint32)current_screen);
1512 m_send_trans.write_to_socket(socket_client);
1515 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1516 LOGD ("client id:%d", client);
1518 Socket client_socket(client);
1519 m_send_trans.clear();
1520 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1521 m_send_trans.put_data(focused_context);
1522 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1523 m_send_trans.put_data(type);
1524 m_send_trans.put_data(value);
1525 m_send_trans.write_to_socket(client_socket);
1528 void send_private_command(int client, uint32 focused_context, String command) {
1529 LOGD ("client id:%d", client);
1531 Socket socket_client(client);
1533 m_send_trans.clear();
1534 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1535 m_send_trans.put_data(focused_context);
1536 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1537 m_send_trans.put_data(command);
1538 m_send_trans.write_to_socket(socket_client);
1541 void commit_content(int client, uint32 focused_context, String content, String description, String mime_types) {
1542 LOGD ("client id:%d", client);
1544 Socket socket_client(client);
1546 m_send_trans.clear();
1547 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1548 m_send_trans.put_data(focused_context);
1549 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_CONTENT);
1550 m_send_trans.put_data(content);
1551 m_send_trans.put_data(description);
1552 m_send_trans.put_data(mime_types);
1553 m_send_trans.write_to_socket(socket_client);
1556 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1557 LOGD ("client id:%d", client);
1559 m_send_trans.clear();
1560 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1562 /* FIXME: We presume that client and context are both less than 65536.
1563 * Hopefully, it should be true in any UNIXs.
1564 * So it's ok to combine client and context into one uint32. */
1565 m_send_trans.put_data(context_id);
1566 m_send_trans.put_data(uuid);
1567 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1568 m_send_trans.put_data((uint32) x);
1569 m_send_trans.put_data((uint32) y);
1571 Socket client_socket(client);
1572 m_send_trans.write_to_socket(client_socket);
1575 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1576 LOGD ("client id:%d", client);
1578 m_send_trans.clear();
1579 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1580 m_send_trans.put_data(context_id);
1581 m_send_trans.put_data(uuid);
1582 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1583 m_send_trans.put_data((uint32) cursor_pos);
1585 Socket client_socket(client);
1586 m_send_trans.write_to_socket(client_socket);
1589 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1590 LOGD ("client id:%d", client);
1592 m_send_trans.clear();
1593 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1595 /* FIXME: We presume that client and context are both less than 65536.
1596 * Hopefully, it should be true in any UNIXs.
1597 * So it's ok to combine client and context into one uint32. */
1598 m_send_trans.put_data(context_id);
1599 m_send_trans.put_data(uuid);
1600 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1601 m_send_trans.put_data((uint32) screen);
1603 Socket client_socket(client);
1604 m_send_trans.write_to_socket(client_socket);
1607 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1608 m_send_trans.clear();
1609 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1611 m_send_trans.put_data(context);
1612 m_send_trans.put_data(uuid);
1613 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1614 m_send_trans.put_data((uint32) mode);
1616 Socket client_socket(client);
1617 m_send_trans.write_to_socket(client_socket);
1620 void remote_update_preedit_string (int client, uint32 target_context, const WideString str, const WideString commit, const AttributeList &attrs, uint32 caret) {
1621 Socket client_socket(client);
1623 m_send_trans.clear();
1624 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1625 m_send_trans.put_data(target_context);
1626 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1627 m_send_trans.put_data(str);
1628 m_send_trans.put_data(commit);
1629 m_send_trans.put_data(attrs);
1630 m_send_trans.put_data(caret);
1631 m_send_trans.write_to_socket(client_socket);
1635 void remote_send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1636 Socket client_socket(client);
1638 m_send_trans.clear ();
1639 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1640 m_send_trans.put_data (target_context);
1641 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1642 m_send_trans.put_data (key);
1643 m_send_trans.write_to_socket (client_socket);
1647 void remote_forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1648 Socket client_socket(client);
1650 m_send_trans.clear ();
1651 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1652 m_send_trans.put_data (target_context);
1653 m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
1654 m_send_trans.put_data (key);
1655 m_send_trans.write_to_socket (client_socket);
1659 void remote_commit_string (int client, uint32 target_context, const WideString& wstr) {
1660 LOGD ("client id:%d", client);
1662 Socket socket_client(client);
1664 m_send_trans.clear();
1665 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1666 m_send_trans.put_data(target_context);
1667 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1668 m_send_trans.put_data(wstr);
1669 m_send_trans.write_to_socket(socket_client);
1673 void remote_delete_surrounding_text (int client, uint32 context_id, uint32 offset, uint32 len) {
1674 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1675 LOGD ("client id:%d", client);
1677 Socket socket_client(client);
1679 m_send_trans.clear();
1680 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1681 m_send_trans.put_data(context_id);
1682 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1683 m_send_trans.put_data(offset);
1684 m_send_trans.put_data(len);
1685 m_send_trans.write_to_socket(socket_client);
1689 void set_prediction_allow (int client, uint32 context, String uuid, int mode) {
1690 LOGD ("client id:%d", client);
1692 m_send_trans.clear();
1693 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1695 m_send_trans.put_data(context);
1696 m_send_trans.put_data(uuid);
1697 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_ALLOW);
1698 m_send_trans.put_data((uint32) mode);
1700 Socket client_socket(client);
1701 m_send_trans.write_to_socket(client_socket);
1704 void send_fail_reply (int client)
1706 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1707 LOGD ("client id:%d", client);
1709 Socket client_socket (client);
1712 trans.put_command (SCIM_TRANS_CMD_REPLY);
1713 trans.put_command (SCIM_TRANS_CMD_FAIL);
1714 trans.write_to_socket (client_socket);
1719 bool filter_event(int fd) {
1720 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1722 return m_socket_server.filter_event(fd);
1725 bool filter_exception_event(int fd) {
1726 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1728 return m_socket_server.filter_exception_event(fd);
1731 int get_server_id() {
1732 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1734 return m_socket_server.get_id();
1737 bool socket_check_client_connection(const Socket& client) {
1738 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1740 unsigned char buf [sizeof(uint32)];
1742 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1744 if (nbytes == sizeof(uint32))
1748 LOGW ("Error occurred when reading socket: %s", client.get_error_message().c_str());
1750 LOGW ("Timeout when reading socket");
1757 * @brief Callback function for ecore fd handler.
1759 * @param data The data to pass to this callback.
1760 * @param fd_handler The ecore fd handler.
1762 * @return ECORE_CALLBACK_RENEW
1764 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1765 if (fd_handler == NULL || data == NULL)
1766 return ECORE_CALLBACK_RENEW;
1768 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1770 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1772 return ECORE_CALLBACK_RENEW;
1774 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1775 if (fd_handler == _agent->_read_handler_list [i]) {
1776 if (!_agent->filter_event(fd)) {
1777 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1779 ecore_main_fd_handler_del(fd_handler);
1781 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!", fd);
1784 return ECORE_CALLBACK_RENEW;
1788 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1789 _agent->filter_exception_event(fd);
1791 ecore_main_fd_handler_del(fd_handler);
1793 ISF_SAVE_LOG("Received exception event (fd=%d)!!!", fd);
1794 return ECORE_CALLBACK_RENEW;
1797 void socket_accept_callback(SocketServer* server,
1798 const Socket& client) {
1799 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1803 if (m_should_exit) {
1804 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1807 //m_signal_accept_connection (client.get_id ());
1808 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1809 _read_handler_list.push_back(panel_agent_read_handler);
1815 void socket_receive_callback(SocketServer* server,
1816 const Socket& client) {
1817 int client_id = client.get_id();
1823 ClientInfo client_info;
1825 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1827 /* If the connection is closed then close this client. */
1828 if (!socket_check_client_connection(client)) {
1829 LOGW ("check client connection failed");
1830 socket_close_connection(server, client);
1834 client_info = m_info_manager->socket_get_client_info(client_id);
1836 /* If it's a new client, then request to open the connection first. */
1837 if (client_info.type == UNKNOWN_CLIENT) {
1838 socket_open_connection(server, client);
1842 /* If can not read the transaction,
1843 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1844 * or the key is mismatch,
1846 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1847 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1848 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1849 LOGW ("cmd:%d key:%d client info key: %d", cmd, key, client_info.key);
1853 if (client_info.type == FRONTEND_ACT_CLIENT) {
1854 if (m_recv_trans.get_data(context)) {
1855 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1856 socket_transaction_start();
1858 while (m_recv_trans.get_command(cmd)) {
1859 LOGD ("PanelAgent::cmd = %d", cmd);
1861 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1864 if (m_recv_trans.get_data(id)) {
1865 m_info_manager->register_panel_client(client_id, id);
1867 LOGW ("wrong format of transaction");
1872 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1873 if (m_recv_trans.get_data(uuid)) {
1874 m_info_manager->register_input_context(client_id, context, uuid);
1876 LOGW ("wrong format of transaction");
1881 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1882 m_info_manager->remove_input_context(client_id, context);
1885 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1886 m_info_manager->socket_reset_input_context(client_id, context);
1889 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1890 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1892 if (m_recv_trans.get_data(uuid)) {
1893 m_info_manager->focus_in(client_id, context, uuid);
1895 LOGW ("wrong format of transaction");
1900 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1903 if (m_recv_trans.get_data(isOn)) {
1904 m_info_manager->socket_turn_on_log(isOn);
1906 LOGW ("wrong format of transaction");
1911 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1912 m_info_manager->show_isf_panel(client_id);
1914 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1915 m_info_manager->hide_isf_panel(client_id);
1917 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1924 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1927 LOGW ("wrong format of transaction");
1931 Socket client_socket(client_id);
1934 trans.put_command(SCIM_TRANS_CMD_REPLY);
1935 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1936 trans.put_data(ret);
1937 trans.write_to_socket(client_socket);
1940 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1946 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1950 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1951 m_info_manager->hide_ise_panel(client_id, client, context);
1953 LOGW ("wrong format of transaction");
1957 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1958 struct rectinfo info;
1959 m_info_manager->get_input_panel_geometry(client_id, info);
1961 Socket client_socket(client_id);
1964 trans.put_command(SCIM_TRANS_CMD_REPLY);
1965 trans.put_command(SCIM_TRANS_CMD_OK);
1966 trans.put_data(info.pos_x);
1967 trans.put_data(info.pos_y);
1968 trans.put_data(info.width);
1969 trans.put_data(info.height);
1970 trans.write_to_socket(client_socket);
1972 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1973 struct rectinfo info;
1974 m_info_manager->get_candidate_window_geometry(client_id, info);
1976 Socket client_socket(client_id);
1979 trans.put_command(SCIM_TRANS_CMD_REPLY);
1980 trans.put_command(SCIM_TRANS_CMD_OK);
1981 trans.put_data(info.pos_x);
1982 trans.put_data(info.pos_y);
1983 trans.put_data(info.width);
1984 trans.put_data(info.height);
1985 trans.write_to_socket(client_socket);
1987 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1990 m_info_manager->get_ise_language_locale(client_id, &data, len);
1993 trans.put_command(SCIM_TRANS_CMD_REPLY);
1995 if (data != NULL && len > 0) {
1996 trans.put_command(SCIM_TRANS_CMD_OK);
1997 trans.put_data(data, len);
1999 trans.put_command(SCIM_TRANS_CMD_FAIL);
2002 Socket client_socket(client_id);
2003 trans.write_to_socket(client_socket);
2009 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
2012 if (m_recv_trans.get_data(language)) {
2013 m_info_manager->set_ise_language(client_id, language);
2015 LOGW ("wrong format of transaction");
2019 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
2020 char* imdata = NULL;
2023 if (m_recv_trans.get_data(&imdata, len)) {
2024 m_info_manager->set_ise_imdata(client_id, imdata, len);
2026 LOGW ("wrong format of transaction");
2033 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
2034 char* imdata = NULL;
2036 m_info_manager->get_ise_imdata(client_id, &imdata, len);
2038 Socket client_socket(client_id);
2041 trans.put_command(SCIM_TRANS_CMD_REPLY);
2044 trans.put_command(SCIM_TRANS_CMD_OK);
2045 trans.put_data(imdata, len);
2047 trans.put_command(SCIM_TRANS_CMD_FAIL);
2050 trans.write_to_socket(client_socket);
2056 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
2059 if (m_recv_trans.get_data(type)) {
2060 m_info_manager->set_ise_return_key_type(client_id, type);
2062 LOGW ("wrong format of transaction");
2066 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
2068 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
2070 Socket client_socket(client_id);
2073 trans.put_command(SCIM_TRANS_CMD_REPLY);
2076 trans.put_command(SCIM_TRANS_CMD_OK);
2077 trans.put_data(type);
2079 trans.put_command(SCIM_TRANS_CMD_FAIL);
2082 trans.write_to_socket(client_socket);
2084 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
2087 if (m_recv_trans.get_data(disabled)) {
2088 m_info_manager->set_ise_return_key_disable(client_id, disabled);
2090 LOGW ("wrong format of transaction");
2094 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
2097 ret = m_info_manager->get_ise_return_key_disable(client_id, disabled);
2099 Socket client_socket(client_id);
2102 trans.put_command(SCIM_TRANS_CMD_REPLY);
2105 trans.put_command(SCIM_TRANS_CMD_OK);
2106 trans.put_data(disabled);
2108 trans.put_command(SCIM_TRANS_CMD_FAIL);
2111 trans.write_to_socket(client_socket);
2113 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
2115 bool ret = m_info_manager->get_ise_layout(client_id, layout);
2117 Socket client_socket(client_id);
2120 trans.put_command(SCIM_TRANS_CMD_REPLY);
2123 trans.put_command(SCIM_TRANS_CMD_OK);
2124 trans.put_data(layout);
2126 trans.put_command(SCIM_TRANS_CMD_FAIL);
2129 trans.write_to_socket(client_socket);
2131 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
2134 if (m_recv_trans.get_data(layout)) {
2135 m_info_manager->set_ise_layout(client_id, layout);
2137 LOGW ("wrong format of transaction");
2141 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
2144 if (m_recv_trans.get_data(mode)) {
2145 m_info_manager->set_ise_caps_mode(client_id, mode);
2147 LOGW ("wrong format of transaction");
2151 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
2152 m_info_manager->will_show_ack(client_id);
2154 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
2155 m_info_manager->will_hide_ack(client_id);
2157 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
2160 if (m_recv_trans.get_data(mode)) {
2161 m_info_manager->set_keyboard_mode(client_id, mode);
2163 LOGW ("wrong format of transaction");
2167 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2168 m_info_manager->candidate_will_hide_ack(client_id);
2170 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2176 if (m_recv_trans.get_data(key)) {
2178 m_info_manager->process_key_event(key, result);
2180 LOGW ("wrong format of transaction");
2184 Socket client_socket(client_id);
2187 trans.put_command(SCIM_TRANS_CMD_REPLY);
2190 trans.put_command(SCIM_TRANS_CMD_OK);
2191 trans.put_data(result);
2193 trans.put_command(SCIM_TRANS_CMD_FAIL);
2196 trans.write_to_socket(client_socket);
2198 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2200 m_info_manager->get_active_helper_option(client_id, option);
2202 Socket client_socket(client_id);
2205 trans.put_command(SCIM_TRANS_CMD_REPLY);
2206 trans.put_command(SCIM_TRANS_CMD_OK);
2207 trans.put_data(option);
2208 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2209 trans.write_to_socket(client_socket);
2211 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2213 m_info_manager->get_ise_state(client_id, state);
2215 Socket client_socket(client_id);
2218 trans.put_command(SCIM_TRANS_CMD_REPLY);
2219 trans.put_command(SCIM_TRANS_CMD_OK);
2220 trans.put_data(state);
2221 trans.write_to_socket(client_socket);
2223 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2226 if (m_recv_trans.get_data(input_mode)) {
2227 m_info_manager->set_ise_input_mode(client_id, input_mode);
2229 LOGW ("wrong format of transaction");
2233 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2236 if (m_recv_trans.get_data(input_hint)) {
2237 m_info_manager->set_ise_input_hint(client_id, input_hint);
2239 LOGW ("wrong format of transaction");
2243 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2244 uint32 bidi_direction;
2246 if (m_recv_trans.get_data(bidi_direction)) {
2247 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2249 LOGW ("wrong format of transaction");
2253 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2254 m_info_manager->show_ise_option_window(client_id);
2256 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
2257 m_info_manager->resume_ise_option_window(client_id);
2264 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2267 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2268 m_info_manager->socket_start_helper(client_id, context, uuid);
2270 LOGW ("wrong format of transaction");
2274 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2277 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2278 uuid.length() && m_nest_trans.valid()) {
2279 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2281 LOGW ("wrong format of transaction");
2285 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2288 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2289 m_info_manager->socket_stop_helper(client_id, context, uuid);
2291 LOGW ("wrong format of transaction");
2300 /* Client must focus in before do any other things. */
2301 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2302 m_info_manager->socket_turn_on();
2303 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2304 m_info_manager->socket_turn_off();
2305 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2308 if (m_recv_trans.get_data(num))
2309 m_info_manager->socket_update_screen(client_id, num);
2311 LOGW ("wrong format of transaction");
2312 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2315 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2316 m_info_manager->socket_update_spot_location(x, y, top_y);
2318 LOGW ("wrong format of transaction");
2320 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2323 if (m_recv_trans.get_data(cursor_pos)) {
2324 m_info_manager->socket_update_cursor_position(cursor_pos);
2326 LOGW ("wrong format of transaction");
2328 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2332 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2333 m_info_manager->socket_update_surrounding_text(text, cursor);
2335 LOGW ("wrong format of transaction");
2337 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2340 if (m_recv_trans.get_data(text)) {
2341 m_info_manager->socket_update_selection(text);
2343 LOGW ("wrong format of transaction");
2345 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2346 m_info_manager->expand_candidate();
2347 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2348 m_info_manager->contract_candidate();
2349 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2350 uint32 portrait_line, mode;
2352 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2353 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2355 LOGW ("wrong format of transaction");
2356 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2357 PanelFactoryInfo info;
2359 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2360 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2361 m_info_manager->socket_update_factory_info(info);
2363 LOGW ("wrong format of transaction");
2365 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2366 m_info_manager->socket_show_preedit_string();
2367 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2368 m_info_manager->socket_show_aux_string();
2369 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2370 m_info_manager->socket_show_lookup_table();
2371 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2372 m_info_manager->socket_show_associate_table();
2373 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2374 m_info_manager->socket_hide_preedit_string();
2375 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2376 m_info_manager->socket_hide_aux_string();
2377 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2378 m_info_manager->socket_hide_lookup_table();
2379 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2380 m_info_manager->socket_hide_associate_table();
2381 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2383 AttributeList attrs;
2386 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2387 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2389 LOGW ("wrong format of transaction");
2390 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2393 if (m_recv_trans.get_data(caret))
2394 m_info_manager->socket_update_preedit_caret(caret);
2396 LOGW ("wrong format of transaction");
2397 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2399 AttributeList attrs;
2401 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2402 m_info_manager->socket_update_aux_string(str, attrs);
2404 LOGW ("wrong format of transaction");
2405 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2412 AttributeList attrs;
2414 if (m_recv_trans.get_data(target_ic) &&
2415 m_recv_trans.get_data(target_uuid) &&
2416 m_recv_trans.get_data(offset) &&
2417 m_recv_trans.get_data(len) &&
2418 m_recv_trans.get_data(preedit) &&
2419 m_recv_trans.get_data(commit) &&
2420 m_recv_trans.get_data(attrs)) {
2421 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2423 LOGW ("wrong format of transaction");
2425 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2426 CommonLookupTable _isf_candidate_table;
2428 if (m_recv_trans.get_data(_isf_candidate_table))
2429 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2431 LOGW ("wrong format of transaction");
2433 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2434 CommonLookupTable table;
2436 if (m_recv_trans.get_data(table))
2437 m_info_manager->socket_update_associate_table(table);
2439 LOGW ("wrong format of transaction");
2440 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2441 PropertyList properties;
2443 if (m_recv_trans.get_data(properties))
2444 m_info_manager->socket_register_properties(properties);
2446 LOGW ("wrong format of transaction");
2447 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2450 if (m_recv_trans.get_data(property))
2451 m_info_manager->socket_update_property(property);
2453 LOGW ("wrong format of transaction");
2454 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2457 if (m_recv_trans.get_data(help))
2458 m_info_manager->socket_show_help(help);
2460 LOGW ("wrong format of transaction");
2461 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2462 PanelFactoryInfo info;
2463 std::vector <PanelFactoryInfo> vec;
2465 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2466 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2467 info.lang = scim_get_normalized_language(info.lang);
2468 vec.push_back(info);
2471 m_info_manager->socket_show_factory_menu(vec);
2472 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2473 m_info_manager->focus_out(client_id, context);
2475 LOGW ("unknown cmd: %d", cmd);
2479 socket_transaction_end();
2481 } else if (client_info.type == FRONTEND_CLIENT) {
2482 if (m_recv_trans.get_data(context)) {
2483 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2484 socket_transaction_start();
2486 while (m_recv_trans.get_command(cmd)) {
2487 LOGD ("PanelAgent::cmd = %d", cmd);
2489 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2490 Socket client_socket(client_id);
2494 trans.put_command(SCIM_TRANS_CMD_REPLY);
2495 trans.put_command(SCIM_TRANS_CMD_OK);
2496 trans.put_data(client_id);
2497 trans.write_to_socket(client_socket);
2500 LOGW ("unknown cmd: %d", cmd);
2504 socket_transaction_end();
2506 } else if (client_info.type == HELPER_CLIENT) {
2507 socket_transaction_start();
2509 while (m_recv_trans.get_command(cmd)) {
2510 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2513 if (m_recv_trans.get_data(info.uuid) &&
2514 m_recv_trans.get_data(info.name) &&
2515 m_recv_trans.get_data(info.icon) &&
2516 m_recv_trans.get_data(info.description) &&
2517 m_recv_trans.get_data(info.option) &&
2518 info.uuid.length()) {
2519 m_info_manager->socket_helper_register_helper(client_id, info);
2522 LOGW ("unknown cmd: %d", cmd);
2526 socket_transaction_end();
2527 } else if (client_info.type == HELPER_ACT_CLIENT) {
2528 socket_transaction_start();
2530 while (m_recv_trans.get_command(cmd)) {
2531 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2534 if (m_recv_trans.get_data(info.uuid) &&
2535 m_recv_trans.get_data(info.name) &&
2536 m_recv_trans.get_data(info.icon) &&
2537 m_recv_trans.get_data(info.description) &&
2538 m_recv_trans.get_data(info.option) &&
2539 info.uuid.length()) {
2540 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2542 LOGW ("wrong format of transaction");
2545 /* Check whether application already requested the focus_in and showing input_panel
2546 * If so, Input FW request focus_in and show input_panel again to helper IME.
2547 * Because Helper IME couldn't receive these events during the launch.
2549 m_info_manager->reshow_input_panel ();
2550 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2555 if (m_recv_trans.get_data(target_ic) &&
2556 m_recv_trans.get_data(target_uuid) &&
2557 m_recv_trans.get_data(wstr) &&
2559 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2561 LOGW ("wrong format of transaction");
2563 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2567 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2568 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2570 LOGW ("wrong format of transaction");
2572 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2573 m_info_manager->socket_show_aux_string();
2574 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2575 m_info_manager->socket_show_lookup_table();
2576 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2577 m_info_manager->socket_show_associate_table();
2578 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2582 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2583 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2585 LOGW ("wrong format of transaction");
2587 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2588 m_info_manager->socket_hide_aux_string();
2589 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2590 m_info_manager->socket_hide_lookup_table();
2591 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2592 m_info_manager->socket_hide_associate_table();
2593 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2598 AttributeList attrs;
2601 if (m_recv_trans.get_data(target_ic) &&
2602 m_recv_trans.get_data(target_uuid) &&
2603 m_recv_trans.get_data(preedit) &&
2604 m_recv_trans.get_data(commit) &&
2605 m_recv_trans.get_data(attrs) &&
2606 m_recv_trans.get_data(caret)) {
2607 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2609 LOGW ("wrong format of transaction");
2611 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2614 if (m_recv_trans.get_data(caret)) {
2615 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2617 LOGW ("wrong format of transaction");
2619 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2621 AttributeList attrs;
2623 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2624 m_info_manager->socket_update_aux_string(str, attrs);
2626 LOGW ("wrong format of transaction");
2627 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2628 CommonLookupTable _isf_candidate_table;
2630 if (m_recv_trans.get_data(_isf_candidate_table)) {
2631 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2633 LOGW ("wrong format of transaction");
2635 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2636 CommonLookupTable _isf_candidate_table;
2638 if (m_recv_trans.get_data(_isf_candidate_table)) {
2639 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2641 LOGW ("wrong format of transaction");
2643 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2644 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2649 if (m_recv_trans.get_data(target_ic) &&
2650 m_recv_trans.get_data(target_uuid) &&
2651 m_recv_trans.get_data(key) &&
2653 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2655 LOGW ("wrong format of transaction");
2657 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2662 if (m_recv_trans.get_data(target_ic) &&
2663 m_recv_trans.get_data(target_uuid) &&
2664 m_recv_trans.get_data(key) &&
2666 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2668 LOGW ("wrong format of transaction");
2670 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2674 if (m_recv_trans.get_data(target_ic) &&
2675 m_recv_trans.get_data(target_uuid) &&
2676 m_recv_trans.get_data(m_nest_trans) &&
2677 m_nest_trans.valid()) {
2678 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2680 LOGW ("wrong format of transaction");
2682 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2683 PropertyList properties;
2685 if (m_recv_trans.get_data(properties))
2686 m_info_manager->socket_helper_register_properties(client_id, properties);
2688 LOGW ("wrong format of transaction");
2689 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2692 if (m_recv_trans.get_data(property))
2693 m_info_manager->socket_helper_update_property(client_id, property);
2695 LOGW ("wrong format of transaction");
2696 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2700 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2701 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2703 LOGW ("wrong format of transaction");
2705 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_LANGUAGE_LOCALE) {
2710 if (m_recv_trans.get_data(&data, len)) {
2712 locale = String(data, len);
2713 m_info_manager->socket_helper_update_language_locale(client_id, locale);
2715 LOGW("wrong format of transaction : %p %d", data, len);
2718 LOGW("wrong format of transaction");
2723 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2726 if (m_recv_trans.get_data(uuid)) {
2727 m_info_manager->socket_get_keyboard_ise_list(uuid);
2729 LOGW ("wrong format of transaction");
2731 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2732 uint32 portrait_line, mode;
2734 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2735 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2737 LOGW ("wrong format of transaction");
2738 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2741 if (m_recv_trans.get_data(uuid)) {
2742 m_info_manager->socket_get_candidate_ui(uuid);
2744 LOGW ("wrong format of transaction");
2746 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2749 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2750 m_info_manager->socket_set_candidate_position(left, top);
2752 LOGW ("wrong format of transaction");
2753 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2754 m_info_manager->socket_hide_candidate();
2755 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2758 if (m_recv_trans.get_data(uuid)) {
2759 m_info_manager->socket_get_candidate_geometry(uuid);
2761 LOGW ("wrong format of transaction");
2763 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2764 m_info_manager->reset_keyboard_ise();
2765 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2768 if (m_recv_trans.get_data(uuid)) {
2769 m_info_manager->socket_set_keyboard_ise(uuid);
2771 LOGW ("wrong format of transaction");
2773 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2776 if (m_recv_trans.get_data(uuid)) {
2777 m_info_manager->socket_get_keyboard_ise(uuid);
2779 LOGW ("wrong format of transaction");
2781 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2782 uint32 x, y, width, height;
2784 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2785 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2786 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2788 LOGW ("wrong format of transaction");
2790 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2791 m_info_manager->expand_candidate();
2792 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2793 m_info_manager->contract_candidate();
2794 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2797 if (m_recv_trans.get_data(index))
2798 m_info_manager->socket_helper_select_candidate(index);
2800 LOGW ("wrong format of transaction");
2801 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2803 uint32 maxlen_before;
2804 uint32 maxlen_after;
2806 if (m_recv_trans.get_data(uuid) &&
2807 m_recv_trans.get_data(maxlen_before) &&
2808 m_recv_trans.get_data(maxlen_after)) {
2809 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2811 LOGW ("wrong format of transaction");
2813 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2817 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2818 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2820 LOGW ("wrong format of transaction");
2822 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2825 if (m_recv_trans.get_data(uuid)) {
2826 m_info_manager->socket_helper_get_selection(client_id, uuid);
2828 LOGW ("wrong format of transaction");
2830 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2834 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2835 m_info_manager->socket_helper_set_selection(client_id, start, end);
2837 LOGW ("wrong format of transaction");
2839 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2842 if (m_recv_trans.get_data(command)) {
2843 m_info_manager->socket_helper_send_private_command(client_id, command);
2845 LOGW ("wrong format of transaction");
2848 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2849 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2850 } else if (cmd == SCIM_TRANS_CMD_COMMIT_CONTENT) {
2855 if (m_recv_trans.get_data(content) &&
2856 m_recv_trans.get_data(description) &&
2857 m_recv_trans.get_data(mime_types)) {
2858 m_info_manager->socket_helper_commit_content(client_id, content, description, mime_types);
2860 LOGW ("wrong format of transaction");
2862 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2867 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2868 m_info_manager->process_key_event_done(key, ret, serial);
2870 LOGW ("wrong format of transaction");
2872 } else if (cmd == ISM_TRANS_CMD_REQUEST_ISE_HIDE) {
2873 m_info_manager->request_ise_hide();
2874 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2881 AttributeList attrs;
2883 if (m_recv_trans.get_data(target_ic) &&
2884 m_recv_trans.get_data(target_uuid) &&
2885 m_recv_trans.get_data(offset) &&
2886 m_recv_trans.get_data(len) &&
2887 m_recv_trans.get_data(preedit) &&
2888 m_recv_trans.get_data(commit) &&
2889 m_recv_trans.get_data(attrs)) {
2890 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2892 LOGW ("wrong format of transaction");
2895 LOGW ("unknown cmd: %d", cmd);
2899 socket_transaction_end();
2900 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2901 socket_transaction_start();
2903 while (m_recv_trans.get_command(cmd)) {
2904 LOGD ("PanelAgent::cmd = %d", cmd);
2906 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2907 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2908 String default_uuid;
2909 m_info_manager->get_active_ise(client_id, default_uuid);
2911 Socket client_socket(client_id);
2914 trans.put_command(SCIM_TRANS_CMD_REPLY);
2915 trans.put_command(SCIM_TRANS_CMD_OK);
2916 trans.put_data(default_uuid);
2917 trans.write_to_socket(client_socket);
2920 LOGW ("Access denied to get active ise");
2921 send_fail_reply (client_id);
2923 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2924 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2929 if (m_recv_trans.get_data(&buf, len)) {
2930 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2932 LOGW ("wrong format of transaction");
2936 Socket client_socket(client_id);
2939 trans.put_command(SCIM_TRANS_CMD_REPLY);
2940 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2941 trans.write_to_socket(client_socket);
2947 LOGW ("Access denied to set active ise");
2948 send_fail_reply (client_id);
2950 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2951 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2956 //ret need be checked
2957 if (m_recv_trans.get_data(&buf, len)) {
2958 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2960 LOGW ("wrong format of transaction");
2964 Socket client_socket(client_id);
2967 trans.put_command(SCIM_TRANS_CMD_REPLY);
2968 trans.put_command(SCIM_TRANS_CMD_OK);
2969 trans.write_to_socket(client_socket);
2975 LOGW ("Access denied to set initial ise");
2976 send_fail_reply (client_id);
2978 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2979 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2980 std::vector<String> strlist;
2981 m_info_manager->get_ise_list(client_id, strlist);
2983 Socket client_socket(client_id);
2989 trans.put_command(SCIM_TRANS_CMD_REPLY);
2990 trans.put_command(SCIM_TRANS_CMD_OK);
2992 num = strlist.size();
2993 trans.put_data(num);
2995 for (unsigned int i = 0; i < num; i++) {
2996 buf = const_cast<char*>(strlist[i].c_str());
2997 len = strlen(buf) + 1;
2998 trans.put_data(buf, len);
3001 trans.write_to_socket(client_socket);
3004 LOGW ("Access denied to get ise list");
3005 send_fail_reply (client_id);
3007 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
3008 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3009 HELPER_ISE_INFO info;
3010 m_info_manager->get_all_helper_ise_info(client_id, info);
3014 Socket client_socket(client_id);
3017 trans.put_command(SCIM_TRANS_CMD_REPLY);
3018 trans.put_command(SCIM_TRANS_CMD_OK);
3020 if (info.appid.size() > 0) {
3021 trans.put_data(info.appid);
3022 trans.put_data(info.label);
3023 trans.put_data(info.is_enabled);
3024 trans.put_data(info.is_preinstalled);
3025 trans.put_data(info.has_option);
3028 trans.write_to_socket(client_socket);
3032 LOGW ("Access denied to get all helper ise info");
3033 send_fail_reply (client_id);
3035 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
3036 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3041 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
3042 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
3045 LOGW ("wrong format of transaction");
3049 Socket client_socket(client_id);
3052 trans.put_command(SCIM_TRANS_CMD_REPLY);
3053 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3054 trans.write_to_socket(client_socket);
3057 LOGW ("Access denied to set enable helper ise info");
3058 send_fail_reply (client_id);
3060 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
3061 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3062 String strUuid, strName, strLanguage, strModuleName;
3066 if (m_recv_trans.get_data(strUuid)) {
3067 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
3069 LOGW ("wrong format of transaction");
3073 Socket client_socket(client_id);
3075 trans.put_command(SCIM_TRANS_CMD_REPLY);
3076 trans.put_command(SCIM_TRANS_CMD_OK);
3077 trans.put_data(strName);
3078 trans.put_data(strLanguage);
3079 trans.put_data(nType);
3080 trans.put_data(nOption);
3081 trans.put_data(strModuleName);
3082 trans.write_to_socket(client_socket);
3085 LOGW ("Access denied to get ise information");
3086 send_fail_reply (client_id);
3088 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
3089 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3091 Socket client_socket(client_id);
3094 trans.put_command(SCIM_TRANS_CMD_REPLY);
3095 trans.put_command(SCIM_TRANS_CMD_OK);
3096 trans.write_to_socket(client_socket);
3097 m_info_manager->show_helper_ise_selector(client_id);
3098 m_info_manager->reset_ise_option(client_id);
3101 LOGW ("Access denied to reset ise option");
3102 send_fail_reply (client_id);
3104 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
3105 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3106 m_info_manager->reset_default_ise(client_id);
3109 LOGW ("Access denied to reset default ise");
3110 send_fail_reply (client_id);
3112 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
3113 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3114 m_info_manager->show_isf_panel(client_id);
3117 LOGW ("Access denied to show isf control");
3118 send_fail_reply (client_id);
3120 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
3121 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3122 m_info_manager->show_ise_option_window(client_id);
3125 LOGW ("Access denied to show ise option window");
3126 send_fail_reply (client_id);
3128 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
3129 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3130 m_info_manager->resume_ise_option_window(client_id);
3133 LOGW ("Access denied to resume ise option window");
3134 send_fail_reply (client_id);
3136 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
3137 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3139 Socket client_socket(client_id);
3142 trans.put_command(SCIM_TRANS_CMD_REPLY);
3143 trans.put_command(SCIM_TRANS_CMD_OK);
3144 trans.write_to_socket(client_socket);
3146 m_info_manager->show_helper_ise_list(client_id);
3149 LOGW ("Access denied to show helper ise list");
3150 send_fail_reply (client_id);
3152 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
3153 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3155 Socket client_socket(client_id);
3158 trans.put_command(SCIM_TRANS_CMD_REPLY);
3159 trans.put_command(SCIM_TRANS_CMD_OK);
3160 trans.write_to_socket(client_socket);
3161 m_info_manager->show_helper_ise_selector(client_id);
3164 LOGW ("Access denied to show helper ise selector");
3165 send_fail_reply (client_id);
3167 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
3168 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3170 uint32 nEnabled = 0;
3172 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
3174 Socket client_socket(client_id);
3176 trans.put_command(SCIM_TRANS_CMD_REPLY);
3177 trans.put_command(SCIM_TRANS_CMD_OK);
3178 trans.put_data(static_cast<uint32>(nEnabled));
3179 trans.write_to_socket(client_socket);
3182 LOGW ("Access denied to check helper ise enabled");
3183 send_fail_reply (client_id);
3185 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
3189 Socket client_socket(client_id);
3192 trans.put_command(SCIM_TRANS_CMD_REPLY);
3194 if (m_recv_trans.get_data(angle)) {
3195 struct rectinfo info = {0, 0, 0, 0};
3196 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
3198 trans.put_command(SCIM_TRANS_CMD_OK);
3199 trans.put_data(info.pos_x);
3200 trans.put_data(info.pos_y);
3201 trans.put_data(info.width);
3202 trans.put_data(info.height);
3204 trans.put_command(SCIM_TRANS_CMD_FAIL);
3207 trans.write_to_socket(client_socket);
3208 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
3210 Socket client_socket(client_id);
3213 trans.put_command(SCIM_TRANS_CMD_REPLY);
3214 trans.put_command(SCIM_TRANS_CMD_OK);
3215 trans.write_to_socket(client_socket);
3216 m_info_manager->hide_helper_ise ();
3217 } else if (cmd == ISM_TRANS_CMD_LAUNCH_ISE) {
3218 m_info_manager->launch_helper_ise();
3221 Socket client_socket(client_id);
3224 trans.put_command(SCIM_TRANS_CMD_REPLY);
3225 trans.put_command(SCIM_TRANS_CMD_OK);
3226 trans.write_to_socket(client_socket);
3228 LOGW ("unknown cmd: %d", cmd);
3232 socket_transaction_end();
3233 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
3234 socket_transaction_start();
3235 while (m_recv_trans.get_command(cmd)) {
3236 if (cmd == ISM_REMOTE_TRANS_CMD_SEND_INPUT_MESSAGE) {
3241 if (m_recv_trans.get_data(&buf, len)) {
3242 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
3244 LOGW ("wrong format of transaction");
3248 Socket client_socket(client_id);
3251 trans.put_command(SCIM_TRANS_CMD_REPLY);
3252 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3253 trans.write_to_socket(client_socket);
3257 } else if (cmd == ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE) {
3260 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE))
3264 Socket client_socket(client_id);
3267 trans.put_command(SCIM_TRANS_CMD_REPLY);
3268 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3269 trans.write_to_socket(client_socket);
3270 } else if (cmd == ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3275 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
3276 ret = m_info_manager->remoteinput_delete_surrounding_text(offset, len);
3278 LOGW ("wrong format of transaction");
3282 Socket client_socket(client_id);
3285 trans.put_command(SCIM_TRANS_CMD_REPLY);
3286 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3287 trans.write_to_socket(client_socket);
3289 LOGW ("unknown cmd: %d", cmd);
3293 socket_transaction_end ();
3297 void socket_exception_callback(SocketServer* server,
3298 const Socket& client) {
3299 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3300 LOGD ("client id:%d", client.get_id());
3301 socket_close_connection(server, client);
3304 bool socket_open_connection(SocketServer* server,
3305 const Socket& client) {
3306 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3307 LOGD ("client id:%d", client.get_id());
3309 String type = scim_socket_accept_connection(key,
3311 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3315 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3316 if (type.length()) {
3317 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3318 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3319 ((type == "Helper") ? HELPER_CLIENT :
3320 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3321 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3322 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3323 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3324 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3326 m_info_manager->add_client(client.get_id(), key, _type);
3330 LOGW ("open_connection failed");
3332 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3333 server->close_connection(client);
3337 void socket_close_connection(SocketServer* server,
3338 const Socket& client) {
3339 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3340 LOGD ("client id:%d", client.get_id());
3342 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3344 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos, ++i) {
3345 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3346 ::close (client.get_id ());
3347 ecore_main_fd_handler_del (_read_handler_list[i]);
3348 _read_handler_list.erase (IterPos);
3352 m_info_manager->del_client(client.get_id());
3355 void socket_transaction_start(void) {
3356 //m_signal_transaction_start ();
3359 void socket_transaction_end(void) {
3360 //m_signal_transaction_end ();
3367 //m_signal_unlock ();
3371 } /* namespace scim */
3373 /***************************************************/
3374 /*** Beginning of panel agent interface for ISF ***/
3375 /***************************************************/
3376 static scim::PanelAgentPointer instance;
3380 EXAPI void scim_module_init(void)
3384 EXAPI void scim_module_exit(void)
3389 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3394 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3396 scim::PanelAgentBase* _instance = NULL;
3397 if (instance.null()) {
3399 _instance = new scim::EcoreSocketPanelAgent();
3405 instance = _instance;
3412 vi:ts=4:nowrap:ai:expandtab