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);
206 void request_factory_menu(int client_id, uint32 context_id) {
207 LOGD ("client id:%d", client_id);
208 Socket client_socket(client_id);
209 m_send_trans.clear();
210 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
211 m_send_trans.put_data((uint32) context_id);
212 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
213 m_send_trans.write_to_socket(client_socket);
217 void reset_keyboard_ise(int client, uint32 context_id) {
218 LOGD ("client id:%d\n", client);
219 Socket client_socket(client);
220 m_send_trans.clear();
221 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
222 m_send_trans.put_data((uint32) context_id);
223 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
224 m_send_trans.write_to_socket(client_socket);
227 void update_keyboard_ise_list(int client, uint32 context) {
228 LOGD ("client id:%d\n", client);
230 Socket client_socket(client);
231 m_send_trans.clear();
232 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
233 m_send_trans.put_data((uint32) context);
234 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
235 m_send_trans.write_to_socket(client_socket);
238 void change_factory(int client, uint32 context, const String& uuid) {
239 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
240 LOGD ("client id:%d\n", client);
242 Socket client_socket(client);
243 m_send_trans.clear();
244 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
245 m_send_trans.put_data((uint32) context);
246 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
247 m_send_trans.put_data(uuid);
248 m_send_trans.write_to_socket(client_socket);
251 void helper_candidate_show(int client, uint32 context, const String& uuid) {
252 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
253 LOGD ("client id:%d\n", client);
256 Socket client_socket(client);
258 m_send_trans.clear();
259 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
260 m_send_trans.put_data(context);
261 m_send_trans.put_data(uuid);
262 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
263 m_send_trans.write_to_socket(client_socket);
266 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
267 LOGD ("client id:%d\n", client);
269 Socket client_socket(client);
271 m_send_trans.clear();
272 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
273 m_send_trans.put_data(context);
274 m_send_trans.put_data(uuid);
275 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
276 m_send_trans.write_to_socket(client_socket);
279 void candidate_more_window_show(int client, uint32 context) {
280 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
281 LOGD ("client id:%d\n", client);
284 Socket client_socket(client);
286 m_send_trans.clear();
287 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
288 m_send_trans.put_data(context);
289 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
290 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
291 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
292 m_send_trans.write_to_socket(client_socket);
295 void candidate_more_window_hide(int client, uint32 context) {
296 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
297 LOGD ("client id:%d\n", client);
299 Socket client_socket(client);
301 m_send_trans.clear();
302 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
303 m_send_trans.put_data(context);
304 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
305 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
306 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
307 m_send_trans.write_to_socket(client_socket);
310 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
311 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
312 LOGD ("client id:%d\n", client);
314 Socket client_socket(client);
316 m_send_trans.clear();
317 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
318 m_send_trans.put_data(context);
319 m_send_trans.put_data(uuid);
320 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
321 m_send_trans.put_data(table);
322 m_send_trans.write_to_socket(client_socket);
325 void select_aux(int client, uint32 contextid, uint32 item) {
326 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
327 LOGD ("client id:%d\n", client);
329 Socket client_socket(client);
330 m_send_trans.clear();
331 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
332 m_send_trans.put_data((uint32) contextid);
334 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
335 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
337 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
338 m_send_trans.put_data((uint32)item);
339 m_send_trans.write_to_socket(client_socket);
342 void select_candidate(int client, uint32 context, uint32 item) {
343 LOGD ("client id:%d\n", client);
345 Socket client_socket(client);
346 m_send_trans.clear();
347 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
348 m_send_trans.put_data((uint32) context);
350 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
351 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
353 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
354 m_send_trans.put_data((uint32)item);
355 m_send_trans.write_to_socket(client_socket);
358 void lookup_table_page_up(int client, uint32 context) {
359 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
360 LOGD ("client id:%d\n", client);
362 Socket client_socket(client);
363 m_send_trans.clear();
364 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
365 m_send_trans.put_data((uint32) context);
367 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
368 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
370 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
371 m_send_trans.write_to_socket(client_socket);
374 void lookup_table_page_down(int client, uint32 context) {
375 LOGD ("client id:%d\n", client);
377 Socket client_socket(client);
378 m_send_trans.clear();
379 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
380 m_send_trans.put_data((uint32) context);
382 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
383 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
385 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
386 m_send_trans.write_to_socket(client_socket);
389 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
390 LOGD ("client id:%d\n", client);
392 Socket client_socket(client);
393 m_send_trans.clear();
394 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
395 m_send_trans.put_data((uint32) context);
397 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
398 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
400 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
401 m_send_trans.put_data(size);
402 m_send_trans.write_to_socket(client_socket);
405 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
406 LOGD ("client id:%d\n", client);
408 Socket client_socket(client);
409 m_send_trans.clear();
410 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
411 m_send_trans.put_data((uint32) context);
413 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
414 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
416 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
417 m_send_trans.put_data(row_items);
418 m_send_trans.write_to_socket(client_socket);
421 void select_associate(int client, uint32 context, uint32 item) {
422 LOGD ("client id:%d\n", client);
424 Socket client_socket(client);
425 m_send_trans.clear();
426 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
427 m_send_trans.put_data((uint32) context);
429 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
430 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
432 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
433 m_send_trans.put_data((uint32)item);
434 m_send_trans.write_to_socket(client_socket);
437 void associate_table_page_up(int client, uint32 context) {
438 LOGD ("client id:%d\n", client);
440 Socket client_socket(client);
441 m_send_trans.clear();
442 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
443 m_send_trans.put_data((uint32) context);
445 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
446 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
448 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
449 m_send_trans.write_to_socket(client_socket);
452 void associate_table_page_down(int client, uint32 context) {
453 LOGD ("client id:%d\n", client);
455 Socket client_socket(client);
456 m_send_trans.clear();
457 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
458 m_send_trans.put_data((uint32) context);
460 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
461 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
463 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
464 m_send_trans.write_to_socket(client_socket);
467 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
468 LOGD ("client id:%d\n", client);
470 Socket client_socket(client);
471 m_send_trans.clear();
472 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
473 m_send_trans.put_data((uint32) context);
475 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
476 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
478 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
479 m_send_trans.put_data(size);
480 m_send_trans.write_to_socket(client_socket);
483 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
484 LOGD ("client id:%d\n", client);
486 Socket client_socket(client);
487 m_send_trans.clear();
488 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
489 m_send_trans.put_data((uint32) context);
491 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
492 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
494 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
495 m_send_trans.put_data(size);
496 m_send_trans.write_to_socket(client_socket);
499 void send_longpress_event(int client, uint32 context, int index) {
500 LOGD ("client id:%d\n", client);
502 Socket client_socket(client);
503 m_send_trans.clear();
504 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
505 m_send_trans.put_data((uint32) context);
507 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
508 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
510 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
511 m_send_trans.put_data(index);
512 m_send_trans.write_to_socket(client_socket);
515 void trigger_property(int client, uint32 context, const String& property) {
516 LOGD ("client id:%d\n", client);
518 Socket client_socket(client);
519 m_send_trans.clear();
520 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
521 m_send_trans.put_data((uint32) context);
523 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
524 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
526 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
527 m_send_trans.put_data(property);
528 m_send_trans.write_to_socket(client_socket);
531 void focus_out_helper(int client, uint32 context, const String& uuid) {
532 LOGD ("client id:%d\n", client);
534 Socket client_socket(client);
535 m_send_trans.clear();
536 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
537 m_send_trans.put_data(context);
538 m_send_trans.put_data(uuid);
539 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
540 m_send_trans.write_to_socket(client_socket);
543 void focus_in_helper(int client, uint32 context, const String& uuid) {
544 LOGD ("client id:%d\n", client);
546 Socket client_socket(client);
547 m_send_trans.clear();
548 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
549 m_send_trans.put_data(context);
550 m_send_trans.put_data(uuid);
551 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
552 m_send_trans.write_to_socket(client_socket);
555 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
556 LOGD ("client id:%d\n", client);
558 Socket client_socket(client);
560 aul_wakeup_ime_application(client_socket.get_id());
562 m_send_trans.clear();
563 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
564 m_send_trans.put_data(context);
565 m_send_trans.put_data(uuid);
566 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
567 m_send_trans.put_data(data, len);
568 m_send_trans.write_to_socket(client_socket);
571 void hide_helper(int client, uint32 context, const String& uuid) {
572 LOGD ("client id:%d\n", client);
574 Socket client_socket(client);
575 m_send_trans.clear();
576 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
577 m_send_trans.put_data(context);
578 m_send_trans.put_data(uuid);
579 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
580 m_send_trans.write_to_socket(client_socket);
583 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
584 LOGD ("client id:%d\n", client);
586 Socket client_socket(client);
587 m_send_trans.clear();
588 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
589 m_send_trans.put_data(context);
590 m_send_trans.put_data(uuid);
591 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
592 m_send_trans.put_data(mode);
593 m_send_trans.write_to_socket(client_socket);
596 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
597 LOGD ("client id:%d\n", client);
599 Socket client_socket(client);
600 m_send_trans.clear();
601 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
602 m_send_trans.put_data(context);
603 m_send_trans.put_data(uuid);
604 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
605 m_send_trans.put_data(language);
606 m_send_trans.write_to_socket(client_socket);
609 void set_helper_imdata(int client, uint32 context, const String& uuid, const char* imdata, size_t& len) {
610 LOGD ("client id:%d\n", client);
612 Socket client_socket(client);
613 m_send_trans.clear();
614 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
615 m_send_trans.put_data(context);
616 m_send_trans.put_data(uuid);
617 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
618 m_send_trans.put_data(imdata, len);
619 m_send_trans.write_to_socket(client_socket);
622 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
623 LOGD ("client id:%d\n", client);
625 Socket client_socket(client);
626 m_send_trans.clear();
627 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
628 m_send_trans.put_data(context);
629 m_send_trans.put_data(uuid);
630 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
631 m_send_trans.put_data(type);
632 m_send_trans.write_to_socket(client_socket);
635 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
636 LOGD ("client id:%d\n", client);
638 Socket client_socket(client);
641 trans.put_command(SCIM_TRANS_CMD_REPLY);
642 trans.put_data(context);
643 trans.put_data(uuid);
644 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
648 if (trans.write_to_socket(client_socket)
649 && trans.read_from_socket(client_socket)
650 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
651 && trans.get_data(type)) {
652 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
655 LOGW ("read failed\n");
659 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
660 LOGD ("client id:%d\n", client);
662 Socket client_socket(client);
663 m_send_trans.clear();
664 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
665 m_send_trans.put_data(context);
666 m_send_trans.put_data(uuid);
667 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
668 m_send_trans.put_data(disabled);
669 m_send_trans.write_to_socket(client_socket);
672 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
674 Socket client_socket(client);
675 LOGD ("client id:%d", client);
680 trans.put_command(SCIM_TRANS_CMD_REPLY);
681 trans.put_data(context);
682 trans.put_data(uuid);
683 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
687 if (trans.write_to_socket(client_socket)
688 && trans.read_from_socket(client_socket)
689 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
690 && trans.get_data(disabled)) {
691 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
694 LOGW ("read failed");
698 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
699 LOGD ("client id:%d\n", client);
701 Socket client_socket(client);
702 m_send_trans.clear();
703 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
704 m_send_trans.put_data(context);
705 m_send_trans.put_data(uuid);
706 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
707 m_send_trans.put_data(layout);
708 m_send_trans.write_to_socket(client_socket);
711 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
712 LOGD ("client id:%d\n", client);
714 Socket client_socket(client);
715 m_send_trans.clear();
716 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
717 m_send_trans.put_data(context);
718 m_send_trans.put_data(uuid);
719 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
720 m_send_trans.put_data(mode);
721 m_send_trans.write_to_socket(client_socket);
724 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
725 LOGD ("client id:%d\n", client);
727 Socket client_socket(client);
728 m_send_trans.clear();
729 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
730 m_send_trans.put_data(context);
731 m_send_trans.put_data(uuid);
732 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
733 m_send_trans.put_data(hint);
734 m_send_trans.write_to_socket(client_socket);
737 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
738 LOGD ("client id:%d\n", client);
740 Socket client_socket(client);
741 m_send_trans.clear();
742 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
743 m_send_trans.put_data(context);
744 m_send_trans.put_data(uuid);
745 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
746 m_send_trans.put_data(direction);
747 m_send_trans.write_to_socket(client_socket);
750 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
751 LOGD ("client id:%d\n", client);
753 Socket client_socket(client);
754 m_send_trans.clear();
755 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
756 m_send_trans.put_data(context);
757 m_send_trans.put_data(uuid);
758 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
759 m_send_trans.put_data(mode);
760 m_send_trans.write_to_socket(client_socket);
763 void show_helper_option_window(int client, uint32 context, const String& uuid) {
764 LOGD ("client id:%d\n", client);
766 Socket client_socket(client);
768 aul_wakeup_ime_application(client_socket.get_id());
770 m_send_trans.clear();
771 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
772 m_send_trans.put_data(context);
773 m_send_trans.put_data(uuid);
774 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
775 m_send_trans.write_to_socket(client_socket);
778 void resume_helper_option_window(int client, uint32 context, const String& uuid) {
779 LOGD ("client id:%d\n", client);
781 Socket client_socket(client);
783 aul_wakeup_ime_application(client_socket.get_id());
785 m_send_trans.clear();
786 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
787 m_send_trans.put_data(context);
788 m_send_trans.put_data(uuid);
789 m_send_trans.put_command(ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW);
790 m_send_trans.write_to_socket(client_socket);
793 void set_helper_keyboard_mode(int client, uint32 context, const String& uuid, uint32& mode) {
794 LOGD ("client id:%d\n", client);
796 Socket client_socket(client);
797 m_send_trans.clear();
798 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
799 m_send_trans.put_data(context);
800 m_send_trans.put_data(uuid);
801 m_send_trans.put_command(ISM_TRANS_CMD_SET_KEYBOARD_MODE);
802 m_send_trans.put_data(mode);
803 m_send_trans.write_to_socket(client_socket);
806 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) {
807 LOGD ("client id:%d\n", client);
809 Socket client_socket(client);
814 trans.put_command(SCIM_TRANS_CMD_REPLY);
815 trans.put_data(context);
816 trans.put_data(uuid);
817 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
819 trans.put_data(serial);
821 if (trans.write_to_socket(client_socket)) {
822 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
825 LOGW ("read failed\n");
831 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
832 LOGD ("client id:%d\n", client);
834 Socket client_socket(client);
838 trans.put_command(SCIM_TRANS_CMD_REPLY);
839 trans.put_data(context);
840 trans.put_data(uuid);
841 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
843 if (trans.write_to_socket(client_socket)) {
848 if (trans.read_from_socket(client_socket)
849 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
850 && trans.get_data(info.pos_x)
851 && trans.get_data(info.pos_y)
852 && trans.get_data(info.width)
853 && trans.get_data(info.height)) {
854 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
857 LOGW ("read failed\n");
859 LOGW ("write failed\n");
864 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
865 LOGD ("client id:%d\n", client);
866 Socket client_socket(client);
870 trans.put_command(SCIM_TRANS_CMD_REPLY);
871 trans.put_data(context);
872 trans.put_data(uuid);
873 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
877 if (trans.write_to_socket(client_socket)
878 && trans.read_from_socket(client_socket)
879 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY) {
880 trans.get_data(imdata, len);
881 LOGD ("length of imdata is %d", len);
883 LOGW ("read imdata failed\n");
887 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
888 LOGD ("client id:%d\n", client);
890 Socket client_socket(client);
894 trans.put_command(SCIM_TRANS_CMD_REPLY);
895 trans.put_data(context);
896 trans.put_data(uuid);
897 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
901 if (trans.write_to_socket(client_socket)
902 && trans.read_from_socket(client_socket)
903 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
904 && trans.get_data(layout)) {
905 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
910 void get_ise_language_locale(int client, uint32 context, String& uuid, char** data, size_t& len) {
911 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
912 LOGD ("client id:%d\n", client);
917 trans.put_command(SCIM_TRANS_CMD_REPLY);
918 trans.put_data(context);
919 trans.put_data(uuid);
920 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
923 Socket client_socket(client);
925 if (trans.write_to_socket(client_socket)
926 && trans.read_from_socket(client_socket)
927 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
928 && trans.get_data(data, len)) {
934 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
935 LOGD ("client id:%d\n", client);
938 Socket client_socket(client);
943 trans.put_command(SCIM_TRANS_CMD_REPLY);
944 trans.put_data(context);
945 trans.put_data(uuid);
946 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
947 trans.write_to_socket(client_socket);
949 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
950 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
951 !trans.get_data(avail)) {
952 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed\n");
956 void reset_ise_option(int client, uint32 context) {
957 LOGD ("client id:%d\n", client);
959 Socket client_socket(client);
960 m_send_trans.clear();
961 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
962 m_send_trans.put_data((uint32) context);
963 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
964 m_send_trans.write_to_socket(client_socket);
967 void reset_helper_context(int client, uint32 context, const String& uuid) {
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(context);
974 m_send_trans.put_data(uuid);
975 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
976 m_send_trans.write_to_socket(client_socket);
979 void reload_config(int client) {
980 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
981 LOGD ("client id:%d\n", client);
983 m_send_trans.clear();
984 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
985 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
987 Socket client_socket(client);
988 m_send_trans.write_to_socket(client_socket);
991 void exit(int client, uint32 context) {
992 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
993 LOGD ("client id:%d\n", client);
995 m_send_trans.clear();
996 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
998 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
999 m_send_trans.put_data(context);
1000 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
1003 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
1005 Socket client_socket(client);
1006 m_send_trans.write_to_socket(client_socket);
1009 bool process_input_device_event(int client, uint32 context, const String& uuid, uint32 type, const char *data, size_t len, _OUT_ uint32& result) {
1010 LOGD("client id:%d\n", client);
1012 Socket client_socket(client);
1017 trans.put_command(SCIM_TRANS_CMD_REPLY);
1018 trans.put_data(context);
1019 trans.put_data(uuid);
1020 trans.put_command(ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT);
1021 trans.put_data(type);
1022 trans.put_data(data, len);
1025 if (trans.write_to_socket(client_socket)
1026 && trans.read_from_socket(client_socket)
1027 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1028 && trans.get_data(result)) {
1029 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
1033 LOGW("read failed\n");
1039 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
1040 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1041 LOGD ("client id:%d\n", client);
1043 Socket client_socket(client);
1045 m_send_trans.clear();
1046 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1047 m_send_trans.put_data(context);
1048 m_send_trans.put_data(uuid);
1049 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
1050 m_send_trans.put_data(text);
1051 m_send_trans.put_data(cursor);
1052 m_send_trans.write_to_socket(client_socket);
1054 m_send_trans.clear();
1055 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1056 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1057 m_send_trans.write_to_socket(client_socket);
1060 void socket_remoteinput_focus_in (int client) {
1061 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1062 LOGD ("client id:%d\n", client);
1065 ret = (client == -1) ? false : true;
1068 Socket client_socket(client);
1070 m_send_trans.clear();
1071 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1072 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_IN);
1073 m_send_trans.write_to_socket(client_socket);
1077 void socket_remoteinput_focus_out (int client) {
1078 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1079 LOGD ("client id:%d\n", client);
1082 ret = (client == -1) ? false : true;
1085 Socket client_socket(client);
1087 m_send_trans.clear();
1088 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1089 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_FOCUS_OUT);
1090 m_send_trans.write_to_socket(client_socket);
1094 void socket_remoteinput_entry_metadata (int client, uint32 hint, uint32 layout, int variation, uint32 autocapital_type, int return_key_disabled) {
1095 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1096 LOGD ("client id:%d\n", client);
1099 ret = (client == -1) ? false : true;
1102 Socket client_socket(client);
1104 m_send_trans.clear();
1105 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1106 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_ENTRY_METADATA);
1107 m_send_trans.put_data(hint);
1108 m_send_trans.put_data(layout);
1109 m_send_trans.put_data(variation);
1110 m_send_trans.put_data(autocapital_type);
1111 m_send_trans.put_data(return_key_disabled);
1112 m_send_trans.write_to_socket(client_socket);
1116 void socket_remoteinput_surrounding_text (int client, String& text, uint32 cursor) {
1117 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1118 LOGD ("client id:%d\n", client);
1121 ret = (client == -1) ? false : true;
1124 Socket client_socket(client);
1126 m_send_trans.clear();
1127 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1128 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT);
1129 m_send_trans.put_data(text);
1130 m_send_trans.put_data(cursor);
1131 m_send_trans.write_to_socket(client_socket);
1135 void socket_remoteinput_input_resource (int client, uint32 input_resource) {
1136 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
1137 LOGD ("client id:%d\n", client);
1140 ret = (client == -1) ? false : true;
1143 Socket client_socket(client);
1145 m_send_trans.clear();
1146 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1147 m_send_trans.put_command(ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE);
1148 m_send_trans.put_data(input_resource);
1149 m_send_trans.write_to_socket(client_socket);
1153 void socket_update_selection(int client, uint32 context, String& uuid, String text) {
1154 LOGD ("client id:%d\n", client);
1156 Socket client_socket(client);
1158 m_send_trans.clear();
1159 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1160 m_send_trans.put_data(context);
1161 m_send_trans.put_data(uuid);
1162 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
1163 m_send_trans.put_data(text);
1164 m_send_trans.write_to_socket(client_socket);
1166 m_send_trans.clear();
1167 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1168 m_send_trans.put_command(ISM_TRANS_CMD_FLUSH_BUFFER);
1169 m_send_trans.write_to_socket(client_socket);
1172 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
1173 LOGD ("client id:%d\n", client);
1175 Socket socket_client(client);
1176 m_send_trans.clear();
1177 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1178 m_send_trans.put_data(context);
1179 m_send_trans.put_data(uuid);
1180 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1181 m_send_trans.put_data(list.size());
1183 for (unsigned int i = 0; i < list.size(); i++)
1184 m_send_trans.put_data(list[i]);
1186 m_send_trans.write_to_socket(socket_client);
1189 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1190 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1192 LOGD ("client id:%d\n", client);
1194 Socket socket_client(client);
1195 m_send_trans.clear();
1196 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1197 m_send_trans.put_data(context);
1198 m_send_trans.put_data(uuid);
1199 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1200 m_send_trans.put_data(style);
1201 m_send_trans.put_data(mode);
1202 m_send_trans.write_to_socket(socket_client);
1205 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1206 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1208 LOGD ("client id:%d\n", client);
1210 Socket socket_client(client);
1211 m_send_trans.clear();
1212 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1213 m_send_trans.put_data(context);
1214 m_send_trans.put_data(uuid);
1215 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1216 m_send_trans.put_data(info.pos_x);
1217 m_send_trans.put_data(info.pos_y);
1218 m_send_trans.put_data(info.width);
1219 m_send_trans.put_data(info.height);
1220 m_send_trans.write_to_socket(socket_client);
1223 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1224 LOGD ("client id:%d\n", client);
1226 Socket socket_client(client);
1227 m_send_trans.clear();
1228 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1229 m_send_trans.put_data(context);
1230 m_send_trans.put_data(uuid);
1231 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1232 m_send_trans.put_data(ise_name);
1233 m_send_trans.put_data(ise_uuid);
1234 m_send_trans.write_to_socket(socket_client);
1237 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1238 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1240 LOGD ("client id:%d\n", client);
1242 Socket client_socket(client);
1243 m_send_trans.clear();
1244 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1245 m_send_trans.put_data(context);
1246 m_send_trans.put_data(ic_uuid);
1247 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1248 m_send_trans.write_to_socket(client_socket);
1251 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1252 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1254 LOGD ("client id:%d\n", client);
1256 Socket client_socket(client);
1257 m_send_trans.clear();
1258 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1259 m_send_trans.put_data(context);
1260 m_send_trans.put_data(ic_uuid);
1261 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1262 m_send_trans.write_to_socket(client_socket);
1265 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1266 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1267 LOGD ("client id:%d\n", client);
1269 Socket client_socket(client);
1273 m_send_trans.clear();
1274 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1276 /* FIXME: We presume that client and context are both less than 65536.
1277 * Hopefully, it should be true in any UNIXs.
1278 * So it's ok to combine client and context into one uint32. */
1279 m_send_trans.put_data(context);
1280 m_send_trans.put_data(ic_uuid);
1281 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1282 m_send_trans.put_data(_nest_trans);
1283 m_send_trans.write_to_socket(client_socket);
1288 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1289 LOGD ("client id:%d\n", client);
1291 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1292 Socket socket_client(client);
1294 m_send_trans.clear();
1295 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1296 m_send_trans.put_data(context);
1297 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1298 m_send_trans.put_data(target_uuid);
1299 m_send_trans.put_data(active_uuid);
1300 m_send_trans.put_data(nest_trans);
1301 m_send_trans.write_to_socket(socket_client);
1306 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1307 LOGD ("client id:%d\n", client);
1309 Socket socket_client(client);
1311 m_send_trans.clear();
1312 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1313 m_send_trans.put_data(context);
1314 m_send_trans.put_command(cmd);
1315 m_send_trans.put_data(key);
1316 m_send_trans.write_to_socket(socket_client);
1320 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1321 LOGD ("client id:%d\n", client);
1323 Socket socket_client(client);
1325 m_send_trans.clear();
1326 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1327 m_send_trans.put_data(target_context);
1328 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1329 m_send_trans.put_data(wstr);
1330 m_send_trans.write_to_socket(socket_client);
1334 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1335 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1336 LOGD ("client id:%d\n", client);
1338 Socket socket_client(client);
1340 m_send_trans.clear();
1341 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1342 m_send_trans.put_data(context_id);
1343 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1344 m_send_trans.put_data(maxlen_before);
1345 m_send_trans.put_data(maxlen_after);
1346 m_send_trans.write_to_socket(socket_client);
1350 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1351 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1352 LOGD ("client id:%d\n", client);
1354 Socket socket_client(client);
1356 m_send_trans.clear();
1357 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1358 m_send_trans.put_data(context_id);
1359 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1360 m_send_trans.put_data(offset);
1361 m_send_trans.put_data(len);
1362 m_send_trans.write_to_socket(socket_client);
1366 void socket_helper_get_selection(int client, uint32 context_id) {
1367 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1368 LOGD ("client id:%d\n", client);
1371 Socket socket_client(client);
1373 m_send_trans.clear();
1374 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1375 m_send_trans.put_data(context_id);
1376 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1377 m_send_trans.write_to_socket(socket_client);
1381 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1382 LOGD ("client id:%d\n", client);
1384 Socket socket_client(client);
1386 m_send_trans.clear();
1387 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1388 m_send_trans.put_data(context_id);
1389 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1390 m_send_trans.put_data(start);
1391 m_send_trans.put_data(end);
1392 m_send_trans.write_to_socket(socket_client);
1396 void show_preedit_string(int client, uint32 target_context) {
1397 LOGD ("client id:%d\n", client);
1399 Socket socket_client(client);
1401 m_send_trans.clear();
1402 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1403 m_send_trans.put_data(target_context);
1404 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1405 m_send_trans.write_to_socket(socket_client);
1409 void hide_preedit_string(int client, uint32 target_context) {
1410 LOGD ("client id:%d\n", client);
1412 Socket socket_client(client);
1414 m_send_trans.clear();
1415 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1416 m_send_trans.put_data(target_context);
1417 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1418 m_send_trans.write_to_socket(socket_client);
1422 void update_preedit_string(int client, uint32 target_context, WideString preedit, WideString commit, AttributeList& attrs, uint32 caret) {
1423 LOGD ("client id:%d\n", client);
1425 Socket socket_client(client);
1427 m_send_trans.clear();
1428 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1429 m_send_trans.put_data(target_context);
1430 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1431 m_send_trans.put_data(preedit);
1432 m_send_trans.put_data(commit);
1433 m_send_trans.put_data(attrs);
1434 m_send_trans.put_data(caret);
1435 m_send_trans.write_to_socket(socket_client);
1440 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1442 LOGD ("client id:%d\n", client);
1444 Socket socket_client(client);
1446 m_send_trans.clear();
1447 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1448 m_send_trans.put_data(focused_context);
1449 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1450 m_send_trans.put_data(caret);
1451 m_send_trans.write_to_socket(socket_client);
1456 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1457 LOGD ("client id:%d\n", client);
1459 Socket socket_client(client);
1460 m_send_trans.clear();
1461 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1462 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1463 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1465 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1466 m_send_trans.put_data(helper_ic_index[i].first);
1467 m_send_trans.put_data(helper_ic_index[i].second);
1470 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1471 m_send_trans.put_data((uint32)current_screen);
1472 m_send_trans.write_to_socket(socket_client);
1475 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1476 LOGD ("client id:%d\n", client);
1478 Socket client_socket(client);
1479 m_send_trans.clear();
1480 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1481 m_send_trans.put_data(focused_context);
1482 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1483 m_send_trans.put_data(type);
1484 m_send_trans.put_data(value);
1485 m_send_trans.write_to_socket(client_socket);
1489 void send_private_command(int client, uint32 focused_context, String command) {
1490 LOGD ("client id:%d\n", client);
1492 Socket socket_client(client);
1494 m_send_trans.clear();
1495 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1496 m_send_trans.put_data(focused_context);
1497 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1498 m_send_trans.put_data(command);
1499 m_send_trans.write_to_socket(socket_client);
1503 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1504 LOGD ("client id:%d\n", client);
1506 m_send_trans.clear();
1507 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1509 /* FIXME: We presume that client and context are both less than 65536.
1510 * Hopefully, it should be true in any UNIXs.
1511 * So it's ok to combine client and context into one uint32. */
1512 m_send_trans.put_data(context_id);
1513 m_send_trans.put_data(uuid);
1514 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1515 m_send_trans.put_data((uint32) x);
1516 m_send_trans.put_data((uint32) y);
1518 Socket client_socket(client);
1519 m_send_trans.write_to_socket(client_socket);
1523 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1524 LOGD ("client id:%d\n", client);
1526 m_send_trans.clear();
1527 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1528 m_send_trans.put_data(context_id);
1529 m_send_trans.put_data(uuid);
1530 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1531 m_send_trans.put_data((uint32) cursor_pos);
1533 Socket client_socket(client);
1534 m_send_trans.write_to_socket(client_socket);
1538 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1539 LOGD ("client id:%d\n", client);
1541 m_send_trans.clear();
1542 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1544 /* FIXME: We presume that client and context are both less than 65536.
1545 * Hopefully, it should be true in any UNIXs.
1546 * So it's ok to combine client and context into one uint32. */
1547 m_send_trans.put_data(context_id);
1548 m_send_trans.put_data(uuid);
1549 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1550 m_send_trans.put_data((uint32) screen);
1552 Socket client_socket(client);
1553 m_send_trans.write_to_socket(client_socket);
1557 void set_autocapital_type(int client, uint32 context, String uuid, int mode) {
1558 LOGD ("client id:%d\n", client);
1560 m_send_trans.clear();
1561 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1563 m_send_trans.put_data(context);
1564 m_send_trans.put_data(uuid);
1565 m_send_trans.put_command(SCIM_TRANS_CMD_SET_AUTOCAPITAL_TYPE);
1566 m_send_trans.put_data((uint32) mode);
1568 Socket client_socket(client);
1569 m_send_trans.write_to_socket(client_socket);
1572 void remote_update_preedit_string (int client, uint32 target_context, const WideString str, const WideString commit, const AttributeList &attrs, uint32 caret) {
1573 LOGD("client id:%d\n", client);
1575 Socket client_socket(client);
1577 m_send_trans.clear();
1578 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1579 m_send_trans.put_data(target_context);
1580 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1581 m_send_trans.put_data(str);
1582 m_send_trans.put_data(commit);
1583 m_send_trans.put_data(attrs);
1584 m_send_trans.put_data(caret);
1585 m_send_trans.write_to_socket(client_socket);
1589 void remote_send_key_event (int client, uint32 target_context, const KeyEvent &key) {
1590 LOGD("client id:%d\n", client);
1592 Socket client_socket(client);
1594 m_send_trans.clear ();
1595 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1596 m_send_trans.put_data (target_context);
1597 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
1598 m_send_trans.put_data (key);
1599 m_send_trans.write_to_socket (client_socket);
1603 void remote_forward_key_event (int client, uint32 target_context, const KeyEvent &key) {
1604 LOGD("client id:%d\n", client);
1606 Socket client_socket(client);
1608 m_send_trans.clear ();
1609 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1610 m_send_trans.put_data (target_context);
1611 m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
1612 m_send_trans.put_data (key);
1613 m_send_trans.write_to_socket (client_socket);
1617 void remote_commit_string (int client, uint32 target_context, const WideString& wstr) {
1618 LOGD ("client id:%d\n", client);
1620 Socket socket_client(client);
1622 m_send_trans.clear();
1623 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1624 m_send_trans.put_data(target_context);
1625 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1626 m_send_trans.put_data(wstr);
1627 m_send_trans.write_to_socket(socket_client);
1631 void remote_delete_surrounding_text (int client, uint32 context_id, uint32 offset, uint32 len) {
1632 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1633 LOGD ("client id:%d\n", client);
1635 Socket socket_client(client);
1637 m_send_trans.clear();
1638 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1639 m_send_trans.put_data(context_id);
1640 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1641 m_send_trans.put_data(offset);
1642 m_send_trans.put_data(len);
1643 m_send_trans.write_to_socket(socket_client);
1647 void set_prediction_allow (int client, uint32 context, String uuid, int mode) {
1648 LOGD ("client id:%d\n", client);
1650 m_send_trans.clear();
1651 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1653 m_send_trans.put_data(context);
1654 m_send_trans.put_data(uuid);
1655 m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_ALLOW);
1656 m_send_trans.put_data((uint32) mode);
1658 Socket client_socket(client);
1659 m_send_trans.write_to_socket(client_socket);
1662 void send_fail_reply (int client)
1664 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1665 LOGD ("client id:%d\n", client);
1667 Socket client_socket (client);
1670 trans.put_command (SCIM_TRANS_CMD_REPLY);
1671 trans.put_command (SCIM_TRANS_CMD_FAIL);
1672 trans.write_to_socket (client_socket);
1677 bool filter_event(int fd) {
1678 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1680 return m_socket_server.filter_event(fd);
1683 bool filter_exception_event(int fd) {
1684 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1686 return m_socket_server.filter_exception_event(fd);
1689 int get_server_id() {
1690 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1692 return m_socket_server.get_id();
1695 bool socket_check_client_connection(const Socket& client) {
1696 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1698 unsigned char buf [sizeof(uint32)];
1700 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1702 if (nbytes == sizeof(uint32))
1706 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1708 LOGW ("Timeout when reading socket\n");
1715 * @brief Callback function for ecore fd handler.
1717 * @param data The data to pass to this callback.
1718 * @param fd_handler The ecore fd handler.
1720 * @return ECORE_CALLBACK_RENEW
1722 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1723 if (fd_handler == NULL || data == NULL)
1724 return ECORE_CALLBACK_RENEW;
1726 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1728 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1730 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1731 if (fd_handler == _agent->_read_handler_list [i]) {
1732 if (!_agent->filter_event(fd)) {
1733 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1735 ecore_main_fd_handler_del(fd_handler);
1737 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1740 return ECORE_CALLBACK_RENEW;
1744 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1745 _agent->filter_exception_event(fd);
1747 ecore_main_fd_handler_del(fd_handler);
1749 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1750 return ECORE_CALLBACK_RENEW;
1753 void socket_accept_callback(SocketServer* server,
1754 const Socket& client) {
1755 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1759 if (m_should_exit) {
1760 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1763 //m_signal_accept_connection (client.get_id ());
1764 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1765 _read_handler_list.push_back(panel_agent_read_handler);
1771 void socket_receive_callback(SocketServer* server,
1772 const Socket& client) {
1773 int client_id = client.get_id();
1779 ClientInfo client_info;
1781 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1783 /* If the connection is closed then close this client. */
1784 if (!socket_check_client_connection(client)) {
1785 LOGW ("check client connection failed\n");
1786 socket_close_connection(server, client);
1790 client_info = m_info_manager->socket_get_client_info(client_id);
1792 /* If it's a new client, then request to open the connection first. */
1793 if (client_info.type == UNKNOWN_CLIENT) {
1794 socket_open_connection(server, client);
1798 /* If can not read the transaction,
1799 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1800 * or the key is mismatch,
1802 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1803 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1804 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1805 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1809 if (client_info.type == FRONTEND_ACT_CLIENT) {
1810 if (m_recv_trans.get_data(context)) {
1811 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1812 socket_transaction_start();
1814 while (m_recv_trans.get_command(cmd)) {
1815 LOGD ("PanelAgent::cmd = %d\n", cmd);
1817 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1820 if (m_recv_trans.get_data(id)) {
1821 m_info_manager->register_panel_client(client_id, id);
1823 LOGW ("wrong format of transaction\n");
1829 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1830 if (m_recv_trans.get_data(uuid)) {
1831 m_info_manager->register_input_context(client_id, context, uuid);
1833 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);
1844 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1845 m_info_manager->socket_reset_input_context(client_id, context);
1849 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1850 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1852 if (m_recv_trans.get_data(uuid)) {
1853 m_info_manager->focus_in(client_id, context, uuid);
1855 LOGW ("wrong format of transaction\n");
1861 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1864 if (m_recv_trans.get_data(isOn)) {
1865 m_info_manager->socket_turn_on_log(isOn);
1867 LOGW ("wrong format of transaction\n");
1873 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1874 m_info_manager->show_isf_panel(client_id);
1876 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1877 m_info_manager->hide_isf_panel(client_id);
1879 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1886 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1889 LOGW ("wrong format of transaction\n");
1893 Socket client_socket(client_id);
1896 trans.put_command(SCIM_TRANS_CMD_REPLY);
1897 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1898 trans.put_data(ret);
1899 trans.write_to_socket(client_socket);
1905 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1908 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1912 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1913 m_info_manager->hide_ise_panel(client_id, client, context);
1915 LOGW ("wrong format of transaction\n");
1919 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1920 struct rectinfo info;
1921 m_info_manager->get_input_panel_geometry(client_id, info);
1923 Socket client_socket(client_id);
1926 trans.put_command(SCIM_TRANS_CMD_REPLY);
1927 trans.put_command(SCIM_TRANS_CMD_OK);
1928 trans.put_data(info.pos_x);
1929 trans.put_data(info.pos_y);
1930 trans.put_data(info.width);
1931 trans.put_data(info.height);
1932 trans.write_to_socket(client_socket);
1934 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1935 struct rectinfo info;
1936 m_info_manager->get_candidate_window_geometry(client_id, info);
1938 Socket client_socket(client_id);
1941 trans.put_command(SCIM_TRANS_CMD_REPLY);
1942 trans.put_command(SCIM_TRANS_CMD_OK);
1943 trans.put_data(info.pos_x);
1944 trans.put_data(info.pos_y);
1945 trans.put_data(info.width);
1946 trans.put_data(info.height);
1947 trans.write_to_socket(client_socket);
1949 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1952 m_info_manager->get_ise_language_locale(client_id, &data, len);
1955 trans.put_command(SCIM_TRANS_CMD_REPLY);
1957 if (data != NULL && len > 0) {
1958 trans.put_command(SCIM_TRANS_CMD_OK);
1959 trans.put_data(data, len);
1961 trans.put_command(SCIM_TRANS_CMD_FAIL);
1964 Socket client_socket(client_id);
1965 trans.write_to_socket(client_socket);
1971 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1974 if (m_recv_trans.get_data(language)) {
1975 m_info_manager->set_ise_language(client_id, language);
1977 LOGW ("wrong format of transaction\n");
1981 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1982 char* imdata = NULL;
1985 if (m_recv_trans.get_data(&imdata, len)) {
1986 m_info_manager->set_ise_imdata(client_id, imdata, len);
1988 LOGW ("wrong format of transaction\n");
1995 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1996 char* imdata = NULL;
1998 m_info_manager->get_ise_imdata(client_id, &imdata, len);
2000 Socket client_socket(client_id);
2003 trans.put_command(SCIM_TRANS_CMD_REPLY);
2006 trans.put_command(SCIM_TRANS_CMD_OK);
2007 trans.put_data(imdata, len);
2009 trans.put_command(SCIM_TRANS_CMD_FAIL);
2012 trans.write_to_socket(client_socket);
2018 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
2021 if (m_recv_trans.get_data(type)) {
2022 m_info_manager->set_ise_return_key_type(client_id, type);
2024 LOGW ("wrong format of transaction\n");
2028 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
2030 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
2032 Socket client_socket(client_id);
2035 trans.put_command(SCIM_TRANS_CMD_REPLY);
2038 trans.put_command(SCIM_TRANS_CMD_OK);
2039 trans.put_data(type);
2041 trans.put_command(SCIM_TRANS_CMD_FAIL);
2044 trans.write_to_socket(client_socket);
2046 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
2049 if (m_recv_trans.get_data(disabled)) {
2050 m_info_manager->set_ise_return_key_disable(client_id, disabled);
2052 LOGW ("wrong format of transaction\n");
2056 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
2059 m_info_manager->get_ise_return_key_disable(client_id, disabled);
2061 Socket client_socket(client_id);
2064 trans.put_command(SCIM_TRANS_CMD_REPLY);
2067 trans.put_command(SCIM_TRANS_CMD_OK);
2068 trans.put_data(disabled);
2070 trans.put_command(SCIM_TRANS_CMD_FAIL);
2073 trans.write_to_socket(client_socket);
2075 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
2077 bool ret = m_info_manager->get_ise_layout(client_id, layout);
2079 Socket client_socket(client_id);
2082 trans.put_command(SCIM_TRANS_CMD_REPLY);
2085 trans.put_command(SCIM_TRANS_CMD_OK);
2086 trans.put_data(layout);
2088 trans.put_command(SCIM_TRANS_CMD_FAIL);
2091 trans.write_to_socket(client_socket);
2093 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
2096 if (m_recv_trans.get_data(layout)) {
2097 m_info_manager->set_ise_layout(client_id, layout);
2099 LOGW ("wrong format of transaction\n");
2103 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
2106 if (m_recv_trans.get_data(mode)) {
2107 m_info_manager->set_ise_caps_mode(client_id, mode);
2109 LOGW ("wrong format of transaction\n");
2113 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
2114 m_info_manager->will_show_ack(client_id);
2116 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
2117 m_info_manager->will_hide_ack(client_id);
2119 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
2122 if (m_recv_trans.get_data(mode)) {
2123 m_info_manager->set_keyboard_mode(client_id, mode);
2125 LOGW ("wrong format of transaction\n");
2129 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
2130 m_info_manager->candidate_will_hide_ack(client_id);
2132 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
2138 if (m_recv_trans.get_data(key)) {
2140 m_info_manager->process_key_event(key, result);
2142 LOGW ("wrong format of transaction\n");
2146 Socket client_socket(client_id);
2149 trans.put_command(SCIM_TRANS_CMD_REPLY);
2152 trans.put_command(SCIM_TRANS_CMD_OK);
2153 trans.put_data(result);
2155 trans.put_command(SCIM_TRANS_CMD_FAIL);
2158 trans.write_to_socket(client_socket);
2160 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
2162 m_info_manager->get_active_helper_option(client_id, option);
2164 Socket client_socket(client_id);
2167 trans.put_command(SCIM_TRANS_CMD_REPLY);
2168 trans.put_command(SCIM_TRANS_CMD_OK);
2169 trans.put_data(option);
2170 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
2171 trans.write_to_socket(client_socket);
2173 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
2175 m_info_manager->get_ise_state(client_id, state);
2177 Socket client_socket(client_id);
2180 trans.put_command(SCIM_TRANS_CMD_REPLY);
2181 trans.put_command(SCIM_TRANS_CMD_OK);
2182 trans.put_data(state);
2183 trans.write_to_socket(client_socket);
2185 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
2188 if (m_recv_trans.get_data(input_mode)) {
2189 m_info_manager->set_ise_input_mode(client_id, input_mode);
2191 LOGW ("wrong format of transaction\n");
2195 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
2198 if (m_recv_trans.get_data(input_hint)) {
2199 m_info_manager->set_ise_input_hint(client_id, input_hint);
2201 LOGW ("wrong format of transaction\n");
2205 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
2206 uint32 bidi_direction;
2208 if (m_recv_trans.get_data(bidi_direction)) {
2209 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
2211 LOGW ("wrong format of transaction\n");
2215 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2216 m_info_manager->show_ise_option_window(client_id);
2218 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
2219 m_info_manager->resume_ise_option_window(client_id);
2226 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
2229 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2230 m_info_manager->socket_start_helper(client_id, context, uuid);
2232 LOGW ("wrong format of transaction\n");
2236 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
2239 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
2240 uuid.length() && m_nest_trans.valid()) {
2241 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
2243 LOGW ("wrong format of transaction\n");
2247 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
2250 if (m_recv_trans.get_data(uuid) && uuid.length()) {
2251 m_info_manager->socket_stop_helper(client_id, context, uuid);
2253 LOGW ("wrong format of transaction\n");
2262 /* Client must focus in before do any other things. */
2263 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
2264 m_info_manager->socket_turn_on();
2265 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
2266 m_info_manager->socket_turn_off();
2267 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
2270 if (m_recv_trans.get_data(num))
2271 m_info_manager->socket_update_screen(client_id, num);
2273 LOGW ("wrong format of transaction\n");
2274 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
2277 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
2278 m_info_manager->socket_update_spot_location(x, y, top_y);
2280 LOGW ("wrong format of transaction\n");
2282 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
2285 if (m_recv_trans.get_data(cursor_pos)) {
2286 m_info_manager->socket_update_cursor_position(cursor_pos);
2288 LOGW ("wrong format of transaction\n");
2290 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2294 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2295 m_info_manager->socket_update_surrounding_text(text, cursor);
2297 LOGW ("wrong format of transaction\n");
2299 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2302 if (m_recv_trans.get_data(text)) {
2303 m_info_manager->socket_update_selection(text);
2305 LOGW ("wrong format of transaction\n");
2307 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2308 m_info_manager->expand_candidate();
2309 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2310 m_info_manager->contract_candidate();
2311 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2312 uint32 portrait_line, mode;
2314 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2315 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2317 LOGW ("wrong format of transaction\n");
2318 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2319 PanelFactoryInfo info;
2321 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2322 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2323 m_info_manager->socket_update_factory_info(info);
2325 LOGW ("wrong format of transaction\n");
2327 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2328 m_info_manager->socket_show_preedit_string();
2329 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2330 m_info_manager->socket_show_aux_string();
2331 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2332 m_info_manager->socket_show_lookup_table();
2333 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2334 m_info_manager->socket_show_associate_table();
2335 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2336 m_info_manager->socket_hide_preedit_string();
2337 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2338 m_info_manager->socket_hide_aux_string();
2339 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2340 m_info_manager->socket_hide_lookup_table();
2341 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2342 m_info_manager->socket_hide_associate_table();
2343 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2345 AttributeList attrs;
2348 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2349 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2351 LOGW ("wrong format of transaction\n");
2352 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2355 if (m_recv_trans.get_data(caret))
2356 m_info_manager->socket_update_preedit_caret(caret);
2358 LOGW ("wrong format of transaction\n");
2359 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2361 AttributeList attrs;
2363 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2364 m_info_manager->socket_update_aux_string(str, attrs);
2366 LOGW ("wrong format of transaction\n");
2367 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2374 AttributeList attrs;
2376 if (m_recv_trans.get_data(target_ic) &&
2377 m_recv_trans.get_data(target_uuid) &&
2378 m_recv_trans.get_data(offset) &&
2379 m_recv_trans.get_data(len) &&
2380 m_recv_trans.get_data(preedit) &&
2381 m_recv_trans.get_data(commit) &&
2382 m_recv_trans.get_data(attrs)) {
2383 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2385 LOGW ("wrong format of transaction\n");
2387 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2388 CommonLookupTable _isf_candidate_table;
2390 if (m_recv_trans.get_data(_isf_candidate_table))
2391 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2393 LOGW ("wrong format of transaction\n");
2395 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2396 CommonLookupTable table;
2398 if (m_recv_trans.get_data(table))
2399 m_info_manager->socket_update_associate_table(table);
2401 LOGW ("wrong format of transaction\n");
2402 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2403 PropertyList properties;
2405 if (m_recv_trans.get_data(properties))
2406 m_info_manager->socket_register_properties(properties);
2408 LOGW ("wrong format of transaction\n");
2409 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2412 if (m_recv_trans.get_data(property))
2413 m_info_manager->socket_update_property(property);
2415 LOGW ("wrong format of transaction\n");
2416 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2419 if (m_recv_trans.get_data(help))
2420 m_info_manager->socket_show_help(help);
2422 LOGW ("wrong format of transaction\n");
2423 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2424 PanelFactoryInfo info;
2425 std::vector <PanelFactoryInfo> vec;
2427 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2428 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2429 info.lang = scim_get_normalized_language(info.lang);
2430 vec.push_back(info);
2433 m_info_manager->socket_show_factory_menu(vec);
2434 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2435 m_info_manager->focus_out(client_id, context);
2437 LOGW ("unknown cmd: %d\n", cmd);
2441 socket_transaction_end();
2443 } else if (client_info.type == FRONTEND_CLIENT) {
2444 if (m_recv_trans.get_data(context)) {
2445 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2446 socket_transaction_start();
2448 while (m_recv_trans.get_command(cmd)) {
2449 LOGD ("PanelAgent::cmd = %d\n", cmd);
2451 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2452 Socket client_socket(client_id);
2456 trans.put_command(SCIM_TRANS_CMD_REPLY);
2457 trans.put_command(SCIM_TRANS_CMD_OK);
2458 trans.put_data(client_id);
2459 trans.write_to_socket(client_socket);
2462 LOGW ("unknown cmd: %d\n", cmd);
2466 socket_transaction_end();
2468 } else if (client_info.type == HELPER_CLIENT) {
2469 socket_transaction_start();
2471 while (m_recv_trans.get_command(cmd)) {
2472 LOGD ("PanelAgent::cmd = %d\n", cmd);
2474 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2477 if (m_recv_trans.get_data(info.uuid) &&
2478 m_recv_trans.get_data(info.name) &&
2479 m_recv_trans.get_data(info.icon) &&
2480 m_recv_trans.get_data(info.description) &&
2481 m_recv_trans.get_data(info.option) &&
2482 info.uuid.length()) {
2483 m_info_manager->socket_helper_register_helper(client_id, info);
2486 LOGW ("unknown cmd: %d\n", cmd);
2490 socket_transaction_end();
2491 } else if (client_info.type == HELPER_ACT_CLIENT) {
2492 socket_transaction_start();
2494 while (m_recv_trans.get_command(cmd)) {
2495 LOGD ("PanelAgent::cmd = %d\n", cmd);
2497 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2500 if (m_recv_trans.get_data(info.uuid) &&
2501 m_recv_trans.get_data(info.name) &&
2502 m_recv_trans.get_data(info.icon) &&
2503 m_recv_trans.get_data(info.description) &&
2504 m_recv_trans.get_data(info.option) &&
2505 info.uuid.length()) {
2506 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2508 LOGW ("wrong format of transaction\n");
2511 /* Check whether application already requested the focus_in and showing input_panel
2512 * If so, Input FW request focus_in and show input_panel again to helper IME.
2513 * Because Helper IME couldn't receive these events during the launch.
2515 m_info_manager->reshow_input_panel ();
2516 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2521 if (m_recv_trans.get_data(target_ic) &&
2522 m_recv_trans.get_data(target_uuid) &&
2523 m_recv_trans.get_data(wstr) &&
2525 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2527 LOGW ("wrong format of transaction\n");
2529 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2533 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2534 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2536 LOGW ("wrong format of transaction\n");
2538 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2539 m_info_manager->socket_show_aux_string();
2540 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2541 m_info_manager->socket_show_lookup_table();
2542 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2543 m_info_manager->socket_show_associate_table();
2544 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2548 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2549 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2551 LOGW ("wrong format of transaction\n");
2553 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2554 m_info_manager->socket_hide_aux_string();
2555 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2556 m_info_manager->socket_hide_lookup_table();
2557 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2558 m_info_manager->socket_hide_associate_table();
2559 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2564 AttributeList attrs;
2567 if (m_recv_trans.get_data(target_ic) &&
2568 m_recv_trans.get_data(target_uuid) &&
2569 m_recv_trans.get_data(preedit) &&
2570 m_recv_trans.get_data(commit) &&
2571 m_recv_trans.get_data(attrs) &&
2572 m_recv_trans.get_data(caret)) {
2573 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, preedit, commit, attrs, caret);
2575 LOGW ("wrong format of transaction\n");
2577 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2580 if (m_recv_trans.get_data(caret)) {
2581 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2583 LOGW ("wrong format of transaction\n");
2585 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2587 AttributeList attrs;
2589 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2590 m_info_manager->socket_update_aux_string(str, attrs);
2592 LOGW ("wrong format of transaction\n");
2593 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2594 CommonLookupTable _isf_candidate_table;
2596 if (m_recv_trans.get_data(_isf_candidate_table)) {
2597 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2599 LOGW ("wrong format of transaction\n");
2601 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2602 CommonLookupTable _isf_candidate_table;
2604 if (m_recv_trans.get_data(_isf_candidate_table)) {
2605 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2607 LOGW ("wrong format of transaction\n");
2609 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2610 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2615 if (m_recv_trans.get_data(target_ic) &&
2616 m_recv_trans.get_data(target_uuid) &&
2617 m_recv_trans.get_data(key) &&
2619 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2621 LOGW ("wrong format of transaction\n");
2623 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2628 if (m_recv_trans.get_data(target_ic) &&
2629 m_recv_trans.get_data(target_uuid) &&
2630 m_recv_trans.get_data(key) &&
2632 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2634 LOGW ("wrong format of transaction\n");
2636 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2640 if (m_recv_trans.get_data(target_ic) &&
2641 m_recv_trans.get_data(target_uuid) &&
2642 m_recv_trans.get_data(m_nest_trans) &&
2643 m_nest_trans.valid()) {
2644 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2646 LOGW ("wrong format of transaction\n");
2648 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2649 PropertyList properties;
2651 if (m_recv_trans.get_data(properties))
2652 m_info_manager->socket_helper_register_properties(client_id, properties);
2654 LOGW ("wrong format of transaction\n");
2656 /* Check whether application already requested the focus_in and showing input_panel
2657 * If so, Input FW request focus_in and show input_panel again to helper IME.
2658 * Because Helper IME couldn't receive these events during the launch.
2660 m_info_manager->reshow_input_panel ();
2661 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2664 if (m_recv_trans.get_data(property))
2665 m_info_manager->socket_helper_update_property(client_id, property);
2667 LOGW ("wrong format of transaction\n");
2668 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2672 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2673 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2675 LOGW ("wrong format of transaction\n");
2677 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2680 if (m_recv_trans.get_data(uuid)) {
2681 m_info_manager->socket_get_keyboard_ise_list(uuid);
2683 LOGW ("wrong format of transaction\n");
2685 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2686 uint32 portrait_line, mode;
2688 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2689 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2691 LOGW ("wrong format of transaction\n");
2692 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2695 if (m_recv_trans.get_data(uuid)) {
2696 m_info_manager->socket_get_candidate_ui(uuid);
2698 LOGW ("wrong format of transaction\n");
2700 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2703 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2704 m_info_manager->socket_set_candidate_position(left, top);
2706 LOGW ("wrong format of transaction\n");
2707 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2708 m_info_manager->socket_hide_candidate();
2709 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2712 if (m_recv_trans.get_data(uuid)) {
2713 m_info_manager->socket_get_candidate_geometry(uuid);
2715 LOGW ("wrong format of transaction\n");
2717 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2718 m_info_manager->reset_keyboard_ise();
2719 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2722 if (m_recv_trans.get_data(uuid)) {
2723 m_info_manager->socket_set_keyboard_ise(uuid);
2725 LOGW ("wrong format of transaction\n");
2727 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2730 if (m_recv_trans.get_data(uuid)) {
2731 m_info_manager->socket_get_keyboard_ise(uuid);
2733 LOGW ("wrong format of transaction\n");
2735 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2736 uint32 x, y, width, height;
2738 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2739 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2740 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2742 LOGW ("wrong format of transaction\n");
2744 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2745 m_info_manager->expand_candidate();
2746 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2747 m_info_manager->contract_candidate();
2748 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2751 if (m_recv_trans.get_data(index))
2752 m_info_manager->socket_helper_select_candidate(index);
2754 LOGW ("wrong format of transaction\n");
2755 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2757 uint32 maxlen_before;
2758 uint32 maxlen_after;
2760 if (m_recv_trans.get_data(uuid) &&
2761 m_recv_trans.get_data(maxlen_before) &&
2762 m_recv_trans.get_data(maxlen_after)) {
2763 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2765 LOGW ("wrong format of transaction\n");
2767 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2771 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2772 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2774 LOGW ("wrong format of transaction\n");
2776 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2779 if (m_recv_trans.get_data(uuid)) {
2780 m_info_manager->socket_helper_get_selection(client_id, uuid);
2782 LOGW ("wrong format of transaction\n");
2784 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2788 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2789 m_info_manager->socket_helper_set_selection(client_id, start, end);
2791 LOGW ("wrong format of transaction\n");
2793 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2796 if (m_recv_trans.get_data(command)) {
2797 m_info_manager->socket_helper_send_private_command(client_id, command);
2799 LOGW ("wrong format of transaction\n");
2802 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2803 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2804 } else if (cmd == ISM_TRANS_CMD_PROCESS_KEY_EVENT_DONE) {
2809 if (m_recv_trans.get_data(key) && m_recv_trans.get_data(ret) && m_recv_trans.get_data(serial)) {
2810 m_info_manager->process_key_event_done(key, ret, serial);
2812 LOGW ("wrong format of transaction\n");
2814 } else if (cmd == ISM_TRANS_CMD_REQUEST_ISE_HIDE) {
2815 m_info_manager->request_ise_hide();
2816 } else if (cmd == ISM_TRANS_CMD_RECAPTURE_STRING) {
2823 AttributeList attrs;
2825 if (m_recv_trans.get_data(target_ic) &&
2826 m_recv_trans.get_data(target_uuid) &&
2827 m_recv_trans.get_data(offset) &&
2828 m_recv_trans.get_data(len) &&
2829 m_recv_trans.get_data(preedit) &&
2830 m_recv_trans.get_data(commit) &&
2831 m_recv_trans.get_data(attrs)) {
2832 m_info_manager->socket_helper_recapture_string(client_id, target_ic, target_uuid, offset, len, preedit, commit, attrs);
2834 LOGW ("wrong format of transaction\n");
2837 LOGW ("unknown cmd: %d\n", cmd);
2841 socket_transaction_end();
2842 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2843 socket_transaction_start();
2845 while (m_recv_trans.get_command(cmd)) {
2846 LOGD ("PanelAgent::cmd = %d\n", cmd);
2848 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2850 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2851 String default_uuid;
2852 m_info_manager->get_active_ise(client_id, default_uuid);
2854 Socket client_socket(client_id);
2857 trans.put_command(SCIM_TRANS_CMD_REPLY);
2858 trans.put_command(SCIM_TRANS_CMD_OK);
2859 trans.put_data(default_uuid);
2860 trans.write_to_socket(client_socket);
2863 LOGW ("Access denied to get active ise\n");
2864 send_fail_reply (client_id);
2866 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2867 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2872 if (m_recv_trans.get_data(&buf, len)) {
2873 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2875 LOGW ("wrong format of transaction\n");
2879 Socket client_socket(client_id);
2882 trans.put_command(SCIM_TRANS_CMD_REPLY);
2883 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2884 trans.write_to_socket(client_socket);
2890 LOGW ("Access denied to set active ise\n");
2891 send_fail_reply (client_id);
2893 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2894 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2900 //ret need be checked
2901 if (m_recv_trans.get_data(&buf, len)) {
2902 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2904 LOGW ("wrong format of transaction\n");
2908 Socket client_socket(client_id);
2911 trans.put_command(SCIM_TRANS_CMD_REPLY);
2912 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2913 trans.write_to_socket(client_socket);
2919 LOGW ("Access denied to set initial ise\n");
2920 send_fail_reply (client_id);
2922 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2923 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2924 std::vector<String> strlist;
2925 m_info_manager->get_ise_list(client_id, strlist);
2927 Socket client_socket(client_id);
2933 trans.put_command(SCIM_TRANS_CMD_REPLY);
2934 trans.put_command(SCIM_TRANS_CMD_OK);
2936 num = strlist.size();
2937 trans.put_data(num);
2939 for (unsigned int i = 0; i < num; i++) {
2940 buf = const_cast<char*>(strlist[i].c_str());
2941 len = strlen(buf) + 1;
2942 trans.put_data(buf, len);
2945 trans.write_to_socket(client_socket);
2948 LOGW ("Access denied to get ise list\n");
2949 send_fail_reply (client_id);
2951 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2952 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2953 HELPER_ISE_INFO info;
2954 m_info_manager->get_all_helper_ise_info(client_id, info);
2958 Socket client_socket(client_id);
2961 trans.put_command(SCIM_TRANS_CMD_REPLY);
2962 trans.put_command(SCIM_TRANS_CMD_OK);
2964 if (info.appid.size() > 0) {
2965 trans.put_data(info.appid);
2966 trans.put_data(info.label);
2967 trans.put_data(info.is_enabled);
2968 trans.put_data(info.is_preinstalled);
2969 trans.put_data(info.has_option);
2972 trans.write_to_socket(client_socket);
2976 LOGW ("Access denied to get all helper ise info\n");
2977 send_fail_reply (client_id);
2979 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2980 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2985 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2986 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2989 LOGW ("wrong format of transaction\n");
2993 Socket client_socket(client_id);
2996 trans.put_command(SCIM_TRANS_CMD_REPLY);
2997 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2998 trans.write_to_socket(client_socket);
3001 LOGW ("Access denied to set enable helper ise info\n");
3002 send_fail_reply (client_id);
3004 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
3005 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3006 String strUuid, strName, strLanguage, strModuleName;
3010 if (m_recv_trans.get_data(strUuid)) {
3011 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
3013 LOGW ("wrong format of transaction\n");
3017 Socket client_socket(client_id);
3019 trans.put_command(SCIM_TRANS_CMD_REPLY);
3020 trans.put_command(SCIM_TRANS_CMD_OK);
3021 trans.put_data(strName);
3022 trans.put_data(strLanguage);
3023 trans.put_data(nType);
3024 trans.put_data(nOption);
3025 trans.put_data(strModuleName);
3026 trans.write_to_socket(client_socket);
3029 LOGW ("Access denied to get ise information\n");
3030 send_fail_reply (client_id);
3032 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
3033 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3035 Socket client_socket(client_id);
3038 trans.put_command(SCIM_TRANS_CMD_REPLY);
3039 trans.put_command(SCIM_TRANS_CMD_OK);
3040 trans.write_to_socket(client_socket);
3041 m_info_manager->show_helper_ise_selector(client_id);
3042 m_info_manager->reset_ise_option(client_id);
3045 LOGW ("Access denied to reset ise option\n");
3046 send_fail_reply (client_id);
3048 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
3049 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3050 m_info_manager->reset_default_ise(client_id);
3053 LOGW ("Access denied to reset default ise\n");
3054 send_fail_reply (client_id);
3056 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
3057 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3058 m_info_manager->show_isf_panel(client_id);
3061 LOGW ("Access denied to show isf control\n");
3062 send_fail_reply (client_id);
3064 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
3065 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3066 m_info_manager->show_ise_option_window(client_id);
3069 LOGW ("Access denied to show ise option window\n");
3070 send_fail_reply (client_id);
3072 } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
3073 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3074 m_info_manager->resume_ise_option_window(client_id);
3077 LOGW ("Access denied to resume ise option window\n");
3078 send_fail_reply (client_id);
3080 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
3081 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3083 Socket client_socket(client_id);
3086 trans.put_command(SCIM_TRANS_CMD_REPLY);
3087 trans.put_command(SCIM_TRANS_CMD_OK);
3088 trans.write_to_socket(client_socket);
3090 m_info_manager->show_helper_ise_list(client_id);
3093 LOGW ("Access denied to show helper ise list\n");
3094 send_fail_reply (client_id);
3096 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
3097 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3099 Socket client_socket(client_id);
3102 trans.put_command(SCIM_TRANS_CMD_REPLY);
3103 trans.put_command(SCIM_TRANS_CMD_OK);
3104 trans.write_to_socket(client_socket);
3105 m_info_manager->show_helper_ise_selector(client_id);
3108 LOGW ("Access denied to show helper ise selector\n");
3109 send_fail_reply (client_id);
3111 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
3112 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
3114 uint32 nEnabled = 0;
3117 //ret need be checked
3118 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
3120 Socket client_socket(client_id);
3122 trans.put_command(SCIM_TRANS_CMD_REPLY);
3125 trans.put_command(SCIM_TRANS_CMD_OK);
3126 trans.put_data(static_cast<uint32>(nEnabled));
3128 trans.put_command(SCIM_TRANS_CMD_FAIL);
3131 trans.write_to_socket(client_socket);
3134 LOGW ("Access denied to check helper ise enabled\n");
3135 send_fail_reply (client_id);
3137 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
3141 Socket client_socket(client_id);
3144 trans.put_command(SCIM_TRANS_CMD_REPLY);
3146 if (m_recv_trans.get_data(angle)) {
3147 struct rectinfo info = {0, 0, 0, 0};
3148 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
3150 trans.put_command(SCIM_TRANS_CMD_OK);
3151 trans.put_data(info.pos_x);
3152 trans.put_data(info.pos_y);
3153 trans.put_data(info.width);
3154 trans.put_data(info.height);
3156 trans.put_command(SCIM_TRANS_CMD_FAIL);
3159 trans.write_to_socket(client_socket);
3160 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
3162 Socket client_socket(client_id);
3165 trans.put_command(SCIM_TRANS_CMD_REPLY);
3166 trans.put_command(SCIM_TRANS_CMD_OK);
3167 trans.write_to_socket(client_socket);
3168 m_info_manager->hide_helper_ise ();
3170 LOGW ("unknown cmd: %d\n", cmd);
3174 socket_transaction_end();
3175 } else if (client_info.type == REMOTEINPUT_ACT_CLIENT) {
3176 socket_transaction_start();
3177 while (m_recv_trans.get_command(cmd)) {
3178 LOGD ("PanelAgent::cmd = %d\n", cmd);
3179 if (cmd == ISM_REMOTE_TRANS_CMD_SEND_INPUT_MESSAGE) {
3184 if (m_recv_trans.get_data(&buf, len)) {
3185 ret = m_info_manager->remoteinput_send_input_message(client_id, buf, len);
3187 LOGW ("wrong format of transaction\n");
3191 Socket client_socket(client_id);
3194 trans.put_command(SCIM_TRANS_CMD_REPLY);
3195 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3196 trans.write_to_socket(client_socket);
3200 } else if (cmd == ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE) {
3203 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE))
3207 Socket client_socket(client_id);
3210 trans.put_command(SCIM_TRANS_CMD_REPLY);
3211 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3212 trans.write_to_socket(client_socket);
3213 } else if (cmd == ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3218 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
3219 ret = m_info_manager->remoteinput_delete_surrounding_text(offset, len);
3221 LOGW ("wrong format of transaction\n");
3225 Socket client_socket(client_id);
3228 trans.put_command(SCIM_TRANS_CMD_REPLY);
3229 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
3230 trans.write_to_socket(client_socket);
3232 LOGW ("unknown cmd: %d\n", cmd);
3236 socket_transaction_end ();
3240 void socket_exception_callback(SocketServer* server,
3241 const Socket& client) {
3242 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
3243 LOGD ("client id:%d\n", client.get_id());
3244 socket_close_connection(server, client);
3247 bool socket_open_connection(SocketServer* server,
3248 const Socket& client) {
3249 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
3250 LOGD ("client id:%d\n", client.get_id());
3252 String type = scim_socket_accept_connection(key,
3254 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive,RemoteInput_Active,RemoteInput_Passive,SocketConfig"),
3258 SCIM_DEBUG_MAIN (3) << "type = " << type << "\n";
3259 if (type.length()) {
3260 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3261 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
3262 ((type == "Helper") ? HELPER_CLIENT :
3263 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3264 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3265 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT :
3266 ((type == "RemoteInput_Active") ? REMOTEINPUT_ACT_CLIENT :
3267 ((type == "RemoteInput_Passive") ? REMOTEINPUT_CLIENT : CONFIG_CLIENT))))))));
3269 m_info_manager->add_client(client.get_id(), key, _type);
3273 LOGW ("open_connection failed\n");
3275 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
3276 server->close_connection(client);
3280 void socket_close_connection(SocketServer* server,
3281 const Socket& client) {
3282 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
3283 LOGD ("client id:%d\n", client.get_id());
3285 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
3287 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
3288 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
3289 ::close (client.get_id ());
3290 ecore_main_fd_handler_del (_read_handler_list[i]);
3291 _read_handler_list.erase (IterPos);
3295 m_info_manager->del_client(client.get_id());
3298 void socket_transaction_start(void) {
3299 //m_signal_transaction_start ();
3302 void socket_transaction_end(void) {
3303 //m_signal_transaction_end ();
3310 //m_signal_unlock ();
3314 } /* namespace scim */
3316 /***************************************************/
3317 /*** Beginning of panel agent interface for ISF ***/
3318 /***************************************************/
3319 static scim::PanelAgentPointer instance;
3323 EXAPI void scim_module_init(void)
3327 EXAPI void scim_module_exit(void)
3332 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
3337 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
3339 scim::PanelAgentBase* _instance = NULL;
3340 if (instance.null()) {
3342 _instance = new scim::EcoreSocketPanelAgent();
3348 instance = _instance;
3355 vi:ts=4:nowrap:ai:expandtab