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"
56 #define REMOTEINPUT_PRIVILEGE "http://tizen.org/privilege/internal/default/platform"
58 #define SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY "/Panel/Socket/ConfigReadOnly"
63 struct HelperClientStub {
67 HelperClientStub(int i = 0, int r = 0) : id(i), ref(r) { }
70 struct IMControlStub {
71 std::vector<ISE_INFO> info;
72 std::vector<int> count;
75 void aul_wakeup_ime_application(int sockfd)
78 socklen_t len = sizeof(struct ucred);
79 if (getsockopt(sockfd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) {
80 int ret = aul_update_freezer_status((long)ucred.pid, "wakeup");
81 LOGD("aul_update_freezer_status : %d %d", ucred.pid, ret);
83 LOGD("getsockopt failed : %d", errno);
86 #define DEFAULT_CONTEXT_VALUE 0xfff
88 #define scim_module_init ecoresocket_LTX_scim_module_init
89 #define scim_module_exit ecoresocket_LTX_scim_module_exit
90 #define scim_panel_agent_module_init ecoresocket_LTX_scim_panel_agent_module_init
91 #define scim_panel_agent_module_get_instance ecoresocket_LTX_scim_panel_agent_module_get_instance
94 //==================================== PanelAgent ===========================
95 class EcoreSocketPanelAgent: public PanelAgentBase
100 String m_socket_address;
101 SocketServer m_socket_server;
103 Transaction m_send_trans;
104 Transaction m_recv_trans;
105 Transaction m_nest_trans;
107 bool m_should_shared_ise;
110 std::vector<Ecore_Fd_Handler*> _read_handler_list;
112 InfoManager* m_info_manager;
115 EcoreSocketPanelAgent()
116 : PanelAgentBase ("ecore_socket"),
117 m_should_exit(false),
118 m_socket_timeout(scim_get_default_socket_timeout()),
119 m_should_shared_ise(false),
120 m_ise_exiting(false),
121 m_info_manager(NULL) {
122 m_socket_server.signal_connect_accept(slot(this, &EcoreSocketPanelAgent::socket_accept_callback));
123 m_socket_server.signal_connect_receive(slot(this, &EcoreSocketPanelAgent::socket_receive_callback));
124 m_socket_server.signal_connect_exception(slot(this, &EcoreSocketPanelAgent::socket_exception_callback));
127 ~EcoreSocketPanelAgent() {
129 for (unsigned int ii = 0; ii < _read_handler_list.size(); ++ii) {
130 ecore_main_fd_handler_del(_read_handler_list[ii]);
132 _read_handler_list.clear();
135 bool initialize(InfoManager* info_manager, const String& display, bool resident) {
136 m_info_manager = info_manager;
137 m_socket_address = scim_get_default_panel_socket_address(display);
139 m_socket_server.shutdown();
141 if (m_socket_server.create(SocketAddress(m_socket_address))) {
142 Ecore_Fd_Handler* panel_agent_read_handler = NULL;
143 panel_agent_read_handler = ecore_main_fd_handler_add(get_server_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
144 _read_handler_list.push_back(panel_agent_read_handler);
147 LOGE("create server failed");
151 bool valid(void) const {
152 return m_socket_server.valid();
156 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
158 m_should_exit = true;
161 if (client.connect(SocketAddress(m_socket_address))) {
166 void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) {
167 LOGD ("client id:%d", client);
168 Socket client_socket(client);
169 m_send_trans.clear();
170 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
171 m_send_trans.put_data(context_id);
172 m_send_trans.put_command(cmd);
173 m_send_trans.put_data(nType);
174 m_send_trans.put_data(nValue);
175 m_send_trans.write_to_socket(client_socket);
178 void move_preedit_caret(int client, uint32 context_id, uint32 position) {
179 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
180 LOGD ("client id:%d", client);
181 Socket client_socket(client);
182 m_send_trans.clear();
183 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
184 m_send_trans.put_data((uint32) context_id);
185 m_send_trans.put_command(SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
186 m_send_trans.put_data((uint32) position);
187 m_send_trans.write_to_socket(client_socket);
192 void request_help(int client_id, uint32 context_id) {
193 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
194 LOGD ("client id:%d", client_id);
196 Socket client_socket(client_id);
197 m_send_trans.clear();
198 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
199 m_send_trans.put_data((uint32) context_id);
200 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
201 m_send_trans.write_to_socket(client_socket);
204 void request_factory_menu(int client_id, uint32 context_id) {
205 LOGD ("client id:%d", client_id);
206 Socket client_socket(client_id);
207 m_send_trans.clear();
208 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
209 m_send_trans.put_data((uint32) context_id);
210 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
211 m_send_trans.write_to_socket(client_socket);
215 void reset_keyboard_ise(int client, uint32 context_id) {
216 LOGD ("client id:%d", client);
217 Socket client_socket(client);
218 m_send_trans.clear();
219 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
220 m_send_trans.put_data((uint32) context_id);
221 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
222 m_send_trans.write_to_socket(client_socket);
225 void update_keyboard_ise_list(int client, uint32 context) {
226 LOGD ("client id:%d", client);
228 Socket client_socket(client);
229 m_send_trans.clear();
230 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
231 m_send_trans.put_data((uint32) context);
232 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
233 m_send_trans.write_to_socket(client_socket);
236 void change_factory(int client, uint32 context, const String& uuid) {
237 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
238 LOGD ("client id:%d", client);
240 Socket client_socket(client);
241 m_send_trans.clear();
242 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
243 m_send_trans.put_data((uint32) context);
244 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
245 m_send_trans.put_data(uuid);
246 m_send_trans.write_to_socket(client_socket);
249 void helper_candidate_show(int client, uint32 context, const String& uuid) {
250 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
251 LOGD ("client id:%d", client);
253 Socket client_socket(client);
255 m_send_trans.clear();
256 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
257 m_send_trans.put_data(context);
258 m_send_trans.put_data(uuid);
259 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
260 m_send_trans.write_to_socket(client_socket);
263 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
264 LOGD ("client id:%d", client);
266 Socket client_socket(client);
268 m_send_trans.clear();
269 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
270 m_send_trans.put_data(context);
271 m_send_trans.put_data(uuid);
272 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
273 m_send_trans.write_to_socket(client_socket);
276 void candidate_more_window_show(int client, uint32 context) {
277 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
278 LOGD ("client id:%d", client);
280 Socket client_socket(client);
282 m_send_trans.clear();
283 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
284 m_send_trans.put_data(context);
285 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
286 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
287 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
288 m_send_trans.write_to_socket(client_socket);
291 void candidate_more_window_hide(int client, uint32 context) {
292 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
293 LOGD ("client id:%d", client);
295 Socket client_socket(client);
297 m_send_trans.clear();
298 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
299 m_send_trans.put_data(context);
300 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
301 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
302 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
303 m_send_trans.write_to_socket(client_socket);
306 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
307 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
308 LOGD ("client id:%d", client);
310 Socket client_socket(client);
312 m_send_trans.clear();
313 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
314 m_send_trans.put_data(context);
315 m_send_trans.put_data(uuid);
316 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
317 m_send_trans.put_data(table);
318 m_send_trans.write_to_socket(client_socket);
321 void select_aux(int client, uint32 contextid, uint32 item) {
322 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
323 LOGD ("client id:%d", client);
325 Socket client_socket(client);
326 m_send_trans.clear();
327 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
328 m_send_trans.put_data((uint32) contextid);
330 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
331 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
333 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
334 m_send_trans.put_data((uint32)item);
335 m_send_trans.write_to_socket(client_socket);
338 void select_candidate(int client, uint32 context, uint32 item) {
339 LOGD ("client id:%d", client);
341 Socket client_socket(client);
342 m_send_trans.clear();
343 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
344 m_send_trans.put_data((uint32) context);
346 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
347 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
349 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
350 m_send_trans.put_data((uint32)item);
351 m_send_trans.write_to_socket(client_socket);
354 void lookup_table_page_up(int client, uint32 context) {
355 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
356 LOGD ("client id:%d", client);
358 Socket client_socket(client);
359 m_send_trans.clear();
360 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
361 m_send_trans.put_data((uint32) context);
363 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
364 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
366 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
367 m_send_trans.write_to_socket(client_socket);
370 void lookup_table_page_down(int client, uint32 context) {
371 LOGD ("client id:%d", client);
373 Socket client_socket(client);
374 m_send_trans.clear();
375 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
376 m_send_trans.put_data((uint32) context);
378 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
379 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
381 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
382 m_send_trans.write_to_socket(client_socket);
385 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
386 LOGD ("client id:%d", client);
388 Socket client_socket(client);
389 m_send_trans.clear();
390 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
391 m_send_trans.put_data((uint32) context);
393 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
394 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
396 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
397 m_send_trans.put_data(size);
398 m_send_trans.write_to_socket(client_socket);
401 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
402 LOGD ("client id:%d", client);
404 Socket client_socket(client);
405 m_send_trans.clear();
406 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
407 m_send_trans.put_data((uint32) context);
409 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
410 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
412 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
413 m_send_trans.put_data(row_items);
414 m_send_trans.write_to_socket(client_socket);
417 void select_associate(int client, uint32 context, uint32 item) {
418 LOGD ("client id:%d", client);
420 Socket client_socket(client);
421 m_send_trans.clear();
422 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
423 m_send_trans.put_data((uint32) context);
425 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
426 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
428 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
429 m_send_trans.put_data((uint32)item);
430 m_send_trans.write_to_socket(client_socket);
433 void associate_table_page_up(int client, uint32 context) {
434 LOGD ("client id:%d", client);
436 Socket client_socket(client);
437 m_send_trans.clear();
438 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
439 m_send_trans.put_data((uint32) context);
441 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
442 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
444 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
445 m_send_trans.write_to_socket(client_socket);
448 void associate_table_page_down(int client, uint32 context) {
449 LOGD ("client id:%d", client);
451 Socket client_socket(client);
452 m_send_trans.clear();
453 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
454 m_send_trans.put_data((uint32) context);
456 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
457 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
459 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
460 m_send_trans.write_to_socket(client_socket);
463 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
464 LOGD ("client id:%d", client);
466 Socket client_socket(client);
467 m_send_trans.clear();
468 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
469 m_send_trans.put_data((uint32) context);
471 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
472 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
474 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
475 m_send_trans.put_data(size);
476 m_send_trans.write_to_socket(client_socket);
479 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
480 LOGD ("client id:%d", client);
482 Socket client_socket(client);
483 m_send_trans.clear();
484 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
485 m_send_trans.put_data((uint32) context);
487 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
488 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
490 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
491 m_send_trans.put_data(size);
492 m_send_trans.write_to_socket(client_socket);
495 void send_longpress_event(int client, uint32 context, int index) {
496 LOGD ("client id:%d", client);
498 Socket client_socket(client);
499 m_send_trans.clear();
500 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
501 m_send_trans.put_data((uint32) context);
503 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
504 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
506 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
507 m_send_trans.put_data(index);
508 m_send_trans.write_to_socket(client_socket);
511 void trigger_property(int client, uint32 context, const String& property) {
512 LOGD ("client id:%d", client);
514 Socket client_socket(client);
515 m_send_trans.clear();
516 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
517 m_send_trans.put_data((uint32) context);
519 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
520 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
522 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
523 m_send_trans.put_data(property);
524 m_send_trans.write_to_socket(client_socket);
527 void focus_out_helper(int client, uint32 context, const String& uuid) {
528 LOGD ("client id:%d", client);
530 Socket client_socket(client);
531 m_send_trans.clear();
532 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
533 m_send_trans.put_data(context);
534 m_send_trans.put_data(uuid);
535 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
536 m_send_trans.write_to_socket(client_socket);
539 void focus_in_helper(int client, uint32 context, const String& uuid) {
540 LOGD ("client id:%d", client);
542 Socket client_socket(client);
543 m_send_trans.clear();
544 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
545 m_send_trans.put_data(context);
546 m_send_trans.put_data(uuid);
547 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
548 m_send_trans.write_to_socket(client_socket);
551 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
552 LOGD ("client id:%d", client);
554 Socket client_socket(client);
556 aul_wakeup_ime_application(client_socket.get_id());
558 m_send_trans.clear();
559 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
560 m_send_trans.put_data(context);
561 m_send_trans.put_data(uuid);
562 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
563 m_send_trans.put_data(data, len);
564 m_send_trans.write_to_socket(client_socket);
567 void hide_helper(int client, uint32 context, const String& uuid) {
568 LOGD ("client id:%d", client);
570 Socket client_socket(client);
571 m_send_trans.clear();
572 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
573 m_send_trans.put_data(context);
574 m_send_trans.put_data(uuid);
575 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
576 m_send_trans.write_to_socket(client_socket);
579 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
580 LOGD ("client id:%d", client);
582 Socket client_socket(client);
583 m_send_trans.clear();
584 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
585 m_send_trans.put_data(context);
586 m_send_trans.put_data(uuid);
587 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
588 m_send_trans.put_data(mode);
589 m_send_trans.write_to_socket(client_socket);
592 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
593 LOGD ("client id:%d", client);
595 Socket client_socket(client);
596 m_send_trans.clear();
597 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
598 m_send_trans.put_data(context);
599 m_send_trans.put_data(uuid);
600 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
601 m_send_trans.put_data(language);
602 m_send_trans.write_to_socket(client_socket);
605 void set_helper_imdata(int client, uint32 context, const String& uuid, const char* imdata, size_t& len) {
606 LOGD ("client id:%d", client);
608 Socket client_socket(client);
609 m_send_trans.clear();
610 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
611 m_send_trans.put_data(context);
612 m_send_trans.put_data(uuid);
613 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
614 m_send_trans.put_data(imdata, len);
615 m_send_trans.write_to_socket(client_socket);
618 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
619 LOGD ("client id:%d", client);
621 Socket client_socket(client);
622 m_send_trans.clear();
623 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
624 m_send_trans.put_data(context);
625 m_send_trans.put_data(uuid);
626 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
627 m_send_trans.put_data(type);
628 m_send_trans.write_to_socket(client_socket);
631 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
632 LOGD ("client id:%d", client);
634 Socket client_socket(client);
637 trans.put_command(SCIM_TRANS_CMD_REPLY);
638 trans.put_data(context);
639 trans.put_data(uuid);
640 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
644 if (trans.write_to_socket(client_socket)
645 && trans.read_from_socket(client_socket)
646 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
647 && trans.get_data(type)) {
648 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
651 LOGW ("read failed");
655 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
656 LOGD ("client id:%d", client);
658 Socket client_socket(client);
659 m_send_trans.clear();
660 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
661 m_send_trans.put_data(context);
662 m_send_trans.put_data(uuid);
663 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
664 m_send_trans.put_data(disabled);
665 m_send_trans.write_to_socket(client_socket);
668 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
669 Socket client_socket(client);
670 LOGD ("client id:%d", client);
675 trans.put_command(SCIM_TRANS_CMD_REPLY);
676 trans.put_data(context);
677 trans.put_data(uuid);
678 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
682 if (trans.write_to_socket(client_socket)
683 && trans.read_from_socket(client_socket)
684 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
685 && trans.get_data(disabled)) {
686 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
689 LOGW ("read failed");
693 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
694 LOGD ("client id:%d", client);
696 Socket client_socket(client);
697 m_send_trans.clear();
698 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
699 m_send_trans.put_data(context);
700 m_send_trans.put_data(uuid);
701 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
702 m_send_trans.put_data(layout);
703 m_send_trans.write_to_socket(client_socket);
706 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
707 LOGD ("client id:%d", client);
709 Socket client_socket(client);
710 m_send_trans.clear();
711 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
712 m_send_trans.put_data(context);
713 m_send_trans.put_data(uuid);
714 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
715 m_send_trans.put_data(mode);
716 m_send_trans.write_to_socket(client_socket);
719 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
720 LOGD ("client id:%d", client);
722 Socket client_socket(client);
723 m_send_trans.clear();
724 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
725 m_send_trans.put_data(context);
726 m_send_trans.put_data(uuid);
727 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
728 m_send_trans.put_data(hint);
729 m_send_trans.write_to_socket(client_socket);
732 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
733 LOGD ("client id:%d", client);
735 Socket client_socket(client);
736 m_send_trans.clear();
737 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
738 m_send_trans.put_data(context);
739 m_send_trans.put_data(uuid);
740 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
741 m_send_trans.put_data(direction);
742 m_send_trans.write_to_socket(client_socket);
745 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
746 LOGD ("client id:%d", client);
748 Socket client_socket(client);
749 m_send_trans.clear();
750 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
751 m_send_trans.put_data(context);
752 m_send_trans.put_data(uuid);
753 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
754 m_send_trans.put_data(mode);
755 m_send_trans.write_to_socket(client_socket);
758 void show_helper_option_window(int client, uint32 context, const String& uuid) {
759 LOGD ("client id:%d", client);
761 Socket client_socket(client);
763 aul_wakeup_ime_application(client_socket.get_id());
765 m_send_trans.clear();
766 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
767 m_send_trans.put_data(context);
768 m_send_trans.put_data(uuid);
769 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
770 m_send_trans.write_to_socket(client_socket);
773 void resume_helper_option_window(int client, uint32 context, const String& uuid) {
774 LOGD ("client id:%d", client);
776 Socket client_socket(client);
778 aul_wakeup_ime_application(client_socket.get_id());
780 m_send_trans.clear();
781 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
782 m_send_trans.put_data(context);
783 m_send_trans.put_data(uuid);
784 m_send_trans.put_command(ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW);
785 m_send_trans.write_to_socket(client_socket);
788 void set_helper_keyboard_mode(int client, uint32 context, const String& uuid, uint32& mode) {
789 LOGD ("client id:%d", client);
791 Socket client_socket(client);
792 m_send_trans.clear();
793 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
794 m_send_trans.put_data(context);
795 m_send_trans.put_data(uuid);
796 m_send_trans.put_command(ISM_TRANS_CMD_SET_KEYBOARD_MODE);
797 m_send_trans.put_data(mode);
798 m_send_trans.write_to_socket(client_socket);
801 void set_helper_prediction_hint(int client, uint32 context, const String& uuid, String& prediction_hint) {
802 LOGD ("client id:%d", client);
804 Socket client_socket(client);
805 m_send_trans.clear();
806 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
807 m_send_trans.put_data(context);
808 m_send_trans.put_data(uuid);
809 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_HINT);
810 m_send_trans.put_data(prediction_hint);
811 m_send_trans.write_to_socket(client_socket);
814 void set_helper_mime_type(int client, uint32 context, const String& uuid, String& mime_type) {
815 LOGD ("client id:%d", client);
817 Socket client_socket(client);
818 m_send_trans.clear();
819 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
820 m_send_trans.put_data(context);
821 m_send_trans.put_data(uuid);
822 m_send_trans.put_command(ISM_TRANS_CMD_SET_MIME_TYPE);
823 m_send_trans.put_data(mime_type);
824 m_send_trans.write_to_socket(client_socket);
827 void set_helper_prediction_hint_data(int client, uint32 context, const String& uuid, String& key, String &value) {
828 Socket client_socket(client);
829 m_send_trans.clear();
830 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
831 m_send_trans.put_data(context);
832 m_send_trans.put_data(uuid);
833 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_HINT_DATA);
834 m_send_trans.put_data(key);
835 m_send_trans.put_data(value);
836 m_send_trans.write_to_socket(client_socket);
839 void set_helper_optimization_hint(int client, uint32 context, const String& uuid, uint32& hint) {
840 Socket client_socket(client);
841 m_send_trans.clear();
842 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
843 m_send_trans.put_data(context);
844 m_send_trans.put_data(uuid);
845 m_send_trans.put_command(ISM_TRANS_CMD_SET_OPTIMIZATION_HINT);
846 m_send_trans.put_data(hint);
847 m_send_trans.write_to_socket(client_socket);
850 void finalize_content_helper(int client, uint32 context, const String& uuid, String& text, uint32& cursor_pos) {
851 LOGD("client id:%d", client);
853 Socket client_socket(client);
854 m_send_trans.clear();
855 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
856 m_send_trans.put_data(context);
857 m_send_trans.put_data(uuid);
858 m_send_trans.put_command(ISM_TRANS_CMD_FINALIZE_CONTENT);
859 m_send_trans.put_data(text);
860 m_send_trans.put_data(cursor_pos);
861 m_send_trans.write_to_socket(client_socket);
864 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial, uint32 keycode) {
865 LOGD ("client id:%d", client);
867 Socket client_socket(client);
872 trans.put_command(SCIM_TRANS_CMD_REPLY);
873 trans.put_data(context);
874 trans.put_data(uuid);
875 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
877 trans.put_data(serial);
878 trans.put_data(keycode);
880 if (trans.write_to_socket(client_socket)) {
881 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
884 LOGW ("read failed");
890 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
891 LOGD ("client id:%d", client);
893 Socket client_socket(client);
897 trans.put_command(SCIM_TRANS_CMD_REPLY);
898 trans.put_data(context);
899 trans.put_data(uuid);
900 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
902 if (trans.write_to_socket(client_socket)) {
907 if (trans.read_from_socket(client_socket)
908 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
909 && trans.get_data(info.pos_x)
910 && trans.get_data(info.pos_y)
911 && trans.get_data(info.width)
912 && trans.get_data(info.height)) {
913 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
916 LOGW ("read failed");
918 LOGW ("write failed");
923 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
924 LOGD ("client id:%d", client);
925 Socket client_socket(client);
929 trans.put_command(SCIM_TRANS_CMD_REPLY);
930 trans.put_data(context);
931 trans.put_data(uuid);
932 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
936 if (trans.write_to_socket(client_socket)
937 && trans.read_from_socket(client_socket)
938 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
939 && trans.get_data(imdata, len)) {
940 LOGD ("length of imdata is %zu", len);
942 LOGW ("read imdata failed");
946 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
947 LOGD ("client id:%d", client);
949 Socket client_socket(client);
953 trans.put_command(SCIM_TRANS_CMD_REPLY);
954 trans.put_data(context);
955 trans.put_data(uuid);
956 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
960 if (trans.write_to_socket(client_socket)
961 && trans.read_from_socket(client_socket)
962 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
963 && trans.get_data(layout)) {
964 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
969 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
970 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
971 LOGD ("client id:%d", client);
976 trans.put_command(SCIM_TRANS_CMD_REPLY);
977 trans.put_data(context);
978 trans.put_data(uuid);
979 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
982 Socket client_socket(client);
984 if (trans.write_to_socket(client_socket)
985 && trans.read_from_socket(client_socket)
986 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
987 && trans.get_data(data, len)) {
993 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
994 LOGD ("client id:%d", client);
997 Socket client_socket(client);
1002 trans.put_command(SCIM_TRANS_CMD_REPLY);
1003 trans.put_data(context);
1004 trans.put_data(uuid);
1005 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
1006 trans.write_to_socket(client_socket);
1008 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
1009 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
1010 !trans.get_data(avail)) {
1011 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed");
1015 void reset_ise_option(int client, uint32 context) {
1016 LOGD ("client id:%d", client);
1018 Socket client_socket(client);
1019 m_send_trans.clear();
1020 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1021 m_send_trans.put_data((uint32) context);
1022 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
1023 m_send_trans.write_to_socket(client_socket);
1026 void reset_helper_context(int client, uint32 context, const String& uuid) {
1027 LOGD ("client id:%d", client);
1029 Socket client_socket(client);
1030 m_send_trans.clear();
1031 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1032 m_send_trans.put_data(context);
1033 m_send_trans.put_data(uuid);
1034 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
1035 m_send_trans.write_to_socket(client_socket);
1038 void reload_config(int client) {
1039 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
1040 LOGD ("client id:%d", client);
1042 m_send_trans.clear();
1043 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1044 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
1046 Socket client_socket(client);
1047 m_send_trans.write_to_socket(client_socket);
1050 void exit(int client, uint32 context) {
1051 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
1052 LOGD ("client id:%d", client);
1054 m_send_trans.clear();
1055 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1057 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
1058 m_send_trans.put_data(context);
1059 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
1062 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
1064 Socket client_socket(client);
1065 m_send_trans.write_to_socket(client_socket);
1067 m_info_manager->del_client(client_socket.get_id());
1070 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
1071 LOGD("client id:%d", client);
1073 Socket client_socket(client);
1078 trans.put_command(SCIM_TRANS_CMD_REPLY);
1079 trans.put_data(context);
1080 trans.put_data(uuid);
1081 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
1082 trans.put_data(type);
1083 trans.put_data(data, len);
1085 if (trans.write_to_socket(client_socket)) {
1086 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
1090 LOGW("read failed");
1096 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
1097 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1098 LOGD ("client id:%d", client);
1100 Socket client_socket(client);
1102 m_send_trans.clear();
1103 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1104 m_send_trans.put_data(context);
1105 m_send_trans.put_data(uuid);
1106 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1107 m_send_trans.put_data(text);
1108 m_send_trans.put_data(cursor);
1109 m_send_trans.write_to_socket(client_socket);
1111 m_send_trans.clear();
1112 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1113 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1114 m_send_trans.write_to_socket(client_socket);
1117 void socket_remoteinput_focus_in (int client) {
1118 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1119 LOGD ("client id:%d", client);
1122 ret = (client == -1) ? false : true;
1125 Socket client_socket(client);
1127 m_send_trans.clear();
1128 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1129 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_IN);
1130 m_send_trans.write_to_socket(client_socket);
1134 void socket_remoteinput_focus_out (int client) {
1135 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1136 LOGD ("client id:%d", client);
1139 ret = (client == -1) ? false : true;
1142 Socket client_socket(client);
1144 m_send_trans.clear();
1145 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1146 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_OUT);
1147 m_send_trans.write_to_socket(client_socket);
1151 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type, int return_key_disabled, uint32 return_key_type) {
1152 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1153 LOGD ("client id:%d", client);
1156 ret = (client == -1) ? false : true;
1159 Socket client_socket(client);
1161 m_send_trans.clear();
1162 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1163 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_ENTRY_METADATA);
1164 m_send_trans.put_data(hint);
1165 m_send_trans.put_data(layout);
1166 m_send_trans.put_data(variation);
1167 m_send_trans.put_data(autocapital_type);
1168 m_send_trans.put_data(return_key_disabled);
1169 m_send_trans.put_data(return_key_type);
1170 m_send_trans.write_to_socket(client_socket);
1174 void socket_remoteinput_surrounding_text (int client, String& text, uint32 cursor) {
1175 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1176 LOGD ("client id:%d", client);
1179 ret = (client == -1) ? false : true;
1182 Socket client_socket(client);
1184 m_send_trans.clear();
1185 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1186 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT);
1187 m_send_trans.put_data(text);
1188 m_send_trans.put_data(cursor);
1189 m_send_trans.write_to_socket(client_socket);
1193 void socket_remoteinput_input_resource (int client, uint32 input_resource) {
1194 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1195 LOGD ("client id:%d", client);
1198 ret = (client == -1) ? false : true;
1201 Socket client_socket(client);
1203 m_send_trans.clear();
1204 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1205 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE);
1206 m_send_trans.put_data(input_resource);
1207 m_send_trans.write_to_socket(client_socket);
1211 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1212 LOGD ("client id:%d", client);
1214 Socket client_socket(client);
1216 m_send_trans.clear();
1217 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1218 m_send_trans.put_data(context);
1219 m_send_trans.put_data(uuid);
1220 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
1221 m_send_trans.put_data(text);
1222 m_send_trans.write_to_socket(client_socket);
1224 m_send_trans.clear();
1225 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1226 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1227 m_send_trans.write_to_socket(client_socket);
1230 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1231 LOGD ("client id:%d", client);
1233 Socket socket_client(client);
1234 m_send_trans.clear();
1235 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1236 m_send_trans.put_data(context);
1237 m_send_trans.put_data(uuid);
1238 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1239 m_send_trans.put_data(list.size());
1241 for (unsigned int i = 0; i < list.size(); i++)
1242 m_send_trans.put_data(list[i]);
1244 m_send_trans.write_to_socket(socket_client);
1247 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1248 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1250 LOGD ("client id:%d", client);
1252 Socket socket_client(client);
1253 m_send_trans.clear();
1254 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1255 m_send_trans.put_data(context);
1256 m_send_trans.put_data(uuid);
1257 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1258 m_send_trans.put_data(style);
1259 m_send_trans.put_data(mode);
1260 m_send_trans.write_to_socket(socket_client);
1263 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1264 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1266 LOGD ("client id:%d", client);
1268 Socket socket_client(client);
1269 m_send_trans.clear();
1270 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1271 m_send_trans.put_data(context);
1272 m_send_trans.put_data(uuid);
1273 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1274 m_send_trans.put_data(info.pos_x);
1275 m_send_trans.put_data(info.pos_y);
1276 m_send_trans.put_data(info.width);
1277 m_send_trans.put_data(info.height);
1278 m_send_trans.write_to_socket(socket_client);
1281 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1282 LOGD ("client id:%d", client);
1284 Socket socket_client(client);
1285 m_send_trans.clear();
1286 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1287 m_send_trans.put_data(context);
1288 m_send_trans.put_data(uuid);
1289 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1290 m_send_trans.put_data(ise_name);
1291 m_send_trans.put_data(ise_uuid);
1292 m_send_trans.write_to_socket(socket_client);
1295 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1296 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_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_ATTACH_INPUT_CONTEXT);
1306 m_send_trans.write_to_socket(client_socket);
1309 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1310 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1312 LOGD ("client id:%d", client);
1314 Socket client_socket(client);
1315 m_send_trans.clear();
1316 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1317 m_send_trans.put_data(context);
1318 m_send_trans.put_data(ic_uuid);
1319 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1320 m_send_trans.write_to_socket(client_socket);
1323 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1324 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1325 LOGD ("client id:%d", client);
1327 Socket client_socket(client);
1331 m_send_trans.clear();
1332 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1334 /* FIXME: We presume that client and context are both less than 65536.
1335 * Hopefully, it should be true in any UNIXs.
1336 * So it's ok to combine client and context into one uint32. */
1337 m_send_trans.put_data(context);
1338 m_send_trans.put_data(ic_uuid);
1339 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1340 m_send_trans.put_data(_nest_trans);
1341 m_send_trans.write_to_socket(client_socket);
1346 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1347 LOGD ("client id:%d", client);
1349 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1350 Socket socket_client(client);
1352 m_send_trans.clear();
1353 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1354 m_send_trans.put_data(context);
1355 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1356 m_send_trans.put_data(target_uuid);
1357 m_send_trans.put_data(active_uuid);
1358 m_send_trans.put_data(nest_trans);
1359 m_send_trans.write_to_socket(socket_client);
1363 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
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(context);
1371 m_send_trans.put_command(cmd);
1372 m_send_trans.put_data(key);
1373 m_send_trans.write_to_socket(socket_client);
1377 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1378 LOGD ("client id:%d", client);
1380 Socket socket_client(client);
1382 m_send_trans.clear();
1383 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1384 m_send_trans.put_data(target_context);
1385 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1386 m_send_trans.put_data(wstr);
1387 m_send_trans.write_to_socket(socket_client);
1391 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1392 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1393 LOGD ("client id:%d", client);
1395 Socket socket_client(client);
1397 m_send_trans.clear();
1398 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1399 m_send_trans.put_data(context_id);
1400 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1401 m_send_trans.put_data(maxlen_before);
1402 m_send_trans.put_data(maxlen_after);
1403 m_send_trans.write_to_socket(socket_client);
1407 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1408 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1409 LOGD ("client id:%d", client);
1411 Socket socket_client(client);
1413 m_send_trans.clear();
1414 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1415 m_send_trans.put_data(context_id);
1416 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1417 m_send_trans.put_data(offset);
1418 m_send_trans.put_data(len);
1419 m_send_trans.write_to_socket(socket_client);
1423 void socket_helper_get_selection(int client, uint32 context_id) {
1424 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1425 LOGD ("client id:%d", client);
1428 Socket socket_client(client);
1430 m_send_trans.clear();
1431 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1432 m_send_trans.put_data(context_id);
1433 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1434 m_send_trans.write_to_socket(socket_client);
1438 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1439 LOGD ("client id:%d", client);
1441 Socket socket_client(client);
1443 m_send_trans.clear();
1444 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1445 m_send_trans.put_data(context_id);
1446 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1447 m_send_trans.put_data(start);
1448 m_send_trans.put_data(end);
1449 m_send_trans.write_to_socket(socket_client);
1453 void show_preedit_string(int client, uint32 target_context) {
1454 LOGD ("client id:%d", client);
1456 Socket socket_client(client);
1458 m_send_trans.clear();
1459 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1460 m_send_trans.put_data(target_context);
1461 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1462 m_send_trans.write_to_socket(socket_client);
1466 void hide_preedit_string(int client, uint32 target_context) {
1467 LOGD ("client id:%d", client);
1469 Socket socket_client(client);
1471 m_send_trans.clear();
1472 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1473 m_send_trans.put_data(target_context);
1474 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1475 m_send_trans.write_to_socket(socket_client);
1479 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1480 LOGD ("client id:%d", client);
1482 Socket socket_client(client);
1484 m_send_trans.clear();
1485 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1486 m_send_trans.put_data(target_context);
1487 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1488 m_send_trans.put_data(preedit);
1489 m_send_trans.put_data(commit);
1490 m_send_trans.put_data(attrs);
1491 m_send_trans.put_data(caret);
1492 m_send_trans.write_to_socket(socket_client);
1496 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1497 LOGD ("client id:%d", client);
1499 Socket socket_client(client);
1501 m_send_trans.clear();
1502 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1503 m_send_trans.put_data(focused_context);
1504 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1505 m_send_trans.put_data(caret);
1506 m_send_trans.write_to_socket(socket_client);
1510 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1511 LOGD ("client id:%d", client);
1513 Socket socket_client(client);
1514 m_send_trans.clear();
1515 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1516 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1517 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1519 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1520 m_send_trans.put_data(helper_ic_index[i].first);
1521 m_send_trans.put_data(helper_ic_index[i].second);
1524 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1525 m_send_trans.put_data((uint32)current_screen);
1526 m_send_trans.write_to_socket(socket_client);
1529 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1530 LOGD ("client id:%d", client);
1532 Socket client_socket(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(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1537 m_send_trans.put_data(type);
1538 m_send_trans.put_data(value);
1539 m_send_trans.write_to_socket(client_socket);
1542 void send_private_command(int client, uint32 focused_context, String command) {
1543 LOGD ("client id:%d", client);
1545 Socket socket_client(client);
1547 m_send_trans.clear();
1548 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1549 m_send_trans.put_data(focused_context);
1550 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1551 m_send_trans.put_data(command);
1552 m_send_trans.write_to_socket(socket_client);
1555 void commit_content(int client, uint32 focused_context, String content, String description, String mime_types) {
1556 LOGD ("client id:%d", client);
1558 Socket socket_client(client);
1560 m_send_trans.clear();
1561 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1562 m_send_trans.put_data(focused_context);
1563 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_CONTENT);
1564 m_send_trans.put_data(content);
1565 m_send_trans.put_data(description);
1566 m_send_trans.put_data(mime_types);
1567 m_send_trans.write_to_socket(socket_client);
1570 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1571 LOGD ("client id:%d", client);
1573 m_send_trans.clear();
1574 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1576 /* FIXME: We presume that client and context are both less than 65536.
1577 * Hopefully, it should be true in any UNIXs.
1578 * So it's ok to combine client and context into one uint32. */
1579 m_send_trans.put_data(context_id);
1580 m_send_trans.put_data(uuid);
1581 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1582 m_send_trans.put_data((uint32) x);
1583 m_send_trans.put_data((uint32) y);
1585 Socket client_socket(client);
1586 m_send_trans.write_to_socket(client_socket);
1589 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1590 LOGD ("client id:%d", client);
1592 m_send_trans.clear();
1593 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1594 m_send_trans.put_data(context_id);
1595 m_send_trans.put_data(uuid);
1596 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1597 m_send_trans.put_data((uint32) cursor_pos);
1599 Socket client_socket(client);
1600 m_send_trans.write_to_socket(client_socket);
1603 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1604 LOGD ("client id:%d", client);
1606 m_send_trans.clear();
1607 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1609 /* FIXME: We presume that client and context are both less than 65536.
1610 * Hopefully, it should be true in any UNIXs.
1611 * So it's ok to combine client and context into one uint32. */
1612 m_send_trans.put_data(context_id);
1613 m_send_trans.put_data(uuid);
1614 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1615 m_send_trans.put_data((uint32) screen);
1617 Socket client_socket(client);
1618 m_send_trans.write_to_socket(client_socket);
1621 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1622 m_send_trans.clear();
1623 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1625 m_send_trans.put_data(context);
1626 m_send_trans.put_data(uuid);
1627 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1628 m_send_trans.put_data((uint32) mode);
1630 Socket client_socket(client);
1631 m_send_trans.write_to_socket(client_socket);
1634 void remote_update_preedit_string (int client, uint32 target_context, const WideString str, const WideString commit, const AttributeList &attrs, uint32 caret) {
1635 Socket client_socket(client);
1637 m_send_trans.clear();
1638 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1639 m_send_trans.put_data(target_context);
1640 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1641 m_send_trans.put_data(str);
1642 m_send_trans.put_data(commit);
1643 m_send_trans.put_data(attrs);
1644 m_send_trans.put_data(caret);
1645 m_send_trans.write_to_socket(client_socket);
1649 void remote_send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1650 Socket client_socket(client);
1652 m_send_trans.clear ();
1653 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1654 m_send_trans.put_data (target_context);
1655 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1656 m_send_trans.put_data (key);
1657 m_send_trans.write_to_socket (client_socket);
1661 void remote_forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1662 Socket client_socket(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_FORWARD_KEY_EVENT);
1668 m_send_trans.put_data (key);
1669 m_send_trans.write_to_socket (client_socket);
1673 void remote_commit_string (int client, uint32 target_context, const WideString& wstr) {
1674 LOGD ("client id:%d", client);
1676 Socket socket_client(client);
1678 m_send_trans.clear();
1679 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1680 m_send_trans.put_data(target_context);
1681 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1682 m_send_trans.put_data(wstr);
1683 m_send_trans.write_to_socket(socket_client);
1687 void remote_delete_surrounding_text (int client, uint32 context_id, uint32 offset, uint32 len) {
1688 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1689 LOGD ("client id:%d", client);
1691 Socket socket_client(client);
1693 m_send_trans.clear();
1694 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1695 m_send_trans.put_data(context_id);
1696 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1697 m_send_trans.put_data(offset);
1698 m_send_trans.put_data(len);
1699 m_send_trans.write_to_socket(socket_client);
1703 void set_prediction_allow (int client, uint32 context, String uuid, int mode) {
1704 LOGD ("client id:%d", client);
1706 m_send_trans.clear();
1707 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1709 m_send_trans.put_data(context);
1710 m_send_trans.put_data(uuid);
1711 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_ALLOW);
1712 m_send_trans.put_data((uint32) mode);
1714 Socket client_socket(client);
1715 m_send_trans.write_to_socket(client_socket);
1718 void send_fail_reply (int client)
1720 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1721 LOGD ("client id:%d", client);
1723 Socket client_socket (client);
1726 trans.put_command (SCIM_TRANS_CMD_REPLY);
1727 trans.put_command (SCIM_TRANS_CMD_FAIL);
1728 trans.write_to_socket (client_socket);
1733 bool filter_event(int fd) {
1734 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1736 return m_socket_server.filter_event(fd);
1739 bool filter_exception_event(int fd) {
1740 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1742 return m_socket_server.filter_exception_event(fd);
1745 int get_server_id() {
1746 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1748 return m_socket_server.get_id();
1751 bool socket_check_client_connection(const Socket& client) {
1752 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1754 unsigned char buf [sizeof(uint32)];
1756 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1758 if (nbytes == sizeof(uint32))
1762 LOGW ("Error occurred when reading socket: %s", client.get_error_message().c_str());
1764 LOGW ("Timeout when reading socket");
1771 * @brief Callback function for ecore fd handler.
1773 * @param data The data to pass to this callback.
1774 * @param fd_handler The ecore fd handler.
1776 * @return ECORE_CALLBACK_RENEW
1778 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1779 if (fd_handler == NULL || data == NULL)
1780 return ECORE_CALLBACK_RENEW;
1782 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1784 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1786 return ECORE_CALLBACK_RENEW;
1788 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1789 if (fd_handler == _agent->_read_handler_list [i]) {
1790 if (!_agent->filter_event(fd)) {
1791 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1793 ecore_main_fd_handler_del(fd_handler);
1795 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!", fd);
1798 return ECORE_CALLBACK_RENEW;
1802 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1803 _agent->filter_exception_event(fd);
1805 ecore_main_fd_handler_del(fd_handler);
1807 ISF_SAVE_LOG("Received exception event (fd=%d)!!!", fd);
1808 return ECORE_CALLBACK_RENEW;
1811 void socket_accept_callback(SocketServer* server,
1812 const Socket& client) {
1813 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1817 if (m_should_exit) {
1818 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1821 //m_signal_accept_connection (client.get_id ());
1822 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1823 _read_handler_list.push_back(panel_agent_read_handler);
1829 void socket_receive_callback(SocketServer* server,
1830 const Socket& client) {
1831 int client_id = client.get_id();
1837 ClientInfo client_info;
1839 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1841 /* If the connection is closed then close this client. */
1842 if (!socket_check_client_connection(client)) {
1843 LOGW ("check client connection failed");
1844 socket_close_connection(server, client);
1848 client_info = m_info_manager->socket_get_client_info(client_id);
1850 /* If it's a new client, then request to open the connection first. */
1851 if (client_info.type == UNKNOWN_CLIENT) {
1852 socket_open_connection(server, client);
1856 /* If can not read the transaction,
1857 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1858 * or the key is mismatch,
1860 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1861 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1862 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1863 LOGW ("cmd:%d key:%d client info key: %d", cmd, key, client_info.key);
1867 if (client_info.type == FRONTEND_ACT_CLIENT) {
1868 if (m_recv_trans.get_data(context)) {
1869 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1870 socket_transaction_start();
1872 while (m_recv_trans.get_command(cmd)) {
1873 LOGD ("PanelAgent::cmd = %d", cmd);
1875 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1878 if (m_recv_trans.get_data(id)) {
1879 m_info_manager->register_panel_client(client_id, id);
1881 LOGW ("wrong format of transaction");
1886 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1887 if (m_recv_trans.get_data(uuid)) {
1888 m_info_manager->register_input_context(client_id, context, uuid);
1890 LOGW ("wrong format of transaction");
1895 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1896 m_info_manager->remove_input_context(client_id, context);
1899 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1900 m_info_manager->socket_reset_input_context(client_id, context);
1903 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1904 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1906 if (m_recv_trans.get_data(uuid)) {
1907 m_info_manager->focus_in(client_id, context, uuid);
1909 LOGW ("wrong format of transaction");
1914 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1917 if (m_recv_trans.get_data(isOn)) {
1918 m_info_manager->socket_turn_on_log(isOn);
1920 LOGW ("wrong format of transaction");
1925 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1926 m_info_manager->show_isf_panel(client_id);
1928 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1929 m_info_manager->hide_isf_panel(client_id);
1931 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1932 uint32 target_client;
1933 uint32 target_context;
1938 if (m_recv_trans.get_data(target_client) && m_recv_trans.get_data(target_context) && m_recv_trans.get_data(&data, len)) {
1941 LOGW ("wrong format of transaction");
1945 Socket client_socket(client_id);
1948 trans.put_command(SCIM_TRANS_CMD_REPLY);
1949 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1950 trans.put_data(ret);
1951 trans.write_to_socket(client_socket);
1954 m_info_manager->show_ise_panel(client_id, target_client, target_context, data, len);
1960 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1961 uint32 target_client;
1962 uint32 target_context;
1964 if (m_recv_trans.get_data(target_client) && m_recv_trans.get_data(target_context)) {
1965 m_info_manager->hide_ise_panel(client_id, target_client, target_context);
1967 LOGW ("wrong format of transaction");
1971 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1972 struct rectinfo info;
1973 m_info_manager->get_input_panel_geometry(client_id, info);
1975 Socket client_socket(client_id);
1978 trans.put_command(SCIM_TRANS_CMD_REPLY);
1979 trans.put_command(SCIM_TRANS_CMD_OK);
1980 trans.put_data(info.pos_x);
1981 trans.put_data(info.pos_y);
1982 trans.put_data(info.width);
1983 trans.put_data(info.height);
1984 trans.write_to_socket(client_socket);
1986 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1987 struct rectinfo info;
1988 m_info_manager->get_candidate_window_geometry(client_id, info);
1990 Socket client_socket(client_id);
1993 trans.put_command(SCIM_TRANS_CMD_REPLY);
1994 trans.put_command(SCIM_TRANS_CMD_OK);
1995 trans.put_data(info.pos_x);
1996 trans.put_data(info.pos_y);
1997 trans.put_data(info.width);
1998 trans.put_data(info.height);
1999 trans.write_to_socket(client_socket);
2001 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
2004 m_info_manager->get_ise_language_locale(client_id, &data, len);
2007 trans.put_command(SCIM_TRANS_CMD_REPLY);
2009 if (data != NULL && len > 0) {
2010 trans.put_command(SCIM_TRANS_CMD_OK);
2011 trans.put_data(data, len);
2013 trans.put_command(SCIM_TRANS_CMD_FAIL);
2016 Socket client_socket(client_id);
2017 trans.write_to_socket(client_socket);
2023 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
2026 if (m_recv_trans.get_data(language)) {
2027 m_info_manager->set_ise_language(client_id, language);
2029 LOGW ("wrong format of transaction");
2033 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
2034 char* imdata = NULL;
2037 if (m_recv_trans.get_data(&imdata, len)) {
2038 m_info_manager->set_ise_imdata(client_id, imdata, len);
2040 LOGW ("wrong format of transaction");
2047 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
2048 char* imdata = NULL;
2050 m_info_manager->get_ise_imdata(client_id, &imdata, len);
2052 Socket client_socket(client_id);
2055 trans.put_command(SCIM_TRANS_CMD_REPLY);
2058 trans.put_command(SCIM_TRANS_CMD_OK);
2059 trans.put_data(imdata, len);
2061 trans.put_command(SCIM_TRANS_CMD_FAIL);
2064 trans.write_to_socket(client_socket);
2070 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
2073 if (m_recv_trans.get_data(type)) {
2074 m_info_manager->set_ise_return_key_type(client_id, type);
2076 LOGW ("wrong format of transaction");
2080 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
2082 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
2084 Socket client_socket(client_id);
2087 trans.put_command(SCIM_TRANS_CMD_REPLY);
2090 trans.put_command(SCIM_TRANS_CMD_OK);
2091 trans.put_data(type);
2093 trans.put_command(SCIM_TRANS_CMD_FAIL);
2096 trans.write_to_socket(client_socket);
2098 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
2101 if (m_recv_trans.get_data(disabled)) {
2102 m_info_manager->set_ise_return_key_disable(client_id, disabled);
2104 LOGW ("wrong format of transaction");
2108 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
2111 ret = m_info_manager->get_ise_return_key_disable(client_id, disabled);
2113 Socket client_socket(client_id);
2116 trans.put_command(SCIM_TRANS_CMD_REPLY);
2119 trans.put_command(SCIM_TRANS_CMD_OK);
2120 trans.put_data(disabled);
2122 trans.put_command(SCIM_TRANS_CMD_FAIL);
2125 trans.write_to_socket(client_socket);
2127 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
2129 bool ret = m_info_manager->get_ise_layout(client_id, layout);
2131 Socket client_socket(client_id);
2134 trans.put_command(SCIM_TRANS_CMD_REPLY);
2137 trans.put_command(SCIM_TRANS_CMD_OK);
2138 trans.put_data(layout);
2140 trans.put_command(SCIM_TRANS_CMD_FAIL);
2143 trans.write_to_socket(client_socket);
2145 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
2148 if (m_recv_trans.get_data(layout)) {
2149 m_info_manager->set_ise_layout(client_id, layout);
2151 LOGW ("wrong format of transaction");
2155 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
2158 if (m_recv_trans.get_data(mode)) {
2159 m_info_manager->set_ise_caps_mode(client_id, mode);
2161 LOGW ("wrong format of transaction");
2165 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
2166 m_info_manager->will_show_ack(client_id);
2168 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
2169 m_info_manager->will_hide_ack(client_id);
2171 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
2174 if (m_recv_trans.get_data(mode)) {
2175 m_info_manager->set_keyboard_mode(client_id, mode);
2177 LOGW ("wrong format of transaction");
2181 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2182 m_info_manager->candidate_will_hide_ack(client_id);
2184 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2190 if (m_recv_trans.get_data(key)) {
2192 m_info_manager->process_key_event(key, result, 0);
2194 LOGW ("wrong format of transaction");
2198 Socket client_socket(client_id);
2201 trans.put_command(SCIM_TRANS_CMD_REPLY);
2204 trans.put_command(SCIM_TRANS_CMD_OK);
2205 trans.put_data(result);
2207 trans.put_command(SCIM_TRANS_CMD_FAIL);
2210 trans.write_to_socket(client_socket);
2212 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2214 m_info_manager->get_active_helper_option(client_id, option);
2216 Socket client_socket(client_id);
2219 trans.put_command(SCIM_TRANS_CMD_REPLY);
2220 trans.put_command(SCIM_TRANS_CMD_OK);
2221 trans.put_data(option);
2222 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2223 trans.write_to_socket(client_socket);
2225 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2227 m_info_manager->get_ise_state(client_id, state);
2229 Socket client_socket(client_id);
2232 trans.put_command(SCIM_TRANS_CMD_REPLY);
2233 trans.put_command(SCIM_TRANS_CMD_OK);
2234 trans.put_data(state);
2235 trans.write_to_socket(client_socket);
2237 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2240 if (m_recv_trans.get_data(input_mode)) {
2241 m_info_manager->set_ise_input_mode(client_id, input_mode);
2243 LOGW ("wrong format of transaction");
2247 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2250 if (m_recv_trans.get_data(input_hint)) {
2251 m_info_manager->set_ise_input_hint(client_id, input_hint);
2253 LOGW ("wrong format of transaction");
2257 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2258 uint32 bidi_direction;
2260 if (m_recv_trans.get_data(bidi_direction)) {
2261 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2263 LOGW ("wrong format of transaction");
2267 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2268 m_info_manager->show_ise_option_window(client_id);
2270 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
2271 m_info_manager->resume_ise_option_window(client_id);
2278 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2281 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2282 m_info_manager->socket_start_helper(client_id, context, uuid);
2284 LOGW ("wrong format of transaction");
2288 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2291 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2292 uuid.length() && m_nest_trans.valid()) {
2293 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2295 LOGW ("wrong format of transaction");
2299 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2302 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2303 m_info_manager->socket_stop_helper(client_id, context, uuid);
2305 LOGW ("wrong format of transaction");
2314 /* Client must focus in before do any other things. */
2315 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2316 m_info_manager->socket_turn_on();
2317 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2318 m_info_manager->socket_turn_off();
2319 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2322 if (m_recv_trans.get_data(num))
2323 m_info_manager->socket_update_screen(client_id, num);
2325 LOGW ("wrong format of transaction");
2326 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2329 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2330 m_info_manager->socket_update_spot_location(x, y, top_y);
2332 LOGW ("wrong format of transaction");
2334 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2337 if (m_recv_trans.get_data(cursor_pos)) {
2338 m_info_manager->socket_update_cursor_position(cursor_pos);
2340 LOGW ("wrong format of transaction");
2342 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2346 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2347 m_info_manager->socket_update_surrounding_text(text, cursor);
2349 LOGW ("wrong format of transaction");
2351 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2354 if (m_recv_trans.get_data(text)) {
2355 m_info_manager->socket_update_selection(text);
2357 LOGW ("wrong format of transaction");
2359 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2360 m_info_manager->expand_candidate();
2361 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2362 m_info_manager->contract_candidate();
2363 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2364 uint32 portrait_line, mode;
2366 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2367 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2369 LOGW ("wrong format of transaction");
2370 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2371 PanelFactoryInfo info;
2373 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2374 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2375 m_info_manager->socket_update_factory_info(info);
2377 LOGW ("wrong format of transaction");
2379 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2380 m_info_manager->socket_show_preedit_string();
2381 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2382 m_info_manager->socket_show_aux_string();
2383 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2384 m_info_manager->socket_show_lookup_table();
2385 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2386 m_info_manager->socket_show_associate_table();
2387 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2388 m_info_manager->socket_hide_preedit_string();
2389 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2390 m_info_manager->socket_hide_aux_string();
2391 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2392 m_info_manager->socket_hide_lookup_table();
2393 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2394 m_info_manager->socket_hide_associate_table();
2395 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2397 AttributeList attrs;
2400 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2401 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2403 LOGW ("wrong format of transaction");
2404 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2407 if (m_recv_trans.get_data(caret))
2408 m_info_manager->socket_update_preedit_caret(caret);
2410 LOGW ("wrong format of transaction");
2411 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2413 AttributeList attrs;
2415 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2416 m_info_manager->socket_update_aux_string(str, attrs);
2418 LOGW ("wrong format of transaction");
2419 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2426 AttributeList attrs;
2428 if (m_recv_trans.get_data(target_ic) &&
2429 m_recv_trans.get_data(target_uuid) &&
2430 m_recv_trans.get_data(offset) &&
2431 m_recv_trans.get_data(len) &&
2432 m_recv_trans.get_data(preedit) &&
2433 m_recv_trans.get_data(commit) &&
2434 m_recv_trans.get_data(attrs)) {
2435 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2437 LOGW ("wrong format of transaction");
2439 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2440 CommonLookupTable _isf_candidate_table;
2442 if (m_recv_trans.get_data(_isf_candidate_table))
2443 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2445 LOGW ("wrong format of transaction");
2447 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2448 CommonLookupTable table;
2450 if (m_recv_trans.get_data(table))
2451 m_info_manager->socket_update_associate_table(table);
2453 LOGW ("wrong format of transaction");
2454 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2455 PropertyList properties;
2457 if (m_recv_trans.get_data(properties))
2458 m_info_manager->socket_register_properties(properties);
2460 LOGW ("wrong format of transaction");
2461 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2464 if (m_recv_trans.get_data(property))
2465 m_info_manager->socket_update_property(property);
2467 LOGW ("wrong format of transaction");
2468 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2471 if (m_recv_trans.get_data(help))
2472 m_info_manager->socket_show_help(help);
2474 LOGW ("wrong format of transaction");
2475 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2476 PanelFactoryInfo info;
2477 std::vector <PanelFactoryInfo> vec;
2479 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2480 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2481 info.lang = scim_get_normalized_language(info.lang);
2482 vec.push_back(info);
2485 m_info_manager->socket_show_factory_menu(vec);
2486 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2487 m_info_manager->focus_out(client_id, context);
2489 LOGW ("unknown cmd: %d", cmd);
2493 socket_transaction_end();
2495 } else if (client_info.type == FRONTEND_CLIENT) {
2496 if (m_recv_trans.get_data(context)) {
2497 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2498 socket_transaction_start();
2500 while (m_recv_trans.get_command(cmd)) {
2501 LOGD ("PanelAgent::cmd = %d", cmd);
2503 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2504 Socket client_socket(client_id);
2508 trans.put_command(SCIM_TRANS_CMD_REPLY);
2509 trans.put_command(SCIM_TRANS_CMD_OK);
2510 trans.put_data(client_id);
2511 trans.write_to_socket(client_socket);
2514 LOGW ("unknown cmd: %d", cmd);
2518 socket_transaction_end();
2520 } else if (client_info.type == HELPER_CLIENT) {
2521 socket_transaction_start();
2523 while (m_recv_trans.get_command(cmd)) {
2524 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2527 if (m_recv_trans.get_data(info.uuid) &&
2528 m_recv_trans.get_data(info.name) &&
2529 m_recv_trans.get_data(info.icon) &&
2530 m_recv_trans.get_data(info.description) &&
2531 m_recv_trans.get_data(info.option) &&
2532 info.uuid.length()) {
2533 m_info_manager->socket_helper_register_helper(client_id, info);
2536 LOGW ("unknown cmd: %d", cmd);
2540 socket_transaction_end();
2541 } else if (client_info.type == HELPER_ACT_CLIENT) {
2542 socket_transaction_start();
2544 while (m_recv_trans.get_command(cmd)) {
2545 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2548 if (m_recv_trans.get_data(info.uuid) &&
2549 m_recv_trans.get_data(info.name) &&
2550 m_recv_trans.get_data(info.icon) &&
2551 m_recv_trans.get_data(info.description) &&
2552 m_recv_trans.get_data(info.option) &&
2553 info.uuid.length()) {
2554 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2556 LOGW ("wrong format of transaction");
2559 /* Check whether application already requested the focus_in and showing input_panel
2560 * If so, Input FW request focus_in and show input_panel again to helper IME.
2561 * Because Helper IME couldn't receive these events during the launch.
2563 m_info_manager->reshow_input_panel ();
2564 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2569 if (m_recv_trans.get_data(target_ic) &&
2570 m_recv_trans.get_data(target_uuid) &&
2571 m_recv_trans.get_data(wstr) &&
2573 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2575 LOGW ("wrong format of transaction");
2577 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2581 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2582 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2584 LOGW ("wrong format of transaction");
2586 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2587 m_info_manager->socket_show_aux_string();
2588 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2589 m_info_manager->socket_show_lookup_table();
2590 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2591 m_info_manager->socket_show_associate_table();
2592 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2596 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2597 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2599 LOGW ("wrong format of transaction");
2601 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2602 m_info_manager->socket_hide_aux_string();
2603 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2604 m_info_manager->socket_hide_lookup_table();
2605 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2606 m_info_manager->socket_hide_associate_table();
2607 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2612 AttributeList attrs;
2615 if (m_recv_trans.get_data(target_ic) &&
2616 m_recv_trans.get_data(target_uuid) &&
2617 m_recv_trans.get_data(preedit) &&
2618 m_recv_trans.get_data(commit) &&
2619 m_recv_trans.get_data(attrs) &&
2620 m_recv_trans.get_data(caret)) {
2621 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2623 LOGW ("wrong format of transaction");
2625 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2628 if (m_recv_trans.get_data(caret)) {
2629 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2631 LOGW ("wrong format of transaction");
2633 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2635 AttributeList attrs;
2637 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2638 m_info_manager->socket_update_aux_string(str, attrs);
2640 LOGW ("wrong format of transaction");
2641 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2642 CommonLookupTable _isf_candidate_table;
2644 if (m_recv_trans.get_data(_isf_candidate_table)) {
2645 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2647 LOGW ("wrong format of transaction");
2649 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2650 CommonLookupTable _isf_candidate_table;
2652 if (m_recv_trans.get_data(_isf_candidate_table)) {
2653 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2655 LOGW ("wrong format of transaction");
2657 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2658 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2663 if (m_recv_trans.get_data(target_ic) &&
2664 m_recv_trans.get_data(target_uuid) &&
2665 m_recv_trans.get_data(key) &&
2667 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2669 LOGW ("wrong format of transaction");
2671 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2676 if (m_recv_trans.get_data(target_ic) &&
2677 m_recv_trans.get_data(target_uuid) &&
2678 m_recv_trans.get_data(key) &&
2680 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2682 LOGW ("wrong format of transaction");
2684 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2688 if (m_recv_trans.get_data(target_ic) &&
2689 m_recv_trans.get_data(target_uuid) &&
2690 m_recv_trans.get_data(m_nest_trans) &&
2691 m_nest_trans.valid()) {
2692 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2694 LOGW ("wrong format of transaction");
2696 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2697 PropertyList properties;
2699 if (m_recv_trans.get_data(properties))
2700 m_info_manager->socket_helper_register_properties(client_id, properties);
2702 LOGW ("wrong format of transaction");
2703 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2706 if (m_recv_trans.get_data(property))
2707 m_info_manager->socket_helper_update_property(client_id, property);
2709 LOGW ("wrong format of transaction");
2710 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2714 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2715 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2717 LOGW ("wrong format of transaction");
2719 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_LANGUAGE_LOCALE) {
2724 if (m_recv_trans.get_data(&data, len)) {
2726 locale = String(data, len);
2727 m_info_manager->socket_helper_update_language_locale(client_id, locale);
2729 LOGW("wrong format of transaction : %p %zu", data, len);
2732 LOGW("wrong format of transaction");
2737 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2740 if (m_recv_trans.get_data(uuid)) {
2741 m_info_manager->socket_get_keyboard_ise_list(uuid);
2743 LOGW ("wrong format of transaction");
2745 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2746 uint32 portrait_line, mode;
2748 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2749 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2751 LOGW ("wrong format of transaction");
2752 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2755 if (m_recv_trans.get_data(uuid)) {
2756 m_info_manager->socket_get_candidate_ui(uuid);
2758 LOGW ("wrong format of transaction");
2760 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2763 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2764 m_info_manager->socket_set_candidate_position(left, top);
2766 LOGW ("wrong format of transaction");
2767 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2768 m_info_manager->socket_hide_candidate();
2769 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2772 if (m_recv_trans.get_data(uuid)) {
2773 m_info_manager->socket_get_candidate_geometry(uuid);
2775 LOGW ("wrong format of transaction");
2777 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2778 m_info_manager->reset_keyboard_ise();
2779 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2782 if (m_recv_trans.get_data(uuid)) {
2783 m_info_manager->socket_set_keyboard_ise(uuid);
2785 LOGW ("wrong format of transaction");
2787 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2790 if (m_recv_trans.get_data(uuid)) {
2791 m_info_manager->socket_get_keyboard_ise(uuid);
2793 LOGW ("wrong format of transaction");
2795 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2796 uint32 x, y, width, height;
2798 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2799 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2800 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2802 LOGW ("wrong format of transaction");
2804 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2805 m_info_manager->expand_candidate();
2806 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2807 m_info_manager->contract_candidate();
2808 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2811 if (m_recv_trans.get_data(index))
2812 m_info_manager->socket_helper_select_candidate(index);
2814 LOGW ("wrong format of transaction");
2815 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2817 uint32 maxlen_before;
2818 uint32 maxlen_after;
2820 if (m_recv_trans.get_data(uuid) &&
2821 m_recv_trans.get_data(maxlen_before) &&
2822 m_recv_trans.get_data(maxlen_after)) {
2823 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2825 LOGW ("wrong format of transaction");
2827 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2831 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2832 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2834 LOGW ("wrong format of transaction");
2836 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2839 if (m_recv_trans.get_data(uuid)) {
2840 m_info_manager->socket_helper_get_selection(client_id, uuid);
2842 LOGW ("wrong format of transaction");
2844 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2848 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2849 m_info_manager->socket_helper_set_selection(client_id, start, end);
2851 LOGW ("wrong format of transaction");
2853 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2856 if (m_recv_trans.get_data(command)) {
2857 m_info_manager->socket_helper_send_private_command(client_id, command);
2859 LOGW ("wrong format of transaction");
2861 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2862 m_info_manager->UPDATE_ISE_EXIT(client_id);
2863 } else if (cmd == SCIM_TRANS_CMD_COMMIT_CONTENT) {
2868 if (m_recv_trans.get_data(content) &&
2869 m_recv_trans.get_data(description) &&
2870 m_recv_trans.get_data(mime_types)) {
2871 m_info_manager->socket_helper_commit_content(client_id, content, description, mime_types);
2873 LOGW ("wrong format of transaction");
2875 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2880 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2881 m_info_manager->process_key_event_done(key, ret, serial);
2883 LOGW ("wrong format of transaction");
2885 } else if (cmd == ISM_TRANS_CMD_REQUEST_ISE_HIDE) {
2886 m_info_manager->request_ise_hide();
2887 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2894 AttributeList attrs;
2896 if (m_recv_trans.get_data(target_ic) &&
2897 m_recv_trans.get_data(target_uuid) &&
2898 m_recv_trans.get_data(offset) &&
2899 m_recv_trans.get_data(len) &&
2900 m_recv_trans.get_data(preedit) &&
2901 m_recv_trans.get_data(commit) &&
2902 m_recv_trans.get_data(attrs)) {
2903 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2905 LOGW ("wrong format of transaction");
2908 LOGW ("unknown cmd: %d", cmd);
2912 socket_transaction_end();
2913 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2914 socket_transaction_start();
2916 while (m_recv_trans.get_command(cmd)) {
2917 LOGD ("PanelAgent::cmd = %d", cmd);
2919 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2920 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2921 String default_uuid;
2922 m_info_manager->get_active_ise(client_id, default_uuid);
2924 Socket client_socket(client_id);
2927 trans.put_command(SCIM_TRANS_CMD_REPLY);
2928 trans.put_command(SCIM_TRANS_CMD_OK);
2929 trans.put_data(default_uuid);
2930 trans.write_to_socket(client_socket);
2933 LOGW ("Access denied to get active ise");
2934 send_fail_reply (client_id);
2936 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2937 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2942 if (m_recv_trans.get_data(&buf, len)) {
2943 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2945 LOGW ("wrong format of transaction");
2949 Socket client_socket(client_id);
2952 trans.put_command(SCIM_TRANS_CMD_REPLY);
2953 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2954 trans.write_to_socket(client_socket);
2960 LOGW ("Access denied to set active ise");
2961 send_fail_reply (client_id);
2963 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2964 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2969 //ret need be checked
2970 if (m_recv_trans.get_data(&buf, len)) {
2971 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2973 LOGW ("wrong format of transaction");
2977 Socket client_socket(client_id);
2980 trans.put_command(SCIM_TRANS_CMD_REPLY);
2981 trans.put_command(SCIM_TRANS_CMD_OK);
2982 trans.write_to_socket(client_socket);
2988 LOGW ("Access denied to set initial ise");
2989 send_fail_reply (client_id);
2991 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2992 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2993 std::vector<String> strlist;
2994 m_info_manager->get_ise_list(client_id, strlist);
2996 Socket client_socket(client_id);
3002 trans.put_command(SCIM_TRANS_CMD_REPLY);
3003 trans.put_command(SCIM_TRANS_CMD_OK);
3005 num = strlist.size();
3006 trans.put_data(num);
3008 for (unsigned int i = 0; i < num; i++) {
3009 buf = const_cast<char*>(strlist[i].c_str());
3010 len = strlen(buf) + 1;
3011 trans.put_data(buf, len);
3014 trans.write_to_socket(client_socket);
3017 LOGW ("Access denied to get ise list");
3018 send_fail_reply (client_id);
3020 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
3021 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3022 HELPER_ISE_INFO info;
3023 m_info_manager->get_all_helper_ise_info(client_id, info);
3027 Socket client_socket(client_id);
3030 trans.put_command(SCIM_TRANS_CMD_REPLY);
3031 trans.put_command(SCIM_TRANS_CMD_OK);
3033 if (info.appid.size() > 0) {
3034 trans.put_data(info.appid);
3035 trans.put_data(info.label);
3036 trans.put_data(info.is_enabled);
3037 trans.put_data(info.is_preinstalled);
3038 trans.put_data(info.has_option);
3041 trans.write_to_socket(client_socket);
3045 LOGW ("Access denied to get all helper ise info");
3046 send_fail_reply (client_id);
3048 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
3049 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3054 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
3055 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
3058 LOGW ("wrong format of transaction");
3062 Socket client_socket(client_id);
3065 trans.put_command(SCIM_TRANS_CMD_REPLY);
3066 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3067 trans.write_to_socket(client_socket);
3070 LOGW ("Access denied to set enable helper ise info");
3071 send_fail_reply (client_id);
3073 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
3074 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3075 String strUuid, strName, strLanguage, strModuleName;
3079 if (m_recv_trans.get_data(strUuid)) {
3080 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
3082 LOGW ("wrong format of transaction");
3086 Socket client_socket(client_id);
3088 trans.put_command(SCIM_TRANS_CMD_REPLY);
3089 trans.put_command(SCIM_TRANS_CMD_OK);
3090 trans.put_data(strName);
3091 trans.put_data(strLanguage);
3092 trans.put_data(nType);
3093 trans.put_data(nOption);
3094 trans.put_data(strModuleName);
3095 trans.write_to_socket(client_socket);
3098 LOGW ("Access denied to get ise information");
3099 send_fail_reply (client_id);
3101 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
3102 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3104 Socket client_socket(client_id);
3107 trans.put_command(SCIM_TRANS_CMD_REPLY);
3108 trans.put_command(SCIM_TRANS_CMD_OK);
3109 trans.write_to_socket(client_socket);
3110 m_info_manager->show_helper_ise_selector(client_id);
3111 m_info_manager->reset_ise_option(client_id);
3114 LOGW ("Access denied to reset ise option");
3115 send_fail_reply (client_id);
3117 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
3118 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3119 m_info_manager->reset_default_ise(client_id);
3122 LOGW ("Access denied to reset default ise");
3123 send_fail_reply (client_id);
3125 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
3126 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3127 m_info_manager->show_isf_panel(client_id);
3130 LOGW ("Access denied to show isf control");
3131 send_fail_reply (client_id);
3133 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
3134 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3135 m_info_manager->show_ise_option_window(client_id);
3138 LOGW ("Access denied to show ise option window");
3139 send_fail_reply (client_id);
3141 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
3142 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3143 m_info_manager->resume_ise_option_window(client_id);
3146 LOGW ("Access denied to resume ise option window");
3147 send_fail_reply (client_id);
3149 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
3150 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3152 Socket client_socket(client_id);
3155 trans.put_command(SCIM_TRANS_CMD_REPLY);
3156 trans.put_command(SCIM_TRANS_CMD_OK);
3157 trans.write_to_socket(client_socket);
3159 m_info_manager->show_helper_ise_list(client_id);
3162 LOGW ("Access denied to show helper ise list");
3163 send_fail_reply (client_id);
3165 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
3166 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3168 Socket client_socket(client_id);
3171 trans.put_command(SCIM_TRANS_CMD_REPLY);
3172 trans.put_command(SCIM_TRANS_CMD_OK);
3173 trans.write_to_socket(client_socket);
3174 m_info_manager->show_helper_ise_selector(client_id);
3177 LOGW ("Access denied to show helper ise selector");
3178 send_fail_reply (client_id);
3180 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
3181 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3183 uint32 nEnabled = 0;
3185 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
3187 Socket client_socket(client_id);
3189 trans.put_command(SCIM_TRANS_CMD_REPLY);
3190 trans.put_command(SCIM_TRANS_CMD_OK);
3191 trans.put_data(static_cast<uint32>(nEnabled));
3192 trans.write_to_socket(client_socket);
3195 LOGW ("Access denied to check helper ise enabled");
3196 send_fail_reply (client_id);
3198 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
3202 Socket client_socket(client_id);
3205 trans.put_command(SCIM_TRANS_CMD_REPLY);
3207 if (m_recv_trans.get_data(angle)) {
3208 struct rectinfo info = {0, 0, 0, 0};
3209 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
3211 trans.put_command(SCIM_TRANS_CMD_OK);
3212 trans.put_data(info.pos_x);
3213 trans.put_data(info.pos_y);
3214 trans.put_data(info.width);
3215 trans.put_data(info.height);
3217 trans.put_command(SCIM_TRANS_CMD_FAIL);
3220 trans.write_to_socket(client_socket);
3221 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
3223 Socket client_socket(client_id);
3226 trans.put_command(SCIM_TRANS_CMD_REPLY);
3227 trans.put_command(SCIM_TRANS_CMD_OK);
3228 trans.write_to_socket(client_socket);
3229 m_info_manager->hide_helper_ise ();
3230 } else if (cmd == ISM_TRANS_CMD_PRELAUNCH_ISE) {
3232 Socket client_socket(client_id);
3235 trans.put_command(SCIM_TRANS_CMD_REPLY);
3236 trans.put_command(SCIM_TRANS_CMD_OK);
3237 trans.write_to_socket(client_socket);
3238 m_info_manager->prelaunch_helper_ise();
3240 LOGW ("unknown cmd: %d", cmd);
3244 socket_transaction_end();
3245 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
3246 socket_transaction_start();
3247 while (m_recv_trans.get_command(cmd)) {
3248 if (cmd == ISM_REMOTE_TRANS_CMD_SEND_INPUT_MESSAGE) {
3253 if (m_recv_trans.get_data(&buf, len)) {
3254 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
3256 LOGW ("wrong format of transaction");
3260 Socket client_socket(client_id);
3263 trans.put_command(SCIM_TRANS_CMD_REPLY);
3264 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3265 trans.write_to_socket(client_socket);
3269 } else if (cmd == ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE) {
3272 if (m_info_manager->check_privilege_by_sockfd(client_id, REMOTEINPUT_PRIVILEGE))
3276 Socket client_socket(client_id);
3279 trans.put_command(SCIM_TRANS_CMD_REPLY);
3280 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3281 trans.write_to_socket(client_socket);
3282 } else if (cmd == ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3287 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
3288 ret = m_info_manager->remoteinput_delete_surrounding_text(offset, len);
3290 LOGW ("wrong format of transaction");
3294 Socket client_socket(client_id);
3297 trans.put_command(SCIM_TRANS_CMD_REPLY);
3298 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3299 trans.write_to_socket(client_socket);
3301 LOGW ("unknown cmd: %d", cmd);
3305 socket_transaction_end ();
3309 void socket_exception_callback(SocketServer* server,
3310 const Socket& client) {
3311 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3312 LOGD ("client id:%d", client.get_id());
3313 socket_close_connection(server, client);
3316 bool socket_open_connection(SocketServer* server,
3317 const Socket& client) {
3318 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3319 LOGD ("client id:%d", client.get_id());
3321 String type = scim_socket_accept_connection(key,
3323 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3327 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3328 if (type.length()) {
3329 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3330 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3331 ((type == "Helper") ? HELPER_CLIENT :
3332 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3333 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3334 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3335 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3336 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3338 m_info_manager->add_client(client.get_id(), key, _type);
3342 LOGW ("open_connection failed");
3344 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3345 server->close_connection(client);
3349 void socket_close_connection(SocketServer* server,
3350 const Socket& client) {
3351 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3352 LOGD ("client id:%d", client.get_id());
3354 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3356 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos, ++i) {
3357 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3358 ::close (client.get_id ());
3359 ecore_main_fd_handler_del (_read_handler_list[i]);
3360 _read_handler_list.erase (IterPos);
3364 m_info_manager->del_client(client.get_id());
3367 void socket_transaction_start(void) {
3368 //m_signal_transaction_start ();
3371 void socket_transaction_end(void) {
3372 //m_signal_transaction_end ();
3379 //m_signal_unlock ();
3383 } /* namespace scim */
3385 /***************************************************/
3386 /*** Beginning of panel agent interface for ISF ***/
3387 /***************************************************/
3388 static scim::PanelAgentPointer instance;
3392 EXAPI void scim_module_init(void)
3396 EXAPI void scim_module_exit(void)
3401 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3406 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3408 scim::PanelAgentBase* _instance = NULL;
3409 if (instance.null()) {
3411 _instance = new scim::EcoreSocketPanelAgent();
3417 instance = _instance;
3424 vi:ts=4:nowrap:ai:expandtab