2 * ISF(Input Service Framework)
4 * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
5 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
7 * Contact: Li Zhang <li2012.zhang@samsung.com>
9 * This library is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU Lesser General Public License as published by the
11 * Free Software Foundation; either version 2.1 of the License, or (at your option)
14 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 * License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, write to the Free Software Foundation, Inc., 51
21 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define Uses_SCIM_TRANSACTION
26 #define Uses_SCIM_TRANS_COMMANDS
27 #define Uses_SCIM_PANEL_AGENT
28 #define Uses_SCIM_HELPER
29 #define Uses_SCIM_SOCKET
30 #define Uses_SCIM_EVENT
31 #define Uses_SCIM_CONFIG
32 #define Uses_SCIM_CONFIG_MODULE
33 #define Uses_SCIM_CONFIG_PATH
34 #define Uses_SCIM_UTILITY
37 #include <sys/types.h>
38 #include <sys/times.h>
39 #include <sys/socket.h>
44 #include "scim_private.h"
46 #include "scim_stl_map.h"
47 #include "isf_debug.h"
53 #define LOG_TAG "ISF_ECORE_SOCKET_MODULE"
55 #define IMEMANAGER_PRIVILEGE "http://tizen.org/privilege/imemanager"
57 #define SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY "/Panel/Socket/ConfigReadOnly"
62 struct HelperClientStub {
66 HelperClientStub(int i = 0, int r = 0) : id(i), ref(r) { }
69 struct IMControlStub {
70 std::vector<ISE_INFO> info;
71 std::vector<int> count;
74 void aul_wakeup_ime_application(int sockfd)
77 socklen_t len = sizeof(struct ucred);
78 if (getsockopt(sockfd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) {
79 int ret = aul_update_freezer_status((long)ucred.pid, "wakeup");
80 LOGD("aul_update_freezer_status : %d %d\n", ucred.pid, ret);
82 LOGD("getsockopt failed : %d\n", errno);
85 #define DEFAULT_CONTEXT_VALUE 0xfff
87 #define scim_module_init ecoresocket_LTX_scim_module_init
88 #define scim_module_exit ecoresocket_LTX_scim_module_exit
89 #define scim_panel_agent_module_init ecoresocket_LTX_scim_panel_agent_module_init
90 #define scim_panel_agent_module_get_instance ecoresocket_LTX_scim_panel_agent_module_get_instance
93 //==================================== PanelAgent ===========================
94 class EcoreSocketPanelAgent: public PanelAgentBase
99 String m_socket_address;
100 SocketServer m_socket_server;
102 Transaction m_send_trans;
103 Transaction m_recv_trans;
104 Transaction m_nest_trans;
106 bool m_should_shared_ise;
109 std::vector<Ecore_Fd_Handler*> _read_handler_list;
111 InfoManager* m_info_manager;
114 EcoreSocketPanelAgent()
115 : PanelAgentBase ("ecore_socket"),
116 m_should_exit(false),
117 m_socket_timeout(scim_get_default_socket_timeout()),
118 m_should_shared_ise(false),
119 m_ise_exiting(false),
120 m_info_manager(NULL) {
121 m_socket_server.signal_connect_accept(slot(this, &EcoreSocketPanelAgent::socket_accept_callback));
122 m_socket_server.signal_connect_receive(slot(this, &EcoreSocketPanelAgent::socket_receive_callback));
123 m_socket_server.signal_connect_exception(slot(this, &EcoreSocketPanelAgent::socket_exception_callback));
126 ~EcoreSocketPanelAgent() {
128 for (unsigned int ii = 0; ii < _read_handler_list.size(); ++ii) {
129 ecore_main_fd_handler_del(_read_handler_list[ii]);
131 _read_handler_list.clear();
134 bool initialize(InfoManager* info_manager, const String& display, bool resident) {
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\n");
151 bool valid(void) const {
152 return m_socket_server.valid();
156 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
159 m_should_exit = true;
162 if (client.connect(SocketAddress(m_socket_address))) {
167 void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) {
168 LOGD ("client id:%d\n", client);
169 Socket client_socket(client);
170 m_send_trans.clear();
171 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
172 m_send_trans.put_data(context_id);
173 m_send_trans.put_command(cmd);
174 m_send_trans.put_data(nType);
175 m_send_trans.put_data(nValue);
176 m_send_trans.write_to_socket(client_socket);
179 void move_preedit_caret(int client, uint32 context_id, uint32 position) {
180 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
181 LOGD ("client id:%d\n", client);
182 Socket client_socket(client);
183 m_send_trans.clear();
184 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
185 m_send_trans.put_data((uint32) context_id);
186 m_send_trans.put_command(SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
187 m_send_trans.put_data((uint32) position);
188 m_send_trans.write_to_socket(client_socket);
193 void request_help(int client_id, uint32 context_id) {
194 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
195 LOGD ("client id:%d", client_id);
197 Socket client_socket(client_id);
198 m_send_trans.clear();
199 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
200 m_send_trans.put_data((uint32) context_id);
201 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
202 m_send_trans.write_to_socket(client_socket);
205 void request_factory_menu(int client_id, uint32 context_id) {
206 LOGD ("client id:%d", client_id);
207 Socket client_socket(client_id);
208 m_send_trans.clear();
209 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
210 m_send_trans.put_data((uint32) context_id);
211 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
212 m_send_trans.write_to_socket(client_socket);
216 void reset_keyboard_ise(int client, uint32 context_id) {
217 LOGD ("client id:%d\n", client);
218 Socket client_socket(client);
219 m_send_trans.clear();
220 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
221 m_send_trans.put_data((uint32) context_id);
222 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
223 m_send_trans.write_to_socket(client_socket);
226 void update_keyboard_ise_list(int client, uint32 context) {
227 LOGD ("client id:%d\n", client);
229 Socket client_socket(client);
230 m_send_trans.clear();
231 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
232 m_send_trans.put_data((uint32) context);
233 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
234 m_send_trans.write_to_socket(client_socket);
237 void change_factory(int client, uint32 context, const String& uuid) {
238 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
239 LOGD ("client id:%d\n", client);
241 Socket client_socket(client);
242 m_send_trans.clear();
243 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
244 m_send_trans.put_data((uint32) context);
245 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
246 m_send_trans.put_data(uuid);
247 m_send_trans.write_to_socket(client_socket);
250 void helper_candidate_show(int client, uint32 context, const String& uuid) {
251 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
252 LOGD ("client id:%d\n", client);
255 Socket client_socket(client);
257 m_send_trans.clear();
258 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
259 m_send_trans.put_data(context);
260 m_send_trans.put_data(uuid);
261 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
262 m_send_trans.write_to_socket(client_socket);
265 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
266 LOGD ("client id:%d\n", client);
268 Socket client_socket(client);
270 m_send_trans.clear();
271 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
272 m_send_trans.put_data(context);
273 m_send_trans.put_data(uuid);
274 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
275 m_send_trans.write_to_socket(client_socket);
278 void candidate_more_window_show(int client, uint32 context) {
279 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
280 LOGD ("client id:%d\n", client);
283 Socket client_socket(client);
285 m_send_trans.clear();
286 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
287 m_send_trans.put_data(context);
288 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
289 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
290 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
291 m_send_trans.write_to_socket(client_socket);
294 void candidate_more_window_hide(int client, uint32 context) {
295 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
296 LOGD ("client id:%d\n", client);
298 Socket client_socket(client);
300 m_send_trans.clear();
301 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
302 m_send_trans.put_data(context);
303 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
304 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
305 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
306 m_send_trans.write_to_socket(client_socket);
309 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
310 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
311 LOGD ("client id:%d\n", client);
313 Socket client_socket(client);
315 m_send_trans.clear();
316 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
317 m_send_trans.put_data(context);
318 m_send_trans.put_data(uuid);
319 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
320 m_send_trans.put_data(table);
321 m_send_trans.write_to_socket(client_socket);
324 void select_aux(int client, uint32 contextid, uint32 item) {
325 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
326 LOGD ("client id:%d\n", client);
328 Socket client_socket(client);
329 m_send_trans.clear();
330 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
331 m_send_trans.put_data((uint32) contextid);
333 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
334 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
336 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
337 m_send_trans.put_data((uint32)item);
338 m_send_trans.write_to_socket(client_socket);
341 void select_candidate(int client, uint32 context, uint32 item) {
342 LOGD ("client id:%d\n", client);
344 Socket client_socket(client);
345 m_send_trans.clear();
346 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
347 m_send_trans.put_data((uint32) context);
349 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
350 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
352 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
353 m_send_trans.put_data((uint32)item);
354 m_send_trans.write_to_socket(client_socket);
357 void lookup_table_page_up(int client, uint32 context) {
358 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
359 LOGD ("client id:%d\n", client);
361 Socket client_socket(client);
362 m_send_trans.clear();
363 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
364 m_send_trans.put_data((uint32) context);
366 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
367 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
369 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
370 m_send_trans.write_to_socket(client_socket);
373 void lookup_table_page_down(int client, uint32 context) {
374 LOGD ("client id:%d\n", client);
376 Socket client_socket(client);
377 m_send_trans.clear();
378 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
379 m_send_trans.put_data((uint32) context);
381 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
382 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
384 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
385 m_send_trans.write_to_socket(client_socket);
388 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
389 LOGD ("client id:%d\n", client);
391 Socket client_socket(client);
392 m_send_trans.clear();
393 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
394 m_send_trans.put_data((uint32) context);
396 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
397 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
399 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
400 m_send_trans.put_data(size);
401 m_send_trans.write_to_socket(client_socket);
404 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
405 LOGD ("client id:%d\n", client);
407 Socket client_socket(client);
408 m_send_trans.clear();
409 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
410 m_send_trans.put_data((uint32) context);
412 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
413 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
415 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
416 m_send_trans.put_data(row_items);
417 m_send_trans.write_to_socket(client_socket);
420 void select_associate(int client, uint32 context, uint32 item) {
421 LOGD ("client id:%d\n", client);
423 Socket client_socket(client);
424 m_send_trans.clear();
425 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
426 m_send_trans.put_data((uint32) context);
428 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
429 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
431 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
432 m_send_trans.put_data((uint32)item);
433 m_send_trans.write_to_socket(client_socket);
436 void associate_table_page_up(int client, uint32 context) {
437 LOGD ("client id:%d\n", client);
439 Socket client_socket(client);
440 m_send_trans.clear();
441 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
442 m_send_trans.put_data((uint32) context);
444 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
445 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
447 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
448 m_send_trans.write_to_socket(client_socket);
451 void associate_table_page_down(int client, uint32 context) {
452 LOGD ("client id:%d\n", client);
454 Socket client_socket(client);
455 m_send_trans.clear();
456 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
457 m_send_trans.put_data((uint32) context);
459 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
460 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
462 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
463 m_send_trans.write_to_socket(client_socket);
466 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
467 LOGD ("client id:%d\n", client);
469 Socket client_socket(client);
470 m_send_trans.clear();
471 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
472 m_send_trans.put_data((uint32) context);
474 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
475 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
477 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
478 m_send_trans.put_data(size);
479 m_send_trans.write_to_socket(client_socket);
482 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
483 LOGD ("client id:%d\n", client);
485 Socket client_socket(client);
486 m_send_trans.clear();
487 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
488 m_send_trans.put_data((uint32) context);
490 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
491 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
493 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
494 m_send_trans.put_data(size);
495 m_send_trans.write_to_socket(client_socket);
498 void send_longpress_event(int client, uint32 context, int index) {
499 LOGD ("client id:%d\n", client);
501 Socket client_socket(client);
502 m_send_trans.clear();
503 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
504 m_send_trans.put_data((uint32) context);
506 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
507 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
509 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
510 m_send_trans.put_data(index);
511 m_send_trans.write_to_socket(client_socket);
514 void trigger_property(int client, uint32 context, const String& property) {
515 LOGD ("client id:%d\n", client);
517 Socket client_socket(client);
518 m_send_trans.clear();
519 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
520 m_send_trans.put_data((uint32) context);
522 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
523 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
525 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
526 m_send_trans.put_data(property);
527 m_send_trans.write_to_socket(client_socket);
530 void focus_out_helper(int client, uint32 context, const String& uuid) {
531 LOGD ("client id:%d\n", client);
533 Socket client_socket(client);
534 m_send_trans.clear();
535 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
536 m_send_trans.put_data(context);
537 m_send_trans.put_data(uuid);
538 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
539 m_send_trans.write_to_socket(client_socket);
542 void focus_in_helper(int client, uint32 context, const String& uuid) {
543 LOGD ("client id:%d\n", client);
545 Socket client_socket(client);
546 m_send_trans.clear();
547 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
548 m_send_trans.put_data(context);
549 m_send_trans.put_data(uuid);
550 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
551 m_send_trans.write_to_socket(client_socket);
554 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
555 LOGD ("client id:%d\n", client);
557 Socket client_socket(client);
559 aul_wakeup_ime_application(client_socket.get_id());
561 m_send_trans.clear();
562 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
563 m_send_trans.put_data(context);
564 m_send_trans.put_data(uuid);
565 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
566 m_send_trans.put_data(data, len);
567 m_send_trans.write_to_socket(client_socket);
570 void hide_helper(int client, uint32 context, const String& uuid) {
571 LOGD ("client id:%d\n", client);
573 Socket client_socket(client);
574 m_send_trans.clear();
575 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
576 m_send_trans.put_data(context);
577 m_send_trans.put_data(uuid);
578 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
579 m_send_trans.write_to_socket(client_socket);
582 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
583 LOGD ("client id:%d\n", client);
585 Socket client_socket(client);
586 m_send_trans.clear();
587 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
588 m_send_trans.put_data(context);
589 m_send_trans.put_data(uuid);
590 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
591 m_send_trans.put_data(mode);
592 m_send_trans.write_to_socket(client_socket);
595 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
596 LOGD ("client id:%d\n", client);
598 Socket client_socket(client);
599 m_send_trans.clear();
600 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
601 m_send_trans.put_data(context);
602 m_send_trans.put_data(uuid);
603 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
604 m_send_trans.put_data(language);
605 m_send_trans.write_to_socket(client_socket);
608 void set_helper_imdata(int client, uint32 context, const String& uuid, const char* imdata, size_t& len) {
609 LOGD ("client id:%d\n", client);
611 Socket client_socket(client);
612 m_send_trans.clear();
613 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
614 m_send_trans.put_data(context);
615 m_send_trans.put_data(uuid);
616 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
617 m_send_trans.put_data(imdata, len);
618 m_send_trans.write_to_socket(client_socket);
621 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
622 LOGD ("client id:%d\n", client);
624 Socket client_socket(client);
625 m_send_trans.clear();
626 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
627 m_send_trans.put_data(context);
628 m_send_trans.put_data(uuid);
629 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
630 m_send_trans.put_data(type);
631 m_send_trans.write_to_socket(client_socket);
634 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
635 LOGD ("client id:%d\n", client);
637 Socket client_socket(client);
640 trans.put_command(SCIM_TRANS_CMD_REPLY);
641 trans.put_data(context);
642 trans.put_data(uuid);
643 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
647 if (trans.write_to_socket(client_socket)
648 && trans.read_from_socket(client_socket)
649 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
650 && trans.get_data(type)) {
651 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
654 LOGW ("read failed\n");
658 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
659 LOGD ("client id:%d\n", client);
661 Socket client_socket(client);
662 m_send_trans.clear();
663 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
664 m_send_trans.put_data(context);
665 m_send_trans.put_data(uuid);
666 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
667 m_send_trans.put_data(disabled);
668 m_send_trans.write_to_socket(client_socket);
671 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
672 Socket client_socket(client);
673 LOGD ("client id:%d", client);
678 trans.put_command(SCIM_TRANS_CMD_REPLY);
679 trans.put_data(context);
680 trans.put_data(uuid);
681 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
685 if (trans.write_to_socket(client_socket)
686 && trans.read_from_socket(client_socket)
687 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
688 && trans.get_data(disabled)) {
689 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
692 LOGW ("read failed");
696 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
697 LOGD ("client id:%d\n", client);
699 Socket client_socket(client);
700 m_send_trans.clear();
701 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
702 m_send_trans.put_data(context);
703 m_send_trans.put_data(uuid);
704 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
705 m_send_trans.put_data(layout);
706 m_send_trans.write_to_socket(client_socket);
709 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
710 LOGD ("client id:%d\n", client);
712 Socket client_socket(client);
713 m_send_trans.clear();
714 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
715 m_send_trans.put_data(context);
716 m_send_trans.put_data(uuid);
717 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
718 m_send_trans.put_data(mode);
719 m_send_trans.write_to_socket(client_socket);
722 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
723 LOGD ("client id:%d\n", client);
725 Socket client_socket(client);
726 m_send_trans.clear();
727 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
728 m_send_trans.put_data(context);
729 m_send_trans.put_data(uuid);
730 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
731 m_send_trans.put_data(hint);
732 m_send_trans.write_to_socket(client_socket);
735 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
736 LOGD ("client id:%d\n", client);
738 Socket client_socket(client);
739 m_send_trans.clear();
740 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
741 m_send_trans.put_data(context);
742 m_send_trans.put_data(uuid);
743 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
744 m_send_trans.put_data(direction);
745 m_send_trans.write_to_socket(client_socket);
748 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
749 LOGD ("client id:%d\n", client);
751 Socket client_socket(client);
752 m_send_trans.clear();
753 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
754 m_send_trans.put_data(context);
755 m_send_trans.put_data(uuid);
756 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
757 m_send_trans.put_data(mode);
758 m_send_trans.write_to_socket(client_socket);
761 void show_helper_option_window(int client, uint32 context, const String& uuid) {
762 LOGD ("client id:%d\n", client);
764 Socket client_socket(client);
766 aul_wakeup_ime_application(client_socket.get_id());
768 m_send_trans.clear();
769 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
770 m_send_trans.put_data(context);
771 m_send_trans.put_data(uuid);
772 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
773 m_send_trans.write_to_socket(client_socket);
776 void resume_helper_option_window(int client, uint32 context, const String& uuid) {
777 LOGD ("client id:%d\n", client);
779 Socket client_socket(client);
781 aul_wakeup_ime_application(client_socket.get_id());
783 m_send_trans.clear();
784 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
785 m_send_trans.put_data(context);
786 m_send_trans.put_data(uuid);
787 m_send_trans.put_command(ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW);
788 m_send_trans.write_to_socket(client_socket);
791 void set_helper_keyboard_mode(int client, uint32 context, const String& uuid, uint32& mode) {
792 LOGD ("client id:%d\n", client);
794 Socket client_socket(client);
795 m_send_trans.clear();
796 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
797 m_send_trans.put_data(context);
798 m_send_trans.put_data(uuid);
799 m_send_trans.put_command(ISM_TRANS_CMD_SET_KEYBOARD_MODE);
800 m_send_trans.put_data(mode);
801 m_send_trans.write_to_socket(client_socket);
804 void set_helper_prediction_hint(int client, uint32 context, const String& uuid, String& prediction_hint) {
805 LOGD ("client id:%d\n", client);
807 Socket client_socket(client);
808 m_send_trans.clear();
809 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
810 m_send_trans.put_data(context);
811 m_send_trans.put_data(uuid);
812 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_HINT);
813 m_send_trans.put_data(prediction_hint);
814 m_send_trans.write_to_socket(client_socket);
817 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) {
818 LOGD ("client id:%d\n", client);
820 Socket client_socket(client);
825 trans.put_command(SCIM_TRANS_CMD_REPLY);
826 trans.put_data(context);
827 trans.put_data(uuid);
828 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
830 trans.put_data(serial);
832 if (trans.write_to_socket(client_socket)) {
833 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
836 LOGW ("read failed\n");
842 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
843 LOGD ("client id:%d\n", client);
845 Socket client_socket(client);
849 trans.put_command(SCIM_TRANS_CMD_REPLY);
850 trans.put_data(context);
851 trans.put_data(uuid);
852 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
854 if (trans.write_to_socket(client_socket)) {
859 if (trans.read_from_socket(client_socket)
860 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
861 && trans.get_data(info.pos_x)
862 && trans.get_data(info.pos_y)
863 && trans.get_data(info.width)
864 && trans.get_data(info.height)) {
865 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
868 LOGW ("read failed\n");
870 LOGW ("write failed\n");
875 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
876 LOGD ("client id:%d\n", client);
877 Socket client_socket(client);
881 trans.put_command(SCIM_TRANS_CMD_REPLY);
882 trans.put_data(context);
883 trans.put_data(uuid);
884 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
888 if (trans.write_to_socket(client_socket)
889 && trans.read_from_socket(client_socket)
890 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY) {
891 trans.get_data(imdata, len);
892 LOGD ("length of imdata is %d", len);
894 LOGW ("read imdata failed\n");
898 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
899 LOGD ("client id:%d\n", client);
901 Socket client_socket(client);
905 trans.put_command(SCIM_TRANS_CMD_REPLY);
906 trans.put_data(context);
907 trans.put_data(uuid);
908 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
912 if (trans.write_to_socket(client_socket)
913 && trans.read_from_socket(client_socket)
914 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
915 && trans.get_data(layout)) {
916 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
921 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
922 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
923 LOGD ("client id:%d\n", client);
928 trans.put_command(SCIM_TRANS_CMD_REPLY);
929 trans.put_data(context);
930 trans.put_data(uuid);
931 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
934 Socket client_socket(client);
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(data, len)) {
945 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
946 LOGD ("client id:%d\n", client);
949 Socket client_socket(client);
954 trans.put_command(SCIM_TRANS_CMD_REPLY);
955 trans.put_data(context);
956 trans.put_data(uuid);
957 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
958 trans.write_to_socket(client_socket);
960 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
961 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
962 !trans.get_data(avail)) {
963 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed\n");
967 void reset_ise_option(int client, uint32 context) {
968 LOGD ("client id:%d\n", client);
970 Socket client_socket(client);
971 m_send_trans.clear();
972 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
973 m_send_trans.put_data((uint32) context);
974 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
975 m_send_trans.write_to_socket(client_socket);
978 void reset_helper_context(int client, uint32 context, const String& uuid) {
979 LOGD ("client id:%d\n", client);
981 Socket client_socket(client);
982 m_send_trans.clear();
983 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
984 m_send_trans.put_data(context);
985 m_send_trans.put_data(uuid);
986 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
987 m_send_trans.write_to_socket(client_socket);
990 void reload_config(int client) {
991 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
992 LOGD ("client id:%d\n", client);
994 m_send_trans.clear();
995 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
996 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
998 Socket client_socket(client);
999 m_send_trans.write_to_socket(client_socket);
1002 void exit(int client, uint32 context) {
1003 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
1004 LOGD ("client id:%d\n", client);
1006 m_send_trans.clear();
1007 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1009 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
1010 m_send_trans.put_data(context);
1011 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
1014 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
1016 Socket client_socket(client);
1017 m_send_trans.write_to_socket(client_socket);
1020 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
1021 LOGD("client id:%d\n", client);
1023 Socket client_socket(client);
1028 trans.put_command(SCIM_TRANS_CMD_REPLY);
1029 trans.put_data(context);
1030 trans.put_data(uuid);
1031 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
1032 trans.put_data(type);
1033 trans.put_data(data, len);
1036 if (trans.write_to_socket(client_socket)
1037 && trans.read_from_socket(client_socket)
1038 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1039 && trans.get_data(result)) {
1040 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
1044 LOGW("read failed\n");
1050 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
1051 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1052 LOGD ("client id:%d\n", client);
1054 Socket client_socket(client);
1056 m_send_trans.clear();
1057 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1058 m_send_trans.put_data(context);
1059 m_send_trans.put_data(uuid);
1060 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1061 m_send_trans.put_data(text);
1062 m_send_trans.put_data(cursor);
1063 m_send_trans.write_to_socket(client_socket);
1065 m_send_trans.clear();
1066 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1067 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1068 m_send_trans.write_to_socket(client_socket);
1071 void socket_remoteinput_focus_in (int client) {
1072 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1073 LOGD ("client id:%d\n", client);
1076 ret = (client == -1) ? false : true;
1079 Socket client_socket(client);
1081 m_send_trans.clear();
1082 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1083 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_IN);
1084 m_send_trans.write_to_socket(client_socket);
1088 void socket_remoteinput_focus_out (int client) {
1089 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1090 LOGD ("client id:%d\n", client);
1093 ret = (client == -1) ? false : true;
1096 Socket client_socket(client);
1098 m_send_trans.clear();
1099 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1100 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_OUT);
1101 m_send_trans.write_to_socket(client_socket);
1105 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type, int return_key_disabled) {
1106 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1107 LOGD ("client id:%d\n", client);
1110 ret = (client == -1) ? false : true;
1113 Socket client_socket(client);
1115 m_send_trans.clear();
1116 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1117 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_ENTRY_METADATA);
1118 m_send_trans.put_data(hint);
1119 m_send_trans.put_data(layout);
1120 m_send_trans.put_data(variation);
1121 m_send_trans.put_data(autocapital_type);
1122 m_send_trans.put_data(return_key_disabled);
1123 m_send_trans.write_to_socket(client_socket);
1127 void socket_remoteinput_surrounding_text (int client, String& text, uint32 cursor) {
1128 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1129 LOGD ("client id:%d\n", client);
1132 ret = (client == -1) ? false : true;
1135 Socket client_socket(client);
1137 m_send_trans.clear();
1138 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1139 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT);
1140 m_send_trans.put_data(text);
1141 m_send_trans.put_data(cursor);
1142 m_send_trans.write_to_socket(client_socket);
1146 void socket_remoteinput_input_resource (int client, uint32 input_resource) {
1147 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1148 LOGD ("client id:%d\n", client);
1151 ret = (client == -1) ? false : true;
1154 Socket client_socket(client);
1156 m_send_trans.clear();
1157 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1158 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE);
1159 m_send_trans.put_data(input_resource);
1160 m_send_trans.write_to_socket(client_socket);
1164 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1165 LOGD ("client id:%d\n", client);
1167 Socket client_socket(client);
1169 m_send_trans.clear();
1170 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1171 m_send_trans.put_data(context);
1172 m_send_trans.put_data(uuid);
1173 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
1174 m_send_trans.put_data(text);
1175 m_send_trans.write_to_socket(client_socket);
1177 m_send_trans.clear();
1178 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1179 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1180 m_send_trans.write_to_socket(client_socket);
1183 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1184 LOGD ("client id:%d\n", client);
1186 Socket socket_client(client);
1187 m_send_trans.clear();
1188 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1189 m_send_trans.put_data(context);
1190 m_send_trans.put_data(uuid);
1191 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1192 m_send_trans.put_data(list.size());
1194 for (unsigned int i = 0; i < list.size(); i++)
1195 m_send_trans.put_data(list[i]);
1197 m_send_trans.write_to_socket(socket_client);
1200 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1201 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1203 LOGD ("client id:%d\n", client);
1205 Socket socket_client(client);
1206 m_send_trans.clear();
1207 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1208 m_send_trans.put_data(context);
1209 m_send_trans.put_data(uuid);
1210 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1211 m_send_trans.put_data(style);
1212 m_send_trans.put_data(mode);
1213 m_send_trans.write_to_socket(socket_client);
1216 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1217 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1219 LOGD ("client id:%d\n", client);
1221 Socket socket_client(client);
1222 m_send_trans.clear();
1223 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1224 m_send_trans.put_data(context);
1225 m_send_trans.put_data(uuid);
1226 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1227 m_send_trans.put_data(info.pos_x);
1228 m_send_trans.put_data(info.pos_y);
1229 m_send_trans.put_data(info.width);
1230 m_send_trans.put_data(info.height);
1231 m_send_trans.write_to_socket(socket_client);
1234 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1235 LOGD ("client id:%d\n", client);
1237 Socket socket_client(client);
1238 m_send_trans.clear();
1239 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1240 m_send_trans.put_data(context);
1241 m_send_trans.put_data(uuid);
1242 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1243 m_send_trans.put_data(ise_name);
1244 m_send_trans.put_data(ise_uuid);
1245 m_send_trans.write_to_socket(socket_client);
1248 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1249 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1251 LOGD ("client id:%d\n", client);
1253 Socket client_socket(client);
1254 m_send_trans.clear();
1255 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1256 m_send_trans.put_data(context);
1257 m_send_trans.put_data(ic_uuid);
1258 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1259 m_send_trans.write_to_socket(client_socket);
1262 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1263 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1265 LOGD ("client id:%d\n", client);
1267 Socket client_socket(client);
1268 m_send_trans.clear();
1269 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1270 m_send_trans.put_data(context);
1271 m_send_trans.put_data(ic_uuid);
1272 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1273 m_send_trans.write_to_socket(client_socket);
1276 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1277 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1278 LOGD ("client id:%d\n", client);
1280 Socket client_socket(client);
1284 m_send_trans.clear();
1285 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1287 /* FIXME: We presume that client and context are both less than 65536.
1288 * Hopefully, it should be true in any UNIXs.
1289 * So it's ok to combine client and context into one uint32. */
1290 m_send_trans.put_data(context);
1291 m_send_trans.put_data(ic_uuid);
1292 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1293 m_send_trans.put_data(_nest_trans);
1294 m_send_trans.write_to_socket(client_socket);
1299 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1300 LOGD ("client id:%d\n", client);
1302 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1303 Socket socket_client(client);
1305 m_send_trans.clear();
1306 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1307 m_send_trans.put_data(context);
1308 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1309 m_send_trans.put_data(target_uuid);
1310 m_send_trans.put_data(active_uuid);
1311 m_send_trans.put_data(nest_trans);
1312 m_send_trans.write_to_socket(socket_client);
1316 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1317 LOGD ("client id:%d\n", client);
1319 Socket socket_client(client);
1321 m_send_trans.clear();
1322 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1323 m_send_trans.put_data(context);
1324 m_send_trans.put_command(cmd);
1325 m_send_trans.put_data(key);
1326 m_send_trans.write_to_socket(socket_client);
1330 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1331 LOGD ("client id:%d\n", client);
1333 Socket socket_client(client);
1335 m_send_trans.clear();
1336 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1337 m_send_trans.put_data(target_context);
1338 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1339 m_send_trans.put_data(wstr);
1340 m_send_trans.write_to_socket(socket_client);
1344 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1345 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1346 LOGD ("client id:%d\n", client);
1348 Socket socket_client(client);
1350 m_send_trans.clear();
1351 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1352 m_send_trans.put_data(context_id);
1353 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1354 m_send_trans.put_data(maxlen_before);
1355 m_send_trans.put_data(maxlen_after);
1356 m_send_trans.write_to_socket(socket_client);
1360 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1361 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1362 LOGD ("client id:%d\n", client);
1364 Socket socket_client(client);
1366 m_send_trans.clear();
1367 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1368 m_send_trans.put_data(context_id);
1369 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1370 m_send_trans.put_data(offset);
1371 m_send_trans.put_data(len);
1372 m_send_trans.write_to_socket(socket_client);
1376 void socket_helper_get_selection(int client, uint32 context_id) {
1377 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1378 LOGD ("client id:%d\n", client);
1381 Socket socket_client(client);
1383 m_send_trans.clear();
1384 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1385 m_send_trans.put_data(context_id);
1386 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1387 m_send_trans.write_to_socket(socket_client);
1391 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1392 LOGD ("client id:%d\n", client);
1394 Socket socket_client(client);
1396 m_send_trans.clear();
1397 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1398 m_send_trans.put_data(context_id);
1399 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1400 m_send_trans.put_data(start);
1401 m_send_trans.put_data(end);
1402 m_send_trans.write_to_socket(socket_client);
1406 void show_preedit_string(int client, uint32 target_context) {
1407 LOGD ("client id:%d\n", client);
1409 Socket socket_client(client);
1411 m_send_trans.clear();
1412 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1413 m_send_trans.put_data(target_context);
1414 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1415 m_send_trans.write_to_socket(socket_client);
1419 void hide_preedit_string(int client, uint32 target_context) {
1420 LOGD ("client id:%d\n", client);
1422 Socket socket_client(client);
1424 m_send_trans.clear();
1425 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1426 m_send_trans.put_data(target_context);
1427 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1428 m_send_trans.write_to_socket(socket_client);
1432 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1433 LOGD ("client id:%d\n", client);
1435 Socket socket_client(client);
1437 m_send_trans.clear();
1438 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1439 m_send_trans.put_data(target_context);
1440 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1441 m_send_trans.put_data(preedit);
1442 m_send_trans.put_data(commit);
1443 m_send_trans.put_data(attrs);
1444 m_send_trans.put_data(caret);
1445 m_send_trans.write_to_socket(socket_client);
1449 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1450 LOGD ("client id:%d\n", client);
1452 Socket socket_client(client);
1454 m_send_trans.clear();
1455 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1456 m_send_trans.put_data(focused_context);
1457 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1458 m_send_trans.put_data(caret);
1459 m_send_trans.write_to_socket(socket_client);
1463 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1464 LOGD ("client id:%d\n", client);
1466 Socket socket_client(client);
1467 m_send_trans.clear();
1468 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1469 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1470 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1472 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1473 m_send_trans.put_data(helper_ic_index[i].first);
1474 m_send_trans.put_data(helper_ic_index[i].second);
1477 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1478 m_send_trans.put_data((uint32)current_screen);
1479 m_send_trans.write_to_socket(socket_client);
1482 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1483 LOGD ("client id:%d\n", client);
1485 Socket client_socket(client);
1486 m_send_trans.clear();
1487 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1488 m_send_trans.put_data(focused_context);
1489 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1490 m_send_trans.put_data(type);
1491 m_send_trans.put_data(value);
1492 m_send_trans.write_to_socket(client_socket);
1495 void send_private_command(int client, uint32 focused_context, String command) {
1496 LOGD ("client id:%d\n", client);
1498 Socket socket_client(client);
1500 m_send_trans.clear();
1501 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1502 m_send_trans.put_data(focused_context);
1503 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1504 m_send_trans.put_data(command);
1505 m_send_trans.write_to_socket(socket_client);
1508 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1509 LOGD ("client id:%d\n", client);
1511 m_send_trans.clear();
1512 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1514 /* FIXME: We presume that client and context are both less than 65536.
1515 * Hopefully, it should be true in any UNIXs.
1516 * So it's ok to combine client and context into one uint32. */
1517 m_send_trans.put_data(context_id);
1518 m_send_trans.put_data(uuid);
1519 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1520 m_send_trans.put_data((uint32) x);
1521 m_send_trans.put_data((uint32) y);
1523 Socket client_socket(client);
1524 m_send_trans.write_to_socket(client_socket);
1527 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1528 LOGD ("client id:%d\n", client);
1530 m_send_trans.clear();
1531 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1532 m_send_trans.put_data(context_id);
1533 m_send_trans.put_data(uuid);
1534 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1535 m_send_trans.put_data((uint32) cursor_pos);
1537 Socket client_socket(client);
1538 m_send_trans.write_to_socket(client_socket);
1541 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1542 LOGD ("client id:%d\n", client);
1544 m_send_trans.clear();
1545 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1547 /* FIXME: We presume that client and context are both less than 65536.
1548 * Hopefully, it should be true in any UNIXs.
1549 * So it's ok to combine client and context into one uint32. */
1550 m_send_trans.put_data(context_id);
1551 m_send_trans.put_data(uuid);
1552 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1553 m_send_trans.put_data((uint32) screen);
1555 Socket client_socket(client);
1556 m_send_trans.write_to_socket(client_socket);
1559 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1560 LOGD ("client id:%d\n", client);
1562 m_send_trans.clear();
1563 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1565 m_send_trans.put_data(context);
1566 m_send_trans.put_data(uuid);
1567 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1568 m_send_trans.put_data((uint32) mode);
1570 Socket client_socket(client);
1571 m_send_trans.write_to_socket(client_socket);
1574 void remote_update_preedit_string (int client, uint32 target_context, const WideString str, const WideString commit, const AttributeList &attrs, uint32 caret) {
1575 LOGD("client id:%d\n", client);
1577 Socket client_socket(client);
1579 m_send_trans.clear();
1580 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1581 m_send_trans.put_data(target_context);
1582 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1583 m_send_trans.put_data(str);
1584 m_send_trans.put_data(commit);
1585 m_send_trans.put_data(attrs);
1586 m_send_trans.put_data(caret);
1587 m_send_trans.write_to_socket(client_socket);
1591 void remote_send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1592 LOGD("client id:%d\n", client);
1594 Socket client_socket(client);
1596 m_send_trans.clear ();
1597 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1598 m_send_trans.put_data (target_context);
1599 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1600 m_send_trans.put_data (key);
1601 m_send_trans.write_to_socket (client_socket);
1605 void remote_forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1606 LOGD("client id:%d\n", client);
1608 Socket client_socket(client);
1610 m_send_trans.clear ();
1611 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1612 m_send_trans.put_data (target_context);
1613 m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
1614 m_send_trans.put_data (key);
1615 m_send_trans.write_to_socket (client_socket);
1619 void remote_commit_string (int client, uint32 target_context, const WideString& wstr) {
1620 LOGD ("client id:%d\n", client);
1622 Socket socket_client(client);
1624 m_send_trans.clear();
1625 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1626 m_send_trans.put_data(target_context);
1627 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1628 m_send_trans.put_data(wstr);
1629 m_send_trans.write_to_socket(socket_client);
1633 void remote_delete_surrounding_text (int client, uint32 context_id, uint32 offset, uint32 len) {
1634 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1635 LOGD ("client id:%d\n", client);
1637 Socket socket_client(client);
1639 m_send_trans.clear();
1640 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1641 m_send_trans.put_data(context_id);
1642 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1643 m_send_trans.put_data(offset);
1644 m_send_trans.put_data(len);
1645 m_send_trans.write_to_socket(socket_client);
1649 void set_prediction_allow (int client, uint32 context, String uuid, int mode) {
1650 LOGD ("client id:%d\n", client);
1652 m_send_trans.clear();
1653 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1655 m_send_trans.put_data(context);
1656 m_send_trans.put_data(uuid);
1657 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_ALLOW);
1658 m_send_trans.put_data((uint32) mode);
1660 Socket client_socket(client);
1661 m_send_trans.write_to_socket(client_socket);
1664 void send_fail_reply (int client)
1666 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1667 LOGD ("client id:%d\n", client);
1669 Socket client_socket (client);
1672 trans.put_command (SCIM_TRANS_CMD_REPLY);
1673 trans.put_command (SCIM_TRANS_CMD_FAIL);
1674 trans.write_to_socket (client_socket);
1679 bool filter_event(int fd) {
1680 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1682 return m_socket_server.filter_event(fd);
1685 bool filter_exception_event(int fd) {
1686 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1688 return m_socket_server.filter_exception_event(fd);
1691 int get_server_id() {
1692 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1694 return m_socket_server.get_id();
1697 bool socket_check_client_connection(const Socket& client) {
1698 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1700 unsigned char buf [sizeof(uint32)];
1702 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1704 if (nbytes == sizeof(uint32))
1708 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1710 LOGW ("Timeout when reading socket\n");
1717 * @brief Callback function for ecore fd handler.
1719 * @param data The data to pass to this callback.
1720 * @param fd_handler The ecore fd handler.
1722 * @return ECORE_CALLBACK_RENEW
1724 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1725 if (fd_handler == NULL || data == NULL)
1726 return ECORE_CALLBACK_RENEW;
1728 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1730 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1732 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1733 if (fd_handler == _agent->_read_handler_list [i]) {
1734 if (!_agent->filter_event(fd)) {
1735 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1737 ecore_main_fd_handler_del(fd_handler);
1739 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1742 return ECORE_CALLBACK_RENEW;
1746 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1747 _agent->filter_exception_event(fd);
1749 ecore_main_fd_handler_del(fd_handler);
1751 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1752 return ECORE_CALLBACK_RENEW;
1755 void socket_accept_callback(SocketServer* server,
1756 const Socket& client) {
1757 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1761 if (m_should_exit) {
1762 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1765 //m_signal_accept_connection (client.get_id ());
1766 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1767 _read_handler_list.push_back(panel_agent_read_handler);
1773 void socket_receive_callback(SocketServer* server,
1774 const Socket& client) {
1775 int client_id = client.get_id();
1781 ClientInfo client_info;
1783 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1785 /* If the connection is closed then close this client. */
1786 if (!socket_check_client_connection(client)) {
1787 LOGW ("check client connection failed\n");
1788 socket_close_connection(server, client);
1792 client_info = m_info_manager->socket_get_client_info(client_id);
1794 /* If it's a new client, then request to open the connection first. */
1795 if (client_info.type == UNKNOWN_CLIENT) {
1796 socket_open_connection(server, client);
1800 /* If can not read the transaction,
1801 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1802 * or the key is mismatch,
1804 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1805 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1806 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1807 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1811 if (client_info.type == FRONTEND_ACT_CLIENT) {
1812 if (m_recv_trans.get_data(context)) {
1813 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1814 socket_transaction_start();
1816 while (m_recv_trans.get_command(cmd)) {
1817 LOGD ("PanelAgent::cmd = %d\n", cmd);
1819 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1822 if (m_recv_trans.get_data(id)) {
1823 m_info_manager->register_panel_client(client_id, id);
1825 LOGW ("wrong format of transaction\n");
1830 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1831 if (m_recv_trans.get_data(uuid)) {
1832 m_info_manager->register_input_context(client_id, context, uuid);
1834 LOGW ("wrong format of transaction\n");
1839 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1840 m_info_manager->remove_input_context(client_id, context);
1843 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1844 m_info_manager->socket_reset_input_context(client_id, context);
1847 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1848 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1850 if (m_recv_trans.get_data(uuid)) {
1851 m_info_manager->focus_in(client_id, context, uuid);
1853 LOGW ("wrong format of transaction\n");
1858 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1861 if (m_recv_trans.get_data(isOn)) {
1862 m_info_manager->socket_turn_on_log(isOn);
1864 LOGW ("wrong format of transaction\n");
1869 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1870 m_info_manager->show_isf_panel(client_id);
1872 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1873 m_info_manager->hide_isf_panel(client_id);
1875 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1882 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1885 LOGW ("wrong format of transaction\n");
1889 Socket client_socket(client_id);
1892 trans.put_command(SCIM_TRANS_CMD_REPLY);
1893 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1894 trans.put_data(ret);
1895 trans.write_to_socket(client_socket);
1901 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1904 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1908 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1909 m_info_manager->hide_ise_panel(client_id, client, context);
1911 LOGW ("wrong format of transaction\n");
1915 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1916 struct rectinfo info;
1917 m_info_manager->get_input_panel_geometry(client_id, info);
1919 Socket client_socket(client_id);
1922 trans.put_command(SCIM_TRANS_CMD_REPLY);
1923 trans.put_command(SCIM_TRANS_CMD_OK);
1924 trans.put_data(info.pos_x);
1925 trans.put_data(info.pos_y);
1926 trans.put_data(info.width);
1927 trans.put_data(info.height);
1928 trans.write_to_socket(client_socket);
1930 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1931 struct rectinfo info;
1932 m_info_manager->get_candidate_window_geometry(client_id, info);
1934 Socket client_socket(client_id);
1937 trans.put_command(SCIM_TRANS_CMD_REPLY);
1938 trans.put_command(SCIM_TRANS_CMD_OK);
1939 trans.put_data(info.pos_x);
1940 trans.put_data(info.pos_y);
1941 trans.put_data(info.width);
1942 trans.put_data(info.height);
1943 trans.write_to_socket(client_socket);
1945 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1948 m_info_manager->get_ise_language_locale(client_id, &data, len);
1951 trans.put_command(SCIM_TRANS_CMD_REPLY);
1953 if (data != NULL && len > 0) {
1954 trans.put_command(SCIM_TRANS_CMD_OK);
1955 trans.put_data(data, len);
1957 trans.put_command(SCIM_TRANS_CMD_FAIL);
1960 Socket client_socket(client_id);
1961 trans.write_to_socket(client_socket);
1967 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1970 if (m_recv_trans.get_data(language)) {
1971 m_info_manager->set_ise_language(client_id, language);
1973 LOGW ("wrong format of transaction\n");
1977 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1978 char* imdata = NULL;
1981 if (m_recv_trans.get_data(&imdata, len)) {
1982 m_info_manager->set_ise_imdata(client_id, imdata, len);
1984 LOGW ("wrong format of transaction\n");
1991 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1992 char* imdata = NULL;
1994 m_info_manager->get_ise_imdata(client_id, &imdata, len);
1996 Socket client_socket(client_id);
1999 trans.put_command(SCIM_TRANS_CMD_REPLY);
2002 trans.put_command(SCIM_TRANS_CMD_OK);
2003 trans.put_data(imdata, len);
2005 trans.put_command(SCIM_TRANS_CMD_FAIL);
2008 trans.write_to_socket(client_socket);
2014 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
2017 if (m_recv_trans.get_data(type)) {
2018 m_info_manager->set_ise_return_key_type(client_id, type);
2020 LOGW ("wrong format of transaction\n");
2024 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
2026 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
2028 Socket client_socket(client_id);
2031 trans.put_command(SCIM_TRANS_CMD_REPLY);
2034 trans.put_command(SCIM_TRANS_CMD_OK);
2035 trans.put_data(type);
2037 trans.put_command(SCIM_TRANS_CMD_FAIL);
2040 trans.write_to_socket(client_socket);
2042 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
2045 if (m_recv_trans.get_data(disabled)) {
2046 m_info_manager->set_ise_return_key_disable(client_id, disabled);
2048 LOGW ("wrong format of transaction\n");
2052 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
2055 m_info_manager->get_ise_return_key_disable(client_id, disabled);
2057 Socket client_socket(client_id);
2060 trans.put_command(SCIM_TRANS_CMD_REPLY);
2063 trans.put_command(SCIM_TRANS_CMD_OK);
2064 trans.put_data(disabled);
2066 trans.put_command(SCIM_TRANS_CMD_FAIL);
2069 trans.write_to_socket(client_socket);
2071 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
2073 bool ret = m_info_manager->get_ise_layout(client_id, layout);
2075 Socket client_socket(client_id);
2078 trans.put_command(SCIM_TRANS_CMD_REPLY);
2081 trans.put_command(SCIM_TRANS_CMD_OK);
2082 trans.put_data(layout);
2084 trans.put_command(SCIM_TRANS_CMD_FAIL);
2087 trans.write_to_socket(client_socket);
2089 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
2092 if (m_recv_trans.get_data(layout)) {
2093 m_info_manager->set_ise_layout(client_id, layout);
2095 LOGW ("wrong format of transaction\n");
2099 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
2102 if (m_recv_trans.get_data(mode)) {
2103 m_info_manager->set_ise_caps_mode(client_id, mode);
2105 LOGW ("wrong format of transaction\n");
2109 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
2110 m_info_manager->will_show_ack(client_id);
2112 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
2113 m_info_manager->will_hide_ack(client_id);
2115 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
2118 if (m_recv_trans.get_data(mode)) {
2119 m_info_manager->set_keyboard_mode(client_id, mode);
2121 LOGW ("wrong format of transaction\n");
2125 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2126 m_info_manager->candidate_will_hide_ack(client_id);
2128 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2134 if (m_recv_trans.get_data(key)) {
2136 m_info_manager->process_key_event(key, result);
2138 LOGW ("wrong format of transaction\n");
2142 Socket client_socket(client_id);
2145 trans.put_command(SCIM_TRANS_CMD_REPLY);
2148 trans.put_command(SCIM_TRANS_CMD_OK);
2149 trans.put_data(result);
2151 trans.put_command(SCIM_TRANS_CMD_FAIL);
2154 trans.write_to_socket(client_socket);
2156 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2158 m_info_manager->get_active_helper_option(client_id, option);
2160 Socket client_socket(client_id);
2163 trans.put_command(SCIM_TRANS_CMD_REPLY);
2164 trans.put_command(SCIM_TRANS_CMD_OK);
2165 trans.put_data(option);
2166 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2167 trans.write_to_socket(client_socket);
2169 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2171 m_info_manager->get_ise_state(client_id, state);
2173 Socket client_socket(client_id);
2176 trans.put_command(SCIM_TRANS_CMD_REPLY);
2177 trans.put_command(SCIM_TRANS_CMD_OK);
2178 trans.put_data(state);
2179 trans.write_to_socket(client_socket);
2181 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2184 if (m_recv_trans.get_data(input_mode)) {
2185 m_info_manager->set_ise_input_mode(client_id, input_mode);
2187 LOGW ("wrong format of transaction\n");
2191 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2194 if (m_recv_trans.get_data(input_hint)) {
2195 m_info_manager->set_ise_input_hint(client_id, input_hint);
2197 LOGW ("wrong format of transaction\n");
2201 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2202 uint32 bidi_direction;
2204 if (m_recv_trans.get_data(bidi_direction)) {
2205 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2207 LOGW ("wrong format of transaction\n");
2211 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2212 m_info_manager->show_ise_option_window(client_id);
2214 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
2215 m_info_manager->resume_ise_option_window(client_id);
2222 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2225 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2226 m_info_manager->socket_start_helper(client_id, context, uuid);
2228 LOGW ("wrong format of transaction\n");
2232 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2235 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2236 uuid.length() && m_nest_trans.valid()) {
2237 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2239 LOGW ("wrong format of transaction\n");
2243 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2246 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2247 m_info_manager->socket_stop_helper(client_id, context, uuid);
2249 LOGW ("wrong format of transaction\n");
2258 /* Client must focus in before do any other things. */
2259 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2260 m_info_manager->socket_turn_on();
2261 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2262 m_info_manager->socket_turn_off();
2263 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2266 if (m_recv_trans.get_data(num))
2267 m_info_manager->socket_update_screen(client_id, num);
2269 LOGW ("wrong format of transaction\n");
2270 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2273 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2274 m_info_manager->socket_update_spot_location(x, y, top_y);
2276 LOGW ("wrong format of transaction\n");
2278 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2281 if (m_recv_trans.get_data(cursor_pos)) {
2282 m_info_manager->socket_update_cursor_position(cursor_pos);
2284 LOGW ("wrong format of transaction\n");
2286 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2290 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2291 m_info_manager->socket_update_surrounding_text(text, cursor);
2293 LOGW ("wrong format of transaction\n");
2295 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2298 if (m_recv_trans.get_data(text)) {
2299 m_info_manager->socket_update_selection(text);
2301 LOGW ("wrong format of transaction\n");
2303 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2304 m_info_manager->expand_candidate();
2305 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2306 m_info_manager->contract_candidate();
2307 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2308 uint32 portrait_line, mode;
2310 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2311 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2313 LOGW ("wrong format of transaction\n");
2314 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2315 PanelFactoryInfo info;
2317 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2318 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2319 m_info_manager->socket_update_factory_info(info);
2321 LOGW ("wrong format of transaction\n");
2323 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2324 m_info_manager->socket_show_preedit_string();
2325 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2326 m_info_manager->socket_show_aux_string();
2327 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2328 m_info_manager->socket_show_lookup_table();
2329 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2330 m_info_manager->socket_show_associate_table();
2331 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2332 m_info_manager->socket_hide_preedit_string();
2333 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2334 m_info_manager->socket_hide_aux_string();
2335 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2336 m_info_manager->socket_hide_lookup_table();
2337 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2338 m_info_manager->socket_hide_associate_table();
2339 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2341 AttributeList attrs;
2344 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2345 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2347 LOGW ("wrong format of transaction\n");
2348 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2351 if (m_recv_trans.get_data(caret))
2352 m_info_manager->socket_update_preedit_caret(caret);
2354 LOGW ("wrong format of transaction\n");
2355 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2357 AttributeList attrs;
2359 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2360 m_info_manager->socket_update_aux_string(str, attrs);
2362 LOGW ("wrong format of transaction\n");
2363 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2370 AttributeList attrs;
2372 if (m_recv_trans.get_data(target_ic) &&
2373 m_recv_trans.get_data(target_uuid) &&
2374 m_recv_trans.get_data(offset) &&
2375 m_recv_trans.get_data(len) &&
2376 m_recv_trans.get_data(preedit) &&
2377 m_recv_trans.get_data(commit) &&
2378 m_recv_trans.get_data(attrs)) {
2379 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2381 LOGW ("wrong format of transaction\n");
2383 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2384 CommonLookupTable _isf_candidate_table;
2386 if (m_recv_trans.get_data(_isf_candidate_table))
2387 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2389 LOGW ("wrong format of transaction\n");
2391 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2392 CommonLookupTable table;
2394 if (m_recv_trans.get_data(table))
2395 m_info_manager->socket_update_associate_table(table);
2397 LOGW ("wrong format of transaction\n");
2398 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2399 PropertyList properties;
2401 if (m_recv_trans.get_data(properties))
2402 m_info_manager->socket_register_properties(properties);
2404 LOGW ("wrong format of transaction\n");
2405 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2408 if (m_recv_trans.get_data(property))
2409 m_info_manager->socket_update_property(property);
2411 LOGW ("wrong format of transaction\n");
2412 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2415 if (m_recv_trans.get_data(help))
2416 m_info_manager->socket_show_help(help);
2418 LOGW ("wrong format of transaction\n");
2419 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2420 PanelFactoryInfo info;
2421 std::vector <PanelFactoryInfo> vec;
2423 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2424 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2425 info.lang = scim_get_normalized_language(info.lang);
2426 vec.push_back(info);
2429 m_info_manager->socket_show_factory_menu(vec);
2430 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2431 m_info_manager->focus_out(client_id, context);
2433 LOGW ("unknown cmd: %d\n", cmd);
2437 socket_transaction_end();
2439 } else if (client_info.type == FRONTEND_CLIENT) {
2440 if (m_recv_trans.get_data(context)) {
2441 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2442 socket_transaction_start();
2444 while (m_recv_trans.get_command(cmd)) {
2445 LOGD ("PanelAgent::cmd = %d\n", cmd);
2447 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2448 Socket client_socket(client_id);
2452 trans.put_command(SCIM_TRANS_CMD_REPLY);
2453 trans.put_command(SCIM_TRANS_CMD_OK);
2454 trans.put_data(client_id);
2455 trans.write_to_socket(client_socket);
2458 LOGW ("unknown cmd: %d\n", cmd);
2462 socket_transaction_end();
2464 } else if (client_info.type == HELPER_CLIENT) {
2465 socket_transaction_start();
2467 while (m_recv_trans.get_command(cmd)) {
2468 LOGD ("PanelAgent::cmd = %d\n", cmd);
2470 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2473 if (m_recv_trans.get_data(info.uuid) &&
2474 m_recv_trans.get_data(info.name) &&
2475 m_recv_trans.get_data(info.icon) &&
2476 m_recv_trans.get_data(info.description) &&
2477 m_recv_trans.get_data(info.option) &&
2478 info.uuid.length()) {
2479 m_info_manager->socket_helper_register_helper(client_id, info);
2482 LOGW ("unknown cmd: %d\n", cmd);
2486 socket_transaction_end();
2487 } else if (client_info.type == HELPER_ACT_CLIENT) {
2488 socket_transaction_start();
2490 while (m_recv_trans.get_command(cmd)) {
2491 LOGD ("PanelAgent::cmd = %d\n", cmd);
2493 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2496 if (m_recv_trans.get_data(info.uuid) &&
2497 m_recv_trans.get_data(info.name) &&
2498 m_recv_trans.get_data(info.icon) &&
2499 m_recv_trans.get_data(info.description) &&
2500 m_recv_trans.get_data(info.option) &&
2501 info.uuid.length()) {
2502 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2504 LOGW ("wrong format of transaction\n");
2507 /* Check whether application already requested the focus_in and showing input_panel
2508 * If so, Input FW request focus_in and show input_panel again to helper IME.
2509 * Because Helper IME couldn't receive these events during the launch.
2511 m_info_manager->reshow_input_panel ();
2512 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2517 if (m_recv_trans.get_data(target_ic) &&
2518 m_recv_trans.get_data(target_uuid) &&
2519 m_recv_trans.get_data(wstr) &&
2521 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2523 LOGW ("wrong format of transaction\n");
2525 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2529 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2530 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2532 LOGW ("wrong format of transaction\n");
2534 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2535 m_info_manager->socket_show_aux_string();
2536 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2537 m_info_manager->socket_show_lookup_table();
2538 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2539 m_info_manager->socket_show_associate_table();
2540 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2544 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2545 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2547 LOGW ("wrong format of transaction\n");
2549 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2550 m_info_manager->socket_hide_aux_string();
2551 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2552 m_info_manager->socket_hide_lookup_table();
2553 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2554 m_info_manager->socket_hide_associate_table();
2555 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2560 AttributeList attrs;
2563 if (m_recv_trans.get_data(target_ic) &&
2564 m_recv_trans.get_data(target_uuid) &&
2565 m_recv_trans.get_data(preedit) &&
2566 m_recv_trans.get_data(commit) &&
2567 m_recv_trans.get_data(attrs) &&
2568 m_recv_trans.get_data(caret)) {
2569 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2571 LOGW ("wrong format of transaction\n");
2573 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2576 if (m_recv_trans.get_data(caret)) {
2577 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2579 LOGW ("wrong format of transaction\n");
2581 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2583 AttributeList attrs;
2585 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2586 m_info_manager->socket_update_aux_string(str, attrs);
2588 LOGW ("wrong format of transaction\n");
2589 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2590 CommonLookupTable _isf_candidate_table;
2592 if (m_recv_trans.get_data(_isf_candidate_table)) {
2593 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2595 LOGW ("wrong format of transaction\n");
2597 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2598 CommonLookupTable _isf_candidate_table;
2600 if (m_recv_trans.get_data(_isf_candidate_table)) {
2601 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2603 LOGW ("wrong format of transaction\n");
2605 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2606 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2611 if (m_recv_trans.get_data(target_ic) &&
2612 m_recv_trans.get_data(target_uuid) &&
2613 m_recv_trans.get_data(key) &&
2615 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2617 LOGW ("wrong format of transaction\n");
2619 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2624 if (m_recv_trans.get_data(target_ic) &&
2625 m_recv_trans.get_data(target_uuid) &&
2626 m_recv_trans.get_data(key) &&
2628 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2630 LOGW ("wrong format of transaction\n");
2632 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2636 if (m_recv_trans.get_data(target_ic) &&
2637 m_recv_trans.get_data(target_uuid) &&
2638 m_recv_trans.get_data(m_nest_trans) &&
2639 m_nest_trans.valid()) {
2640 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2642 LOGW ("wrong format of transaction\n");
2644 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2645 PropertyList properties;
2647 if (m_recv_trans.get_data(properties))
2648 m_info_manager->socket_helper_register_properties(client_id, properties);
2650 LOGW ("wrong format of transaction\n");
2651 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2654 if (m_recv_trans.get_data(property))
2655 m_info_manager->socket_helper_update_property(client_id, property);
2657 LOGW ("wrong format of transaction\n");
2658 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2662 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2663 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2665 LOGW ("wrong format of transaction\n");
2667 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2670 if (m_recv_trans.get_data(uuid)) {
2671 m_info_manager->socket_get_keyboard_ise_list(uuid);
2673 LOGW ("wrong format of transaction\n");
2675 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2676 uint32 portrait_line, mode;
2678 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2679 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2681 LOGW ("wrong format of transaction\n");
2682 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2685 if (m_recv_trans.get_data(uuid)) {
2686 m_info_manager->socket_get_candidate_ui(uuid);
2688 LOGW ("wrong format of transaction\n");
2690 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2693 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2694 m_info_manager->socket_set_candidate_position(left, top);
2696 LOGW ("wrong format of transaction\n");
2697 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2698 m_info_manager->socket_hide_candidate();
2699 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2702 if (m_recv_trans.get_data(uuid)) {
2703 m_info_manager->socket_get_candidate_geometry(uuid);
2705 LOGW ("wrong format of transaction\n");
2707 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2708 m_info_manager->reset_keyboard_ise();
2709 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2712 if (m_recv_trans.get_data(uuid)) {
2713 m_info_manager->socket_set_keyboard_ise(uuid);
2715 LOGW ("wrong format of transaction\n");
2717 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2720 if (m_recv_trans.get_data(uuid)) {
2721 m_info_manager->socket_get_keyboard_ise(uuid);
2723 LOGW ("wrong format of transaction\n");
2725 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2726 uint32 x, y, width, height;
2728 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2729 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2730 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2732 LOGW ("wrong format of transaction\n");
2734 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2735 m_info_manager->expand_candidate();
2736 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2737 m_info_manager->contract_candidate();
2738 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2741 if (m_recv_trans.get_data(index))
2742 m_info_manager->socket_helper_select_candidate(index);
2744 LOGW ("wrong format of transaction\n");
2745 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2747 uint32 maxlen_before;
2748 uint32 maxlen_after;
2750 if (m_recv_trans.get_data(uuid) &&
2751 m_recv_trans.get_data(maxlen_before) &&
2752 m_recv_trans.get_data(maxlen_after)) {
2753 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2755 LOGW ("wrong format of transaction\n");
2757 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2761 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2762 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2764 LOGW ("wrong format of transaction\n");
2766 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2769 if (m_recv_trans.get_data(uuid)) {
2770 m_info_manager->socket_helper_get_selection(client_id, uuid);
2772 LOGW ("wrong format of transaction\n");
2774 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2778 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2779 m_info_manager->socket_helper_set_selection(client_id, start, end);
2781 LOGW ("wrong format of transaction\n");
2783 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2786 if (m_recv_trans.get_data(command)) {
2787 m_info_manager->socket_helper_send_private_command(client_id, command);
2789 LOGW ("wrong format of transaction\n");
2792 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2793 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2794 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2799 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2800 m_info_manager->process_key_event_done(key, ret, serial);
2802 LOGW ("wrong format of transaction\n");
2804 } else if (cmd == ISM_TRANS_CMD_REQUEST_ISE_HIDE) {
2805 m_info_manager->request_ise_hide();
2806 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2813 AttributeList attrs;
2815 if (m_recv_trans.get_data(target_ic) &&
2816 m_recv_trans.get_data(target_uuid) &&
2817 m_recv_trans.get_data(offset) &&
2818 m_recv_trans.get_data(len) &&
2819 m_recv_trans.get_data(preedit) &&
2820 m_recv_trans.get_data(commit) &&
2821 m_recv_trans.get_data(attrs)) {
2822 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2824 LOGW ("wrong format of transaction\n");
2827 LOGW ("unknown cmd: %d\n", cmd);
2831 socket_transaction_end();
2832 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2833 socket_transaction_start();
2835 while (m_recv_trans.get_command(cmd)) {
2836 LOGD ("PanelAgent::cmd = %d\n", cmd);
2838 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2839 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2840 String default_uuid;
2841 m_info_manager->get_active_ise(client_id, default_uuid);
2843 Socket client_socket(client_id);
2846 trans.put_command(SCIM_TRANS_CMD_REPLY);
2847 trans.put_command(SCIM_TRANS_CMD_OK);
2848 trans.put_data(default_uuid);
2849 trans.write_to_socket(client_socket);
2852 LOGW ("Access denied to get active ise\n");
2853 send_fail_reply (client_id);
2855 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2856 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2861 if (m_recv_trans.get_data(&buf, len)) {
2862 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2864 LOGW ("wrong format of transaction\n");
2868 Socket client_socket(client_id);
2871 trans.put_command(SCIM_TRANS_CMD_REPLY);
2872 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2873 trans.write_to_socket(client_socket);
2879 LOGW ("Access denied to set active ise\n");
2880 send_fail_reply (client_id);
2882 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2883 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2889 //ret need be checked
2890 if (m_recv_trans.get_data(&buf, len)) {
2891 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2893 LOGW ("wrong format of transaction\n");
2897 Socket client_socket(client_id);
2900 trans.put_command(SCIM_TRANS_CMD_REPLY);
2901 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2902 trans.write_to_socket(client_socket);
2908 LOGW ("Access denied to set initial ise\n");
2909 send_fail_reply (client_id);
2911 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2912 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2913 std::vector<String> strlist;
2914 m_info_manager->get_ise_list(client_id, strlist);
2916 Socket client_socket(client_id);
2922 trans.put_command(SCIM_TRANS_CMD_REPLY);
2923 trans.put_command(SCIM_TRANS_CMD_OK);
2925 num = strlist.size();
2926 trans.put_data(num);
2928 for (unsigned int i = 0; i < num; i++) {
2929 buf = const_cast<char*>(strlist[i].c_str());
2930 len = strlen(buf) + 1;
2931 trans.put_data(buf, len);
2934 trans.write_to_socket(client_socket);
2937 LOGW ("Access denied to get ise list\n");
2938 send_fail_reply (client_id);
2940 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2941 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2942 HELPER_ISE_INFO info;
2943 m_info_manager->get_all_helper_ise_info(client_id, info);
2947 Socket client_socket(client_id);
2950 trans.put_command(SCIM_TRANS_CMD_REPLY);
2951 trans.put_command(SCIM_TRANS_CMD_OK);
2953 if (info.appid.size() > 0) {
2954 trans.put_data(info.appid);
2955 trans.put_data(info.label);
2956 trans.put_data(info.is_enabled);
2957 trans.put_data(info.is_preinstalled);
2958 trans.put_data(info.has_option);
2961 trans.write_to_socket(client_socket);
2965 LOGW ("Access denied to get all helper ise info\n");
2966 send_fail_reply (client_id);
2968 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2969 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2974 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2975 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2978 LOGW ("wrong format of transaction\n");
2982 Socket client_socket(client_id);
2985 trans.put_command(SCIM_TRANS_CMD_REPLY);
2986 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2987 trans.write_to_socket(client_socket);
2990 LOGW ("Access denied to set enable helper ise info\n");
2991 send_fail_reply (client_id);
2993 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
2994 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2995 String strUuid, strName, strLanguage, strModuleName;
2999 if (m_recv_trans.get_data(strUuid)) {
3000 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
3002 LOGW ("wrong format of transaction\n");
3006 Socket client_socket(client_id);
3008 trans.put_command(SCIM_TRANS_CMD_REPLY);
3009 trans.put_command(SCIM_TRANS_CMD_OK);
3010 trans.put_data(strName);
3011 trans.put_data(strLanguage);
3012 trans.put_data(nType);
3013 trans.put_data(nOption);
3014 trans.put_data(strModuleName);
3015 trans.write_to_socket(client_socket);
3018 LOGW ("Access denied to get ise information\n");
3019 send_fail_reply (client_id);
3021 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
3022 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3024 Socket client_socket(client_id);
3027 trans.put_command(SCIM_TRANS_CMD_REPLY);
3028 trans.put_command(SCIM_TRANS_CMD_OK);
3029 trans.write_to_socket(client_socket);
3030 m_info_manager->show_helper_ise_selector(client_id);
3031 m_info_manager->reset_ise_option(client_id);
3034 LOGW ("Access denied to reset ise option\n");
3035 send_fail_reply (client_id);
3037 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
3038 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3039 m_info_manager->reset_default_ise(client_id);
3042 LOGW ("Access denied to reset default ise\n");
3043 send_fail_reply (client_id);
3045 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
3046 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3047 m_info_manager->show_isf_panel(client_id);
3050 LOGW ("Access denied to show isf control\n");
3051 send_fail_reply (client_id);
3053 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
3054 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3055 m_info_manager->show_ise_option_window(client_id);
3058 LOGW ("Access denied to show ise option window\n");
3059 send_fail_reply (client_id);
3061 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
3062 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3063 m_info_manager->resume_ise_option_window(client_id);
3066 LOGW ("Access denied to resume ise option window\n");
3067 send_fail_reply (client_id);
3069 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
3070 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3072 Socket client_socket(client_id);
3075 trans.put_command(SCIM_TRANS_CMD_REPLY);
3076 trans.put_command(SCIM_TRANS_CMD_OK);
3077 trans.write_to_socket(client_socket);
3079 m_info_manager->show_helper_ise_list(client_id);
3082 LOGW ("Access denied to show helper ise list\n");
3083 send_fail_reply (client_id);
3085 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
3086 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3088 Socket client_socket(client_id);
3091 trans.put_command(SCIM_TRANS_CMD_REPLY);
3092 trans.put_command(SCIM_TRANS_CMD_OK);
3093 trans.write_to_socket(client_socket);
3094 m_info_manager->show_helper_ise_selector(client_id);
3097 LOGW ("Access denied to show helper ise selector\n");
3098 send_fail_reply (client_id);
3100 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
3101 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3103 uint32 nEnabled = 0;
3106 //ret need be checked
3107 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
3109 Socket client_socket(client_id);
3111 trans.put_command(SCIM_TRANS_CMD_REPLY);
3114 trans.put_command(SCIM_TRANS_CMD_OK);
3115 trans.put_data(static_cast<uint32>(nEnabled));
3117 trans.put_command(SCIM_TRANS_CMD_FAIL);
3120 trans.write_to_socket(client_socket);
3123 LOGW ("Access denied to check helper ise enabled\n");
3124 send_fail_reply (client_id);
3126 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
3130 Socket client_socket(client_id);
3133 trans.put_command(SCIM_TRANS_CMD_REPLY);
3135 if (m_recv_trans.get_data(angle)) {
3136 struct rectinfo info = {0, 0, 0, 0};
3137 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
3139 trans.put_command(SCIM_TRANS_CMD_OK);
3140 trans.put_data(info.pos_x);
3141 trans.put_data(info.pos_y);
3142 trans.put_data(info.width);
3143 trans.put_data(info.height);
3145 trans.put_command(SCIM_TRANS_CMD_FAIL);
3148 trans.write_to_socket(client_socket);
3149 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
3151 Socket client_socket(client_id);
3154 trans.put_command(SCIM_TRANS_CMD_REPLY);
3155 trans.put_command(SCIM_TRANS_CMD_OK);
3156 trans.write_to_socket(client_socket);
3157 m_info_manager->hide_helper_ise ();
3159 LOGW ("unknown cmd: %d\n", cmd);
3163 socket_transaction_end();
3164 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
3165 socket_transaction_start();
3166 while (m_recv_trans.get_command(cmd)) {
3167 LOGD ("PanelAgent::cmd = %d\n", cmd);
3168 if (cmd == ISM_REMOTE_TRANS_CMD_SEND_INPUT_MESSAGE) {
3173 if (m_recv_trans.get_data(&buf, len)) {
3174 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
3176 LOGW ("wrong format of transaction\n");
3180 Socket client_socket(client_id);
3183 trans.put_command(SCIM_TRANS_CMD_REPLY);
3184 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3185 trans.write_to_socket(client_socket);
3189 } else if (cmd == ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE) {
3192 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE))
3196 Socket client_socket(client_id);
3199 trans.put_command(SCIM_TRANS_CMD_REPLY);
3200 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3201 trans.write_to_socket(client_socket);
3202 } else if (cmd == ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3207 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
3208 ret = m_info_manager->remoteinput_delete_surrounding_text(offset, len);
3210 LOGW ("wrong format of transaction\n");
3214 Socket client_socket(client_id);
3217 trans.put_command(SCIM_TRANS_CMD_REPLY);
3218 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3219 trans.write_to_socket(client_socket);
3221 LOGW ("unknown cmd: %d\n", cmd);
3225 socket_transaction_end ();
3229 void socket_exception_callback(SocketServer* server,
3230 const Socket& client) {
3231 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3232 LOGD ("client id:%d\n", client.get_id());
3233 socket_close_connection(server, client);
3236 bool socket_open_connection(SocketServer* server,
3237 const Socket& client) {
3238 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3239 LOGD ("client id:%d\n", client.get_id());
3241 String type = scim_socket_accept_connection(key,
3243 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3247 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3248 if (type.length()) {
3249 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3250 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3251 ((type == "Helper") ? HELPER_CLIENT :
3252 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3253 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3254 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3255 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3256 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3258 m_info_manager->add_client(client.get_id(), key, _type);
3262 LOGW ("open_connection failed\n");
3264 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3265 server->close_connection(client);
3269 void socket_close_connection(SocketServer* server,
3270 const Socket& client) {
3271 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3272 LOGD ("client id:%d\n", client.get_id());
3274 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3276 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos, ++i) {
3277 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3278 ::close (client.get_id ());
3279 ecore_main_fd_handler_del (_read_handler_list[i]);
3280 _read_handler_list.erase (IterPos);
3284 m_info_manager->del_client(client.get_id());
3287 void socket_transaction_start(void) {
3288 //m_signal_transaction_start ();
3291 void socket_transaction_end(void) {
3292 //m_signal_transaction_end ();
3299 //m_signal_unlock ();
3303 } /* namespace scim */
3305 /***************************************************/
3306 /*** Beginning of panel agent interface for ISF ***/
3307 /***************************************************/
3308 static scim::PanelAgentPointer instance;
3312 EXAPI void scim_module_init(void)
3316 EXAPI void scim_module_exit(void)
3321 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3326 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3328 scim::PanelAgentBase* _instance = NULL;
3329 if (instance.null()) {
3331 _instance = new scim::EcoreSocketPanelAgent();
3337 instance = _instance;
3344 vi:ts=4:nowrap:ai:expandtab