2 * ISF(Input Service Framework)
4 * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
5 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
7 * Contact: Li Zhang <li2012.zhang@samsung.com>
9 * This library is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU Lesser General Public License as published by the
11 * Free Software Foundation; either version 2.1 of the License, or (at your option)
14 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 * License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, write to the Free Software Foundation, Inc., 51
21 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define Uses_SCIM_TRANSACTION
26 #define Uses_SCIM_TRANS_COMMANDS
27 #define Uses_SCIM_PANEL_AGENT
28 #define Uses_SCIM_HELPER
29 #define Uses_SCIM_SOCKET
30 #define Uses_SCIM_EVENT
31 #define Uses_SCIM_CONFIG
32 #define Uses_SCIM_CONFIG_MODULE
33 #define Uses_SCIM_CONFIG_PATH
34 #define Uses_SCIM_UTILITY
37 #include <sys/types.h>
38 #include <sys/times.h>
42 #include "scim_private.h"
44 #include "scim_stl_map.h"
49 #define LOG_TAG "ISF_ECORE_SOCKET_MODULE"
51 #define MIN_REPEAT_TIME 2.0
53 #define IMEMANAGER_PRIVILEGE "http://tizen.org/privilege/imemanager"
58 struct HelperClientStub {
62 HelperClientStub(int i = 0, int r = 0) : id(i), ref(r) { }
65 struct IMControlStub {
66 std::vector<ISE_INFO> info;
67 std::vector<int> count;
70 #define DEFAULT_CONTEXT_VALUE 0xfff
72 #define scim_module_init ecoresocket_LTX_scim_module_init
73 #define scim_module_exit ecoresocket_LTX_scim_module_exit
74 #define scim_panel_agent_module_init ecoresocket_LTX_scim_panel_agent_module_init
75 #define scim_panel_agent_module_get_instance ecoresocket_LTX_scim_panel_agent_module_get_instance
78 //==================================== PanelAgent ===========================
79 class EcoreSocketPanelAgent: public PanelAgentBase
84 String m_socket_address;
85 SocketServer m_socket_server;
87 Transaction m_send_trans;
88 Transaction m_recv_trans;
89 Transaction m_nest_trans;
91 bool m_should_shared_ise;
94 std::vector<Ecore_Fd_Handler*> _read_handler_list;
96 InfoManager* m_info_manager;
99 EcoreSocketPanelAgent()
100 : PanelAgentBase ("ecore_socket"),
101 m_should_exit(false),
102 m_socket_timeout(scim_get_default_socket_timeout()),
103 m_should_shared_ise(false),
104 m_ise_exiting(false) {
105 m_socket_server.signal_connect_accept(slot(this, &EcoreSocketPanelAgent::socket_accept_callback));
106 m_socket_server.signal_connect_receive(slot(this, &EcoreSocketPanelAgent::socket_receive_callback));
107 m_socket_server.signal_connect_exception(slot(this, &EcoreSocketPanelAgent::socket_exception_callback));
110 ~EcoreSocketPanelAgent() {
111 for (unsigned int ii = 0; ii < _read_handler_list.size(); ++ii) {
112 ecore_main_fd_handler_del(_read_handler_list[ii]);
114 _read_handler_list.clear();
117 bool initialize(InfoManager* info_manager, const String& display, bool resident) {
119 m_info_manager = info_manager;
120 m_socket_address = scim_get_default_panel_socket_address(display);
122 m_socket_server.shutdown();
124 if (m_socket_server.create(SocketAddress(m_socket_address))) {
125 Ecore_Fd_Handler* panel_agent_read_handler = NULL;
126 panel_agent_read_handler = ecore_main_fd_handler_add(get_server_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
127 _read_handler_list.push_back(panel_agent_read_handler);
130 LOGE("create server failed\n");
134 bool valid(void) const {
135 return m_socket_server.valid();
139 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
142 m_should_exit = true;
145 if (client.connect(SocketAddress(m_socket_address))) {
150 void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) {
151 LOGD ("client id:%d\n", client);
152 Socket client_socket(client);
153 m_send_trans.clear();
154 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
155 m_send_trans.put_data(context_id);
156 m_send_trans.put_command(cmd);
157 m_send_trans.put_data(nType);
158 m_send_trans.put_data(nValue);
159 m_send_trans.write_to_socket(client_socket);
162 void move_preedit_caret(int client, uint32 context_id, uint32 position) {
163 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
164 LOGD ("client id:%d\n", client);
165 Socket client_socket(client);
166 m_send_trans.clear();
167 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
168 m_send_trans.put_data((uint32) context_id);
169 m_send_trans.put_command(SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
170 m_send_trans.put_data((uint32) position);
171 m_send_trans.write_to_socket(client_socket);
176 void request_help(int client_id, uint32 context_id) {
177 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
178 LOGD ("client id:%d", client_id);
180 Socket client_socket(client_id);
181 m_send_trans.clear();
182 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
183 m_send_trans.put_data((uint32) context_id);
184 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
185 m_send_trans.write_to_socket(client_socket);
189 void request_factory_menu(int client_id, uint32 context_id) {
190 LOGD ("client id:%d", client_id);
191 Socket client_socket(client_id);
192 m_send_trans.clear();
193 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
194 m_send_trans.put_data((uint32) context_id);
195 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
196 m_send_trans.write_to_socket(client_socket);
200 void reset_keyboard_ise(int client, uint32 context_id) {
201 LOGD ("client id:%d\n", client);
202 Socket client_socket(client);
203 m_send_trans.clear();
204 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
205 m_send_trans.put_data((uint32) context_id);
206 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
207 m_send_trans.write_to_socket(client_socket);
210 void update_keyboard_ise_list(int client, uint32 context) {
211 LOGD ("client id:%d\n", client);
213 Socket client_socket(client);
214 m_send_trans.clear();
215 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
216 m_send_trans.put_data((uint32) context);
217 m_send_trans.put_command(ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
218 m_send_trans.write_to_socket(client_socket);
221 void change_factory(int client, uint32 context, const String& uuid) {
222 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
223 LOGD ("client id:%d\n", client);
225 Socket client_socket(client);
226 m_send_trans.clear();
227 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
228 m_send_trans.put_data((uint32) context);
229 m_send_trans.put_command(SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
230 m_send_trans.put_data(uuid);
231 m_send_trans.write_to_socket(client_socket);
234 void helper_candidate_show(int client, uint32 context, const String& uuid) {
235 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
236 LOGD ("client id:%d\n", client);
239 Socket client_socket(client);
241 m_send_trans.clear();
242 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
243 m_send_trans.put_data(context);
244 m_send_trans.put_data(uuid);
245 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_SHOW);
246 m_send_trans.write_to_socket(client_socket);
249 void helper_candidate_hide(int client, uint32 context, const String& uuid) {
250 LOGD ("client id:%d\n", client);
252 Socket client_socket(client);
254 m_send_trans.clear();
255 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
256 m_send_trans.put_data(context);
257 m_send_trans.put_data(uuid);
258 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_HIDE);
259 m_send_trans.write_to_socket(client_socket);
262 void candidate_more_window_show(int client, uint32 context) {
263 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
264 LOGD ("client id:%d\n", client);
267 Socket client_socket(client);
269 m_send_trans.clear();
270 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
271 m_send_trans.put_data(context);
272 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
273 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
274 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
275 m_send_trans.write_to_socket(client_socket);
278 void candidate_more_window_hide(int client, uint32 context) {
279 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
280 LOGD ("client id:%d\n", client);
282 Socket client_socket(client);
284 m_send_trans.clear();
285 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
286 m_send_trans.put_data(context);
287 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
288 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
289 m_send_trans.put_command(ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
290 m_send_trans.write_to_socket(client_socket);
293 void update_helper_lookup_table(int client, uint32 context, const String& uuid, const LookupTable& table) {
294 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
295 LOGD ("client id:%d\n", client);
297 Socket client_socket(client);
299 m_send_trans.clear();
300 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
301 m_send_trans.put_data(context);
302 m_send_trans.put_data(uuid);
303 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
304 m_send_trans.put_data(table);
305 m_send_trans.write_to_socket(client_socket);
308 void select_aux(int client, uint32 contextid, uint32 item) {
309 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
310 LOGD ("client id:%d\n", client);
312 Socket client_socket(client);
313 m_send_trans.clear();
314 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
315 m_send_trans.put_data((uint32) contextid);
317 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
318 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
320 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_AUX);
321 m_send_trans.put_data((uint32)item);
322 m_send_trans.write_to_socket(client_socket);
325 void select_candidate(int client, uint32 context, uint32 item) {
326 LOGD ("client id:%d\n", client);
328 Socket client_socket(client);
329 m_send_trans.clear();
330 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
331 m_send_trans.put_data((uint32) context);
333 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
334 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
336 m_send_trans.put_command(SCIM_TRANS_CMD_SELECT_CANDIDATE);
337 m_send_trans.put_data((uint32)item);
338 m_send_trans.write_to_socket(client_socket);
341 void lookup_table_page_up(int client, uint32 context) {
342 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
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_LOOKUP_TABLE_PAGE_UP);
354 m_send_trans.write_to_socket(client_socket);
357 void lookup_table_page_down(int client, uint32 context) {
358 LOGD ("client id:%d\n", client);
360 Socket client_socket(client);
361 m_send_trans.clear();
362 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
363 m_send_trans.put_data((uint32) context);
365 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
366 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
368 m_send_trans.put_command(SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
369 m_send_trans.write_to_socket(client_socket);
372 void update_lookup_table_page_size(int client, uint32 context, uint32 size) {
373 LOGD ("client id:%d\n", client);
375 Socket client_socket(client);
376 m_send_trans.clear();
377 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
378 m_send_trans.put_data((uint32) context);
380 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
381 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
383 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
384 m_send_trans.put_data(size);
385 m_send_trans.write_to_socket(client_socket);
388 void update_candidate_item_layout(int client, uint32 context, const std::vector<uint32>& row_items) {
389 LOGD ("client id:%d\n", client);
391 Socket client_socket(client);
392 m_send_trans.clear();
393 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
394 m_send_trans.put_data((uint32) context);
396 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
397 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
399 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT);
400 m_send_trans.put_data(row_items);
401 m_send_trans.write_to_socket(client_socket);
404 void select_associate(int client, uint32 context, uint32 item) {
405 LOGD ("client id:%d\n", client);
407 Socket client_socket(client);
408 m_send_trans.clear();
409 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
410 m_send_trans.put_data((uint32) context);
412 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
413 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
415 m_send_trans.put_command(ISM_TRANS_CMD_SELECT_ASSOCIATE);
416 m_send_trans.put_data((uint32)item);
417 m_send_trans.write_to_socket(client_socket);
420 void associate_table_page_up(int client, uint32 context) {
421 LOGD ("client id:%d\n", client);
423 Socket client_socket(client);
424 m_send_trans.clear();
425 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
426 m_send_trans.put_data((uint32) context);
428 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
429 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
431 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
432 m_send_trans.write_to_socket(client_socket);
435 void associate_table_page_down(int client, uint32 context) {
436 LOGD ("client id:%d\n", client);
438 Socket client_socket(client);
439 m_send_trans.clear();
440 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
441 m_send_trans.put_data((uint32) context);
443 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
444 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
446 m_send_trans.put_command(ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
447 m_send_trans.write_to_socket(client_socket);
450 void update_associate_table_page_size(int client, uint32 context, uint32 size) {
451 LOGD ("client id:%d\n", client);
453 Socket client_socket(client);
454 m_send_trans.clear();
455 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
456 m_send_trans.put_data((uint32) context);
458 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
459 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
461 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
462 m_send_trans.put_data(size);
463 m_send_trans.write_to_socket(client_socket);
466 void update_displayed_candidate_number(int client, uint32 context, uint32 size) {
467 LOGD ("client id:%d\n", client);
469 Socket client_socket(client);
470 m_send_trans.clear();
471 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
472 m_send_trans.put_data((uint32) context);
474 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
475 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
477 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE);
478 m_send_trans.put_data(size);
479 m_send_trans.write_to_socket(client_socket);
482 void send_longpress_event(int client, uint32 context, int index) {
483 LOGD ("client id:%d\n", client);
485 Socket client_socket(client);
486 m_send_trans.clear();
487 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
488 m_send_trans.put_data((uint32) context);
490 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
491 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
493 m_send_trans.put_command(ISM_TRANS_CMD_LONGPRESS_CANDIDATE);
494 m_send_trans.put_data(index);
495 m_send_trans.write_to_socket(client_socket);
498 void trigger_property(int client, uint32 context, const String& property) {
499 LOGD ("client id:%d\n", client);
501 Socket client_socket(client);
502 m_send_trans.clear();
503 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
504 m_send_trans.put_data((uint32) context);
506 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT)
507 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
509 m_send_trans.put_command(SCIM_TRANS_CMD_TRIGGER_PROPERTY);
510 m_send_trans.put_data(property);
511 m_send_trans.write_to_socket(client_socket);
514 void focus_out_helper(int client, uint32 context, const String& uuid) {
515 LOGD ("client id:%d\n", client);
517 Socket client_socket(client);
518 m_send_trans.clear();
519 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
520 m_send_trans.put_data(context);
521 m_send_trans.put_data(uuid);
522 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_OUT);
523 m_send_trans.write_to_socket(client_socket);
526 void focus_in_helper(int client, uint32 context, const String& uuid) {
527 LOGD ("client id:%d\n", client);
529 Socket client_socket(client);
530 m_send_trans.clear();
531 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
532 m_send_trans.put_data(context);
533 m_send_trans.put_data(uuid);
534 m_send_trans.put_command(SCIM_TRANS_CMD_FOCUS_IN);
535 m_send_trans.write_to_socket(client_socket);
538 void show_helper(int client, uint32 context, const String& uuid, char* data, size_t& len) {
539 LOGD ("client id:%d\n", client);
541 Socket client_socket(client);
542 m_send_trans.clear();
543 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
544 m_send_trans.put_data(context);
545 m_send_trans.put_data(uuid);
546 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_PANEL);
547 m_send_trans.put_data(data, len);
548 m_send_trans.write_to_socket(client_socket);
551 void hide_helper(int client, uint32 context, const String& uuid) {
552 LOGD ("client id:%d\n", client);
554 Socket client_socket(client);
555 m_send_trans.clear();
556 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
557 m_send_trans.put_data(context);
558 m_send_trans.put_data(uuid);
559 m_send_trans.put_command(ISM_TRANS_CMD_HIDE_ISE_PANEL);
560 m_send_trans.write_to_socket(client_socket);
563 void set_helper_mode(int client, uint32 context, const String& uuid, uint32& mode) {
564 LOGD ("client id:%d\n", client);
566 Socket client_socket(client);
567 m_send_trans.clear();
568 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
569 m_send_trans.put_data(context);
570 m_send_trans.put_data(uuid);
571 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_MODE);
572 m_send_trans.put_data(mode);
573 m_send_trans.write_to_socket(client_socket);
576 void set_helper_language(int client, uint32 context, const String& uuid, uint32& language) {
577 LOGD ("client id:%d\n", client);
579 Socket client_socket(client);
580 m_send_trans.clear();
581 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
582 m_send_trans.put_data(context);
583 m_send_trans.put_data(uuid);
584 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_LANGUAGE);
585 m_send_trans.put_data(language);
586 m_send_trans.write_to_socket(client_socket);
589 void set_helper_imdata(int client, uint32 context, const String& uuid, char* imdata, size_t& len) {
590 LOGD ("client id:%d\n", client);
592 Socket client_socket(client);
593 m_send_trans.clear();
594 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
595 m_send_trans.put_data(context);
596 m_send_trans.put_data(uuid);
597 m_send_trans.put_command(ISM_TRANS_CMD_SET_ISE_IMDATA);
598 m_send_trans.put_data(imdata, len);
599 m_send_trans.write_to_socket(client_socket);
602 void set_helper_return_key_type(int client, uint32 context, const String& uuid, uint32 type) {
603 LOGD ("client id:%d\n", client);
605 Socket client_socket(client);
606 m_send_trans.clear();
607 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
608 m_send_trans.put_data(context);
609 m_send_trans.put_data(uuid);
610 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
611 m_send_trans.put_data(type);
612 m_send_trans.write_to_socket(client_socket);
615 void get_helper_return_key_type(int client, uint32 context, const String& uuid, _OUT_ uint32& type) {
616 LOGD ("client id:%d\n", client);
618 Socket client_socket(client);
621 trans.put_command(SCIM_TRANS_CMD_REPLY);
622 trans.put_data(context);
623 trans.put_data(uuid);
624 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
628 if (trans.write_to_socket(client_socket)
629 && trans.read_from_socket(client_socket)
630 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
631 && trans.get_data(type)) {
632 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
635 LOGW ("read failed\n");
639 void set_helper_return_key_disable(int client, uint32 context, const String& uuid, uint32 disabled) {
640 LOGD ("client id:%d\n", client);
642 Socket client_socket(client);
643 m_send_trans.clear();
644 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
645 m_send_trans.put_data(context);
646 m_send_trans.put_data(uuid);
647 m_send_trans.put_command(ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
648 m_send_trans.put_data(disabled);
649 m_send_trans.write_to_socket(client_socket);
652 void get_helper_return_key_disable(int client, uint32 context, const String& uuid, _OUT_ uint32& disabled) {
654 Socket client_socket(client);
655 LOGD ("client id:%d", client);
660 trans.put_command(SCIM_TRANS_CMD_REPLY);
661 trans.put_data(context);
662 trans.put_data(uuid);
663 trans.put_command(ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
667 if (trans.write_to_socket(client_socket)
668 && trans.read_from_socket(client_socket)
669 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
670 && trans.get_data(disabled)) {
671 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
674 LOGW ("read failed");
678 void set_helper_layout(int client, uint32 context, const String& uuid, uint32& layout) {
679 LOGD ("client id:%d\n", client);
681 Socket client_socket(client);
682 m_send_trans.clear();
683 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
684 m_send_trans.put_data(context);
685 m_send_trans.put_data(uuid);
686 m_send_trans.put_command(ISM_TRANS_CMD_SET_LAYOUT);
687 m_send_trans.put_data(layout);
688 m_send_trans.write_to_socket(client_socket);
691 void set_helper_input_mode(int client, uint32 context, const String& uuid, uint32& mode) {
692 LOGD ("client id:%d\n", client);
694 Socket client_socket(client);
695 m_send_trans.clear();
696 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
697 m_send_trans.put_data(context);
698 m_send_trans.put_data(uuid);
699 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_MODE);
700 m_send_trans.put_data(mode);
701 m_send_trans.write_to_socket(client_socket);
704 void set_helper_input_hint(int client, uint32 context, const String& uuid, uint32& hint) {
705 LOGD ("client id:%d\n", client);
707 Socket client_socket(client);
708 m_send_trans.clear();
709 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
710 m_send_trans.put_data(context);
711 m_send_trans.put_data(uuid);
712 m_send_trans.put_command(ISM_TRANS_CMD_SET_INPUT_HINT);
713 m_send_trans.put_data(hint);
714 m_send_trans.write_to_socket(client_socket);
717 void set_helper_bidi_direction(int client, uint32 context, const String& uuid, uint32& direction) {
718 LOGD ("client id:%d\n", client);
720 Socket client_socket(client);
721 m_send_trans.clear();
722 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
723 m_send_trans.put_data(context);
724 m_send_trans.put_data(uuid);
725 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION);
726 m_send_trans.put_data(direction);
727 m_send_trans.write_to_socket(client_socket);
730 void set_helper_caps_mode(int client, uint32 context, const String& uuid, uint32& mode) {
731 LOGD ("client id:%d\n", client);
733 Socket client_socket(client);
734 m_send_trans.clear();
735 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
736 m_send_trans.put_data(context);
737 m_send_trans.put_data(uuid);
738 m_send_trans.put_command(ISM_TRANS_CMD_SET_CAPS_MODE);
739 m_send_trans.put_data(mode);
740 m_send_trans.write_to_socket(client_socket);
743 void show_helper_option_window(int client, uint32 context, const String& uuid) {
744 LOGD ("client id:%d\n", client);
746 Socket client_socket(client);
747 m_send_trans.clear();
748 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
749 m_send_trans.put_data(context);
750 m_send_trans.put_data(uuid);
751 m_send_trans.put_command(ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
752 m_send_trans.write_to_socket(client_socket);
755 bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, _OUT_ uint32& result) {
756 LOGD ("client id:%d\n", client);
758 Socket client_socket(client);
763 trans.put_command(SCIM_TRANS_CMD_REPLY);
764 trans.put_data(context);
765 trans.put_data(uuid);
766 trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
770 if (trans.write_to_socket(client_socket)
771 && trans.read_from_socket(client_socket)
772 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
773 && trans.get_data(result)) {
774 SCIM_DEBUG_MAIN(1) << __func__ << " success\n";
777 LOGW ("read failed\n");
783 bool get_helper_geometry(int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info) {
784 LOGD ("client id:%d\n", client);
786 Socket client_socket(client);
790 trans.put_command(SCIM_TRANS_CMD_REPLY);
791 trans.put_data(context);
792 trans.put_data(uuid);
793 trans.put_command(ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
795 if (trans.write_to_socket(client_socket)) {
800 if (trans.read_from_socket(client_socket)
801 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
802 && trans.get_data(info.pos_x)
803 && trans.get_data(info.pos_y)
804 && trans.get_data(info.width)
805 && trans.get_data(info.height)) {
806 SCIM_DEBUG_MAIN(1) << __func__ << " is successful\n";
809 LOGW ("read failed\n");
811 LOGW ("write failed\n");
816 void get_helper_imdata(int client, uint32 context, String& uuid, char** imdata, size_t& len) {
817 LOGD ("client id:%d\n", client);
819 Socket client_socket(client);
823 trans.put_command(SCIM_TRANS_CMD_REPLY);
824 trans.put_data(context);
825 trans.put_data(uuid);
826 trans.put_command(ISM_TRANS_CMD_GET_ISE_IMDATA);
830 if (trans.write_to_socket(client_socket)
831 && trans.read_from_socket(client_socket)
832 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
833 && trans.get_data(imdata, len)) {
834 SCIM_DEBUG_MAIN(1) << "get_helper_imdata success\n";
836 LOGW ("read failed\n");
840 void get_helper_layout(int client, uint32 context, String& uuid, uint32& layout) {
841 LOGD ("client id:%d\n", client);
843 Socket client_socket(client);
847 trans.put_command(SCIM_TRANS_CMD_REPLY);
848 trans.put_data(context);
849 trans.put_data(uuid);
850 trans.put_command(ISM_TRANS_CMD_GET_LAYOUT);
854 if (trans.write_to_socket(client_socket)
855 && trans.read_from_socket(client_socket)
856 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
857 && trans.get_data(layout)) {
858 SCIM_DEBUG_MAIN(1) << "get_helper_layout success\n";
863 void get_ise_language_locale(int client, uint32 context, String& uuid, char* data, size_t& len) {
864 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
865 LOGD ("client id:%d\n", client);
870 trans.put_command(SCIM_TRANS_CMD_REPLY);
871 trans.put_data(context);
872 trans.put_data(uuid);
873 trans.put_command(ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
876 Socket client_socket(client);
878 if (trans.write_to_socket(client_socket)
879 && trans.read_from_socket(client_socket)
880 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
881 && trans.get_data(&data, len)) {
887 void check_option_window(int client, uint32 context, String& uuid, _OUT_ uint32& avail) {
888 LOGD ("client id:%d\n", client);
891 Socket client_socket(client);
896 trans.put_command(SCIM_TRANS_CMD_REPLY);
897 trans.put_data(context);
898 trans.put_data(uuid);
899 trans.put_command(ISM_TRANS_CMD_CHECK_OPTION_WINDOW);
900 trans.write_to_socket(client_socket);
902 if (!trans.read_from_socket(client_socket, m_socket_timeout) ||
903 !trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REPLY ||
904 !trans.get_data(avail)) {
905 LOGW ("ISM_TRANS_CMD_CHECK_OPTION_WINDOW failed\n");
909 void reset_ise_option(int client, uint32 context) {
910 LOGD ("client id:%d\n", client);
912 Socket client_socket(client);
913 m_send_trans.clear();
914 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
915 m_send_trans.put_data((uint32) context);
916 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_OPTION);
917 m_send_trans.write_to_socket(client_socket);
920 void reset_helper_context(int client, uint32 context, const String& uuid) {
921 LOGD ("client id:%d\n", client);
923 Socket client_socket(client);
924 m_send_trans.clear();
925 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
926 m_send_trans.put_data(context);
927 m_send_trans.put_data(uuid);
928 m_send_trans.put_command(ISM_TRANS_CMD_RESET_ISE_CONTEXT);
929 m_send_trans.write_to_socket(client_socket);
932 void reload_config(int client) {
933 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
934 LOGD ("client id:%d\n", client);
936 m_send_trans.clear();
937 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
938 m_send_trans.put_command(SCIM_TRANS_CMD_RELOAD_CONFIG);
940 Socket client_socket(client);
941 m_send_trans.write_to_socket(client_socket);
944 void exit(int client, uint32 context) {
945 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
946 LOGD ("client id:%d\n", client);
948 m_send_trans.clear();
949 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
951 if (m_info_manager->socket_get_client_info(client).type == HELPER_CLIENT) {
952 m_send_trans.put_data(context);
953 m_send_trans.put_data(m_info_manager->get_current_helper_uuid());
956 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
958 Socket client_socket(client);
959 m_send_trans.write_to_socket(client_socket);
962 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
963 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
964 LOGD ("client id:%d\n", client);
966 Socket client_socket(client);
968 m_send_trans.clear();
969 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
970 m_send_trans.put_data(context);
971 m_send_trans.put_data(uuid);
972 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
973 m_send_trans.put_data(text);
974 m_send_trans.put_data(cursor);
975 m_send_trans.write_to_socket(client_socket);
978 void socket_update_selection(int client, uint32 context, const String& uuid, String text) {
979 LOGD ("client id:%d\n", client);
981 Socket client_socket(client);
983 m_send_trans.clear();
984 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
985 m_send_trans.put_data(context);
986 m_send_trans.put_data(uuid);
987 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
988 m_send_trans.put_data(text);
989 m_send_trans.write_to_socket(client_socket);
992 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
993 LOGD ("client id:%d\n", client);
995 Socket socket_client(client);
996 m_send_trans.clear();
997 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
998 m_send_trans.put_data(context);
999 m_send_trans.put_data(uuid);
1000 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
1001 m_send_trans.put_data(list.size());
1003 for (unsigned int i = 0; i < list.size(); i++)
1004 m_send_trans.put_data(list[i]);
1006 m_send_trans.write_to_socket(socket_client);
1009 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1010 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1012 LOGD ("client id:%d\n", client);
1014 Socket socket_client(client);
1015 m_send_trans.clear();
1016 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1017 m_send_trans.put_data(context);
1018 m_send_trans.put_data(uuid);
1019 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1020 m_send_trans.put_data(style);
1021 m_send_trans.put_data(mode);
1022 m_send_trans.write_to_socket(socket_client);
1025 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1026 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1028 LOGD ("client id:%d\n", client);
1030 Socket socket_client(client);
1031 m_send_trans.clear();
1032 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1033 m_send_trans.put_data(context);
1034 m_send_trans.put_data(uuid);
1035 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1036 m_send_trans.put_data(info.pos_x);
1037 m_send_trans.put_data(info.pos_y);
1038 m_send_trans.put_data(info.width);
1039 m_send_trans.put_data(info.height);
1040 m_send_trans.write_to_socket(socket_client);
1043 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1044 LOGD ("client id:%d\n", client);
1046 Socket socket_client(client);
1047 m_send_trans.clear();
1048 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1049 m_send_trans.put_data(context);
1050 m_send_trans.put_data(uuid);
1051 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
1052 m_send_trans.put_data(ise_name);
1053 m_send_trans.put_data(ise_uuid);
1054 m_send_trans.write_to_socket(socket_client);
1057 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1058 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1060 LOGD ("client id:%d\n", client);
1062 Socket client_socket(client);
1063 m_send_trans.clear();
1064 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1065 m_send_trans.put_data(context);
1066 m_send_trans.put_data(ic_uuid);
1067 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1068 m_send_trans.write_to_socket(client_socket);
1071 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1072 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1074 LOGD ("client id:%d\n", client);
1076 Socket client_socket(client);
1077 m_send_trans.clear();
1078 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1079 m_send_trans.put_data(context);
1080 m_send_trans.put_data(ic_uuid);
1081 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1082 m_send_trans.write_to_socket(client_socket);
1085 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1086 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1087 LOGD ("client id:%d\n", client);
1089 Socket client_socket(client);
1093 m_send_trans.clear();
1094 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1096 /* FIXME: We presume that client and context are both less than 65536.
1097 * Hopefully, it should be true in any UNIXs.
1098 * So it's ok to combine client and context into one uint32. */
1099 m_send_trans.put_data(context);
1100 m_send_trans.put_data(ic_uuid);
1101 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1102 m_send_trans.put_data(_nest_trans);
1103 m_send_trans.write_to_socket(client_socket);
1108 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1109 LOGD ("client id:%d\n", client);
1111 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1112 Socket socket_client(client);
1114 m_send_trans.clear();
1115 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1116 m_send_trans.put_data(context);
1117 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1118 m_send_trans.put_data(target_uuid);
1119 m_send_trans.put_data(active_uuid);
1120 m_send_trans.put_data(nest_trans);
1121 m_send_trans.write_to_socket(socket_client);
1126 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1127 LOGD ("client id:%d\n", client);
1129 Socket socket_client(client);
1131 m_send_trans.clear();
1132 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1133 m_send_trans.put_data(context);
1134 m_send_trans.put_command(cmd);
1135 m_send_trans.put_data(key);
1136 m_send_trans.write_to_socket(socket_client);
1140 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1141 LOGD ("client id:%d\n", client);
1143 Socket socket_client(client);
1145 m_send_trans.clear();
1146 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1147 m_send_trans.put_data(target_context);
1148 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1149 m_send_trans.put_data(wstr);
1150 m_send_trans.write_to_socket(socket_client);
1154 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1155 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1156 LOGD ("client id:%d\n", client);
1158 Socket socket_client(client);
1160 m_send_trans.clear();
1161 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1162 m_send_trans.put_data(context_id);
1163 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1164 m_send_trans.put_data(maxlen_before);
1165 m_send_trans.put_data(maxlen_after);
1166 m_send_trans.write_to_socket(socket_client);
1170 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1171 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1172 LOGD ("client id:%d\n", client);
1174 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_id);
1179 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1180 m_send_trans.put_data(offset);
1181 m_send_trans.put_data(len);
1182 m_send_trans.write_to_socket(socket_client);
1186 void socket_helper_get_selection(int client, uint32 context_id) {
1187 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1188 LOGD ("client id:%d\n", client);
1191 Socket socket_client(client);
1193 m_send_trans.clear();
1194 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1195 m_send_trans.put_data(context_id);
1196 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1197 m_send_trans.write_to_socket(socket_client);
1201 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1202 LOGD ("client id:%d\n", client);
1204 Socket socket_client(client);
1206 m_send_trans.clear();
1207 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1208 m_send_trans.put_data(context_id);
1209 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1210 m_send_trans.put_data(start);
1211 m_send_trans.put_data(end);
1212 m_send_trans.write_to_socket(socket_client);
1216 void show_preedit_string(int client, uint32 target_context) {
1217 LOGD ("client id:%d\n", client);
1219 Socket socket_client(client);
1221 m_send_trans.clear();
1222 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1223 m_send_trans.put_data(target_context);
1224 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1225 m_send_trans.write_to_socket(socket_client);
1229 void hide_preedit_string(int client, uint32 target_context) {
1230 LOGD ("client id:%d\n", client);
1232 Socket socket_client(client);
1234 m_send_trans.clear();
1235 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1236 m_send_trans.put_data(target_context);
1237 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1238 m_send_trans.write_to_socket(socket_client);
1242 void update_preedit_string(int client, uint32 target_context, WideString wstr, AttributeList& attrs, uint32 caret) {
1243 LOGD ("client id:%d\n", client);
1245 Socket socket_client(client);
1247 m_send_trans.clear();
1248 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1249 m_send_trans.put_data(target_context);
1250 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1251 m_send_trans.put_data(wstr);
1252 m_send_trans.put_data(attrs);
1253 m_send_trans.put_data(caret);
1254 m_send_trans.write_to_socket(socket_client);
1259 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1261 LOGD ("client id:%d\n", client);
1263 Socket socket_client(client);
1265 m_send_trans.clear();
1266 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1267 m_send_trans.put_data(focused_context);
1268 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1269 m_send_trans.put_data(caret);
1270 m_send_trans.write_to_socket(socket_client);
1275 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1276 LOGD ("client id:%d\n", client);
1278 Socket socket_client(client);
1279 m_send_trans.clear();
1280 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1281 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1282 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1284 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1285 m_send_trans.put_data(helper_ic_index[i].first);
1286 m_send_trans.put_data(helper_ic_index[i].second);
1289 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1290 m_send_trans.put_data((uint32)current_screen);
1291 m_send_trans.write_to_socket(socket_client);
1294 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1295 LOGD ("client id:%d\n", client);
1297 Socket client_socket(client);
1298 m_send_trans.clear();
1299 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1300 m_send_trans.put_data(focused_context);
1301 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1302 m_send_trans.put_data(type);
1303 m_send_trans.put_data(value);
1304 m_send_trans.write_to_socket(client_socket);
1308 void send_private_command(int client, uint32 focused_context, String command) {
1309 LOGD ("client id:%d\n", client);
1311 Socket socket_client(client);
1313 m_send_trans.clear();
1314 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1315 m_send_trans.put_data(focused_context);
1316 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1317 m_send_trans.put_data(command);
1318 m_send_trans.write_to_socket(socket_client);
1323 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1324 LOGD ("client id:%d\n", client);
1326 m_send_trans.clear();
1327 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1329 /* FIXME: We presume that client and context are both less than 65536.
1330 * Hopefully, it should be true in any UNIXs.
1331 * So it's ok to combine client and context into one uint32. */
1332 m_send_trans.put_data(context_id);
1333 m_send_trans.put_data(uuid);
1334 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1335 m_send_trans.put_data((uint32) x);
1336 m_send_trans.put_data((uint32) y);
1338 Socket client_socket(client);
1339 m_send_trans.write_to_socket(client_socket);
1343 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1344 LOGD ("client id:%d\n", client);
1346 m_send_trans.clear();
1347 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1348 m_send_trans.put_data(context_id);
1349 m_send_trans.put_data(uuid);
1350 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1351 m_send_trans.put_data((uint32) cursor_pos);
1353 Socket client_socket(client);
1354 m_send_trans.write_to_socket(client_socket);
1358 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1359 LOGD ("client id:%d\n", client);
1361 m_send_trans.clear();
1362 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1364 /* FIXME: We presume that client and context are both less than 65536.
1365 * Hopefully, it should be true in any UNIXs.
1366 * So it's ok to combine client and context into one uint32. */
1367 m_send_trans.put_data(context_id);
1368 m_send_trans.put_data(uuid);
1369 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1370 m_send_trans.put_data((uint32) screen);
1372 Socket client_socket(client);
1373 m_send_trans.write_to_socket(client_socket);
1379 static void send_fail_reply (int client_id)
1381 Socket client_socket (client_id);
1384 trans.put_command (SCIM_TRANS_CMD_REPLY);
1385 trans.put_command (SCIM_TRANS_CMD_FAIL);
1386 trans.write_to_socket (client_socket);
1389 bool filter_event(int fd) {
1390 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1392 return m_socket_server.filter_event(fd);
1395 bool filter_exception_event(int fd) {
1396 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1398 return m_socket_server.filter_exception_event(fd);
1401 int get_server_id() {
1402 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1404 return m_socket_server.get_id();
1407 bool socket_check_client_connection(const Socket& client) {
1408 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1410 unsigned char buf [sizeof(uint32)];
1412 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1414 if (nbytes == sizeof(uint32))
1418 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1420 LOGW ("Timeout when reading socket\n");
1427 * @brief Callback function for ecore fd handler.
1429 * @param data The data to pass to this callback.
1430 * @param fd_handler The ecore fd handler.
1432 * @return ECORE_CALLBACK_RENEW
1434 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1435 if (fd_handler == NULL || data == NULL)
1436 return ECORE_CALLBACK_RENEW;
1438 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1440 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1442 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1443 if (fd_handler == _agent->_read_handler_list [i]) {
1444 if (!_agent->filter_event(fd)) {
1445 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1446 ecore_main_fd_handler_del(fd_handler);
1448 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1451 return ECORE_CALLBACK_RENEW;
1455 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1456 _agent->filter_exception_event(fd);
1457 ecore_main_fd_handler_del(fd_handler);
1459 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1460 return ECORE_CALLBACK_RENEW;
1463 void socket_accept_callback(SocketServer* server,
1464 const Socket& client) {
1465 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1469 if (m_should_exit) {
1470 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1473 //m_signal_accept_connection (client.get_id ());
1474 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1475 _read_handler_list.push_back(panel_agent_read_handler);
1481 void socket_receive_callback(SocketServer* server,
1482 const Socket& client) {
1483 int client_id = client.get_id();
1489 ClientInfo client_info;
1491 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1493 /* If the connection is closed then close this client. */
1494 if (!socket_check_client_connection(client)) {
1495 LOGW ("check client connection failed\n");
1496 socket_close_connection(server, client);
1500 client_info = m_info_manager->socket_get_client_info(client_id);
1502 /* If it's a new client, then request to open the connection first. */
1503 if (client_info.type == UNKNOWN_CLIENT) {
1504 socket_open_connection(server, client);
1508 /* If can not read the transaction,
1509 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1510 * or the key is mismatch,
1512 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1513 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1514 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1515 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1519 if (client_info.type == FRONTEND_ACT_CLIENT) {
1520 if (m_recv_trans.get_data(context)) {
1521 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1522 socket_transaction_start();
1524 while (m_recv_trans.get_command(cmd)) {
1525 LOGD ("PanelAgent::cmd = %d\n", cmd);
1527 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1530 if (m_recv_trans.get_data(id)) {
1531 m_info_manager->register_panel_client(client_id, id);
1533 LOGW ("wrong format of transaction\n");
1539 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1540 if (m_recv_trans.get_data(uuid)) {
1541 m_info_manager->register_input_context(client_id, context, uuid);
1543 LOGW ("wrong format of transaction\n");
1549 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1550 m_info_manager->remove_input_context(client_id, context);
1554 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1555 m_info_manager->socket_reset_input_context(client_id, context);
1559 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1560 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1562 if (m_recv_trans.get_data(uuid)) {
1563 m_info_manager->focus_in(client_id, context, uuid);
1565 LOGW ("wrong format of transaction\n");
1571 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1574 if (m_recv_trans.get_data(isOn)) {
1575 m_info_manager->socket_turn_on_log(isOn);
1577 LOGW ("wrong format of transaction\n");
1583 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1584 m_info_manager->show_isf_panel(client_id);
1586 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1587 m_info_manager->hide_isf_panel(client_id);
1589 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1596 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1599 LOGW ("wrong format of transaction\n");
1603 Socket client_socket(client_id);
1606 trans.put_command(SCIM_TRANS_CMD_REPLY);
1607 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1608 trans.put_data(ret);
1609 trans.write_to_socket(client_socket);
1615 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1618 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1622 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1623 m_info_manager->hide_ise_panel(client_id, client, context);
1625 LOGW ("wrong format of transaction\n");
1629 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1630 struct rectinfo info;
1631 m_info_manager->get_input_panel_geometry(client_id, info);
1633 Socket client_socket(client_id);
1636 trans.put_command(SCIM_TRANS_CMD_REPLY);
1637 trans.put_command(SCIM_TRANS_CMD_OK);
1638 trans.put_data(info.pos_x);
1639 trans.put_data(info.pos_y);
1640 trans.put_data(info.width);
1641 trans.put_data(info.height);
1642 trans.write_to_socket(client_socket);
1644 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1645 struct rectinfo info;
1646 m_info_manager->get_candidate_window_geometry(client_id, info);
1648 Socket client_socket(client_id);
1651 trans.put_command(SCIM_TRANS_CMD_REPLY);
1652 trans.put_command(SCIM_TRANS_CMD_OK);
1653 trans.put_data(info.pos_x);
1654 trans.put_data(info.pos_y);
1655 trans.put_data(info.width);
1656 trans.put_data(info.height);
1657 trans.write_to_socket(client_socket);
1659 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1662 m_info_manager->get_ise_language_locale(client_id, data, len);
1665 trans.put_command(SCIM_TRANS_CMD_REPLY);
1667 if (data != NULL && len > 0) {
1668 trans.put_command(SCIM_TRANS_CMD_OK);
1669 trans.put_data(data, len);
1671 trans.put_command(SCIM_TRANS_CMD_FAIL);
1674 Socket client_socket(client_id);
1675 trans.write_to_socket(client_socket);
1681 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1684 if (m_recv_trans.get_data(language)) {
1685 m_info_manager->set_ise_language(client_id, language);
1687 LOGW ("wrong format of transaction\n");
1691 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1692 char* imdata = NULL;
1695 if (m_recv_trans.get_data(&imdata, len)) {
1696 m_info_manager->set_ise_imdata(client_id, imdata, len);
1698 LOGW ("wrong format of transaction\n");
1705 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1706 char* imdata = NULL;
1708 m_info_manager->get_ise_imdata(client_id, &imdata, len);
1710 Socket client_socket(client_id);
1713 trans.put_command(SCIM_TRANS_CMD_REPLY);
1716 trans.put_command(SCIM_TRANS_CMD_OK);
1717 trans.put_data(imdata, len);
1719 trans.put_command(SCIM_TRANS_CMD_FAIL);
1722 trans.write_to_socket(client_socket);
1728 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
1731 if (m_recv_trans.get_data(type)) {
1732 m_info_manager->set_ise_return_key_type(client_id, type);
1734 LOGW ("wrong format of transaction\n");
1738 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
1740 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
1742 Socket client_socket(client_id);
1745 trans.put_command(SCIM_TRANS_CMD_REPLY);
1748 trans.put_command(SCIM_TRANS_CMD_OK);
1749 trans.put_data(type);
1751 trans.put_command(SCIM_TRANS_CMD_FAIL);
1754 trans.write_to_socket(client_socket);
1756 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
1759 if (m_recv_trans.get_data(disabled)) {
1760 m_info_manager->set_ise_return_key_disable(client_id, disabled);
1762 LOGW ("wrong format of transaction\n");
1766 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
1769 m_info_manager->get_ise_return_key_disable(client_id, disabled);
1771 Socket client_socket(client_id);
1774 trans.put_command(SCIM_TRANS_CMD_REPLY);
1777 trans.put_command(SCIM_TRANS_CMD_OK);
1778 trans.put_data(disabled);
1780 trans.put_command(SCIM_TRANS_CMD_FAIL);
1783 trans.write_to_socket(client_socket);
1785 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
1787 bool ret = m_info_manager->get_ise_layout(client_id, layout);
1789 Socket client_socket(client_id);
1792 trans.put_command(SCIM_TRANS_CMD_REPLY);
1795 trans.put_command(SCIM_TRANS_CMD_OK);
1796 trans.put_data(layout);
1798 trans.put_command(SCIM_TRANS_CMD_FAIL);
1801 trans.write_to_socket(client_socket);
1803 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
1806 if (m_recv_trans.get_data(layout)) {
1807 m_info_manager->set_ise_layout(client_id, layout);
1809 LOGW ("wrong format of transaction\n");
1813 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
1816 if (m_recv_trans.get_data(mode)) {
1817 m_info_manager->set_ise_caps_mode(client_id, mode);
1819 LOGW ("wrong format of transaction\n");
1823 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
1824 m_info_manager->will_show_ack(client_id);
1826 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
1827 m_info_manager->will_hide_ack(client_id);
1829 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
1832 if (m_recv_trans.get_data(mode)) {
1833 m_info_manager->set_keyboard_mode(client_id, mode);
1835 LOGW ("wrong format of transaction\n");
1839 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
1840 m_info_manager->candidate_will_hide_ack(client_id);
1842 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
1848 if (m_recv_trans.get_data(key)) {
1850 m_info_manager->process_key_event(key, result);
1852 LOGW ("wrong format of transaction\n");
1856 Socket client_socket(client_id);
1859 trans.put_command(SCIM_TRANS_CMD_REPLY);
1862 trans.put_command(SCIM_TRANS_CMD_OK);
1863 trans.put_data(result);
1865 trans.put_command(SCIM_TRANS_CMD_FAIL);
1868 trans.write_to_socket(client_socket);
1870 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
1872 m_info_manager->get_active_helper_option(client_id, option);
1874 Socket client_socket(client_id);
1877 trans.put_command(SCIM_TRANS_CMD_REPLY);
1878 trans.put_command(SCIM_TRANS_CMD_OK);
1879 trans.put_data(option);
1880 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
1881 trans.write_to_socket(client_socket);
1883 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
1885 m_info_manager->get_ise_state(client_id, state);
1887 Socket client_socket(client_id);
1890 trans.put_command(SCIM_TRANS_CMD_REPLY);
1891 trans.put_command(SCIM_TRANS_CMD_OK);
1892 trans.put_data(state);
1893 trans.write_to_socket(client_socket);
1895 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
1898 if (m_recv_trans.get_data(input_mode)) {
1899 m_info_manager->set_ise_input_mode(client_id, input_mode);
1901 LOGW ("wrong format of transaction\n");
1905 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
1908 if (m_recv_trans.get_data(input_hint)) {
1909 m_info_manager->set_ise_input_hint(client_id, input_hint);
1911 LOGW ("wrong format of transaction\n");
1915 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
1916 uint32 bidi_direction;
1918 if (m_recv_trans.get_data(bidi_direction)) {
1919 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
1921 LOGW ("wrong format of transaction\n");
1925 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
1926 m_info_manager->show_ise_option_window(client_id);
1933 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
1936 if (m_recv_trans.get_data(uuid) && uuid.length()) {
1937 m_info_manager->socket_start_helper(client_id, context, uuid);
1939 LOGW ("wrong format of transaction\n");
1943 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
1946 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
1947 uuid.length() && m_nest_trans.valid()) {
1948 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
1950 LOGW ("wrong format of transaction\n");
1954 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
1957 if (m_recv_trans.get_data(uuid) && uuid.length()) {
1958 m_info_manager->socket_stop_helper(client_id, context, uuid);
1960 LOGW ("wrong format of transaction\n");
1969 /* Client must focus in before do any other things. */
1970 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
1971 m_info_manager->socket_turn_on();
1972 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
1973 m_info_manager->socket_turn_off();
1974 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
1977 if (m_recv_trans.get_data(num))
1978 m_info_manager->socket_update_screen(client_id, num);
1980 LOGW ("wrong format of transaction\n");
1981 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
1984 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
1985 m_info_manager->socket_update_spot_location(x, y, top_y);
1987 LOGW ("wrong format of transaction\n");
1989 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
1992 if (m_recv_trans.get_data(cursor_pos)) {
1993 m_info_manager->socket_update_cursor_position(cursor_pos);
1995 LOGW ("wrong format of transaction\n");
1997 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
2001 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2002 m_info_manager->socket_update_surrounding_text(text, cursor);
2004 LOGW ("wrong format of transaction\n");
2006 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2009 if (m_recv_trans.get_data(text)) {
2010 m_info_manager->socket_update_selection(text);
2012 LOGW ("wrong format of transaction\n");
2014 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2015 m_info_manager->expand_candidate();
2016 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2017 m_info_manager->contract_candidate();
2018 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2019 uint32 portrait_line, mode;
2021 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2022 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2024 LOGW ("wrong format of transaction\n");
2025 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2026 PanelFactoryInfo info;
2028 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2029 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2030 m_info_manager->socket_update_factory_info(info);
2032 LOGW ("wrong format of transaction\n");
2034 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2035 m_info_manager->socket_show_preedit_string();
2036 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2037 m_info_manager->socket_show_aux_string();
2038 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2039 m_info_manager->socket_show_lookup_table();
2040 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2041 m_info_manager->socket_show_associate_table();
2042 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2043 m_info_manager->socket_hide_preedit_string();
2044 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2045 m_info_manager->socket_hide_aux_string();
2046 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2047 m_info_manager->socket_hide_lookup_table();
2048 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2049 m_info_manager->socket_hide_associate_table();
2050 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2052 AttributeList attrs;
2055 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2056 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2058 LOGW ("wrong format of transaction\n");
2059 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2062 if (m_recv_trans.get_data(caret))
2063 m_info_manager->socket_update_preedit_caret(caret);
2065 LOGW ("wrong format of transaction\n");
2066 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2068 AttributeList attrs;
2070 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2071 m_info_manager->socket_update_aux_string(str, attrs);
2073 LOGW ("wrong format of transaction\n");
2074 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2075 CommonLookupTable _isf_candidate_table;
2077 if (m_recv_trans.get_data(_isf_candidate_table))
2078 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2080 LOGW ("wrong format of transaction\n");
2082 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2083 CommonLookupTable table;
2085 if (m_recv_trans.get_data(table))
2086 m_info_manager->socket_update_associate_table(table);
2088 LOGW ("wrong format of transaction\n");
2089 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2090 PropertyList properties;
2092 if (m_recv_trans.get_data(properties))
2093 m_info_manager->socket_register_properties(properties);
2095 LOGW ("wrong format of transaction\n");
2096 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2099 if (m_recv_trans.get_data(property))
2100 m_info_manager->socket_update_property(property);
2102 LOGW ("wrong format of transaction\n");
2103 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2106 if (m_recv_trans.get_data(help))
2107 m_info_manager->socket_show_help(help);
2109 LOGW ("wrong format of transaction\n");
2110 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2111 PanelFactoryInfo info;
2112 std::vector <PanelFactoryInfo> vec;
2114 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2115 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2116 info.lang = scim_get_normalized_language(info.lang);
2117 vec.push_back(info);
2120 m_info_manager->socket_show_factory_menu(vec);
2121 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2122 m_info_manager->focus_out(client_id, context);
2124 LOGW ("unknow cmd: %d\n", cmd);
2128 socket_transaction_end();
2130 } else if (client_info.type == FRONTEND_CLIENT) {
2131 if (m_recv_trans.get_data(context)) {
2132 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2133 socket_transaction_start();
2135 while (m_recv_trans.get_command(cmd)) {
2136 LOGD ("PanelAgent::cmd = %d\n", cmd);
2138 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2139 Socket client_socket(client_id);
2143 trans.put_command(SCIM_TRANS_CMD_REPLY);
2144 trans.put_command(SCIM_TRANS_CMD_OK);
2145 trans.put_data(client_id);
2146 trans.write_to_socket(client_socket);
2149 LOGW ("unknow cmd: %d\n", cmd);
2153 socket_transaction_end();
2155 } else if (client_info.type == HELPER_CLIENT) {
2156 socket_transaction_start();
2158 while (m_recv_trans.get_command(cmd)) {
2159 LOGD ("PanelAgent::cmd = %d\n", cmd);
2161 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2164 if (m_recv_trans.get_data(info.uuid) &&
2165 m_recv_trans.get_data(info.name) &&
2166 m_recv_trans.get_data(info.icon) &&
2167 m_recv_trans.get_data(info.description) &&
2168 m_recv_trans.get_data(info.option) &&
2169 info.uuid.length()) {
2170 m_info_manager->socket_helper_register_helper(client_id, info);
2173 LOGW ("unknow cmd: %d\n", cmd);
2177 socket_transaction_end();
2178 } else if (client_info.type == HELPER_ACT_CLIENT) {
2179 socket_transaction_start();
2181 while (m_recv_trans.get_command(cmd)) {
2182 LOGD ("PanelAgent::cmd = %d\n", cmd);
2184 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2187 if (m_recv_trans.get_data(info.uuid) &&
2188 m_recv_trans.get_data(info.name) &&
2189 m_recv_trans.get_data(info.icon) &&
2190 m_recv_trans.get_data(info.description) &&
2191 m_recv_trans.get_data(info.option) &&
2192 info.uuid.length()) {
2193 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2195 LOGW ("wrong format of transaction\n");
2197 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2202 if (m_recv_trans.get_data(target_ic) &&
2203 m_recv_trans.get_data(target_uuid) &&
2204 m_recv_trans.get_data(wstr) &&
2206 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2208 LOGW ("wrong format of transaction\n");
2210 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2214 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2215 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2217 LOGW ("wrong format of transaction\n");
2219 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2220 m_info_manager->socket_show_aux_string();
2221 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2222 m_info_manager->socket_show_lookup_table();
2223 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2224 m_info_manager->socket_show_associate_table();
2225 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2229 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2230 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2232 LOGW ("wrong format of transaction\n");
2234 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2235 m_info_manager->socket_hide_aux_string();
2236 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2237 m_info_manager->socket_hide_lookup_table();
2238 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2239 m_info_manager->socket_hide_associate_table();
2240 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2244 AttributeList attrs;
2247 if (m_recv_trans.get_data(target_ic) &&
2248 m_recv_trans.get_data(target_uuid) &&
2249 m_recv_trans.get_data(wstr) &&
2250 m_recv_trans.get_data(attrs) &&
2251 m_recv_trans.get_data(caret)) {
2252 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, wstr, attrs, caret);
2254 LOGW ("wrong format of transaction\n");
2256 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2259 if (m_recv_trans.get_data(caret)) {
2260 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2262 LOGW ("wrong format of transaction\n");
2264 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2266 AttributeList attrs;
2268 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2269 m_info_manager->socket_update_aux_string(str, attrs);
2271 LOGW ("wrong format of transaction\n");
2273 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2274 CommonLookupTable _isf_candidate_table;
2276 if (m_recv_trans.get_data(_isf_candidate_table)) {
2277 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2279 LOGW ("wrong format of transaction\n");
2281 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2282 CommonLookupTable _isf_candidate_table;
2284 if (m_recv_trans.get_data(_isf_candidate_table)) {
2285 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2287 LOGW ("wrong format of transaction\n");
2289 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2290 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2295 if (m_recv_trans.get_data(target_ic) &&
2296 m_recv_trans.get_data(target_uuid) &&
2297 m_recv_trans.get_data(key) &&
2299 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2301 LOGW ("wrong format of transaction\n");
2303 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2308 if (m_recv_trans.get_data(target_ic) &&
2309 m_recv_trans.get_data(target_uuid) &&
2310 m_recv_trans.get_data(key) &&
2312 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2314 LOGW ("wrong format of transaction\n");
2316 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2320 if (m_recv_trans.get_data(target_ic) &&
2321 m_recv_trans.get_data(target_uuid) &&
2322 m_recv_trans.get_data(m_nest_trans) &&
2323 m_nest_trans.valid()) {
2324 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2326 LOGW ("wrong format of transaction\n");
2328 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2329 PropertyList properties;
2331 if (m_recv_trans.get_data(properties))
2332 m_info_manager->socket_helper_register_properties(client_id, properties);
2334 LOGW ("wrong format of transaction\n");
2335 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2338 if (m_recv_trans.get_data(property))
2339 m_info_manager->socket_helper_update_property(client_id, property);
2341 LOGW ("wrong format of transaction\n");
2342 } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) {
2343 m_info_manager->reload_config();
2344 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2348 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2349 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2351 LOGW ("wrong format of transaction\n");
2353 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2356 if (m_recv_trans.get_data(uuid)) {
2357 m_info_manager->socket_get_keyboard_ise_list(uuid);
2359 LOGW ("wrong format of transaction\n");
2361 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2362 uint32 portrait_line, mode;
2364 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2365 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2367 LOGW ("wrong format of transaction\n");
2368 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2371 if (m_recv_trans.get_data(uuid)) {
2372 m_info_manager->socket_get_candidate_ui(uuid);
2374 LOGW ("wrong format of transaction\n");
2376 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2379 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2380 m_info_manager->socket_set_candidate_position(left, top);
2382 LOGW ("wrong format of transaction\n");
2383 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2384 m_info_manager->socket_hide_candidate();
2385 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2388 if (m_recv_trans.get_data(uuid)) {
2389 m_info_manager->socket_get_candidate_geometry(uuid);
2391 LOGW ("wrong format of transaction\n");
2393 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2394 m_info_manager->reset_keyboard_ise();
2395 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2398 if (m_recv_trans.get_data(uuid)) {
2399 m_info_manager->socket_set_keyboard_ise(uuid);
2401 LOGW ("wrong format of transaction\n");
2403 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2406 if (m_recv_trans.get_data(uuid)) {
2407 m_info_manager->socket_get_keyboard_ise(uuid);
2409 LOGW ("wrong format of transaction\n");
2411 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2412 uint32 x, y, width, height;
2414 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2415 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2416 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2418 LOGW ("wrong format of transaction\n");
2420 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2421 m_info_manager->expand_candidate();
2422 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2423 m_info_manager->contract_candidate();
2424 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2427 if (m_recv_trans.get_data(index))
2428 m_info_manager->socket_helper_select_candidate(index);
2430 LOGW ("wrong format of transaction\n");
2431 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2433 uint32 maxlen_before;
2434 uint32 maxlen_after;
2436 if (m_recv_trans.get_data(uuid) &&
2437 m_recv_trans.get_data(maxlen_before) &&
2438 m_recv_trans.get_data(maxlen_after)) {
2439 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2441 LOGW ("wrong format of transaction\n");
2443 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2447 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2448 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2450 LOGW ("wrong format of transaction\n");
2452 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2455 if (m_recv_trans.get_data(uuid)) {
2456 m_info_manager->socket_helper_get_selection(client_id, uuid);
2458 LOGW ("wrong format of transaction\n");
2460 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2464 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2465 m_info_manager->socket_helper_set_selection(client_id, start, end);
2467 LOGW ("wrong format of transaction\n");
2469 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2472 if (m_recv_trans.get_data(command)) {
2473 m_info_manager->socket_helper_send_private_command(client_id, command);
2475 LOGW ("wrong format of transaction\n");
2478 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2479 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2481 LOGW ("unknow cmd: %d\n", cmd);
2485 socket_transaction_end();
2486 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2487 socket_transaction_start();
2489 while (m_recv_trans.get_command(cmd)) {
2490 LOGD ("PanelAgent::cmd = %d\n", cmd);
2492 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2494 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2495 String default_uuid;
2496 m_info_manager->get_active_ise(client_id, default_uuid);
2498 Socket client_socket(client_id);
2501 trans.put_command(SCIM_TRANS_CMD_REPLY);
2502 trans.put_command(SCIM_TRANS_CMD_OK);
2503 trans.put_data(default_uuid);
2504 trans.write_to_socket(client_socket);
2507 LOGW ("Access denied to get active ise\n");
2508 send_fail_reply (client_id);
2510 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2511 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2516 if (m_recv_trans.get_data(&buf, len)) {
2517 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2519 LOGW ("wrong format of transaction\n");
2523 Socket client_socket(client_id);
2526 trans.put_command(SCIM_TRANS_CMD_REPLY);
2527 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2528 trans.write_to_socket(client_socket);
2534 LOGW ("Access denied to set active ise\n");
2535 send_fail_reply (client_id);
2537 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2538 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2544 //ret need be checked
2545 if (m_recv_trans.get_data(&buf, len)) {
2546 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2548 LOGW ("wrong format of transaction\n");
2552 Socket client_socket(client_id);
2555 trans.put_command(SCIM_TRANS_CMD_REPLY);
2556 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2557 trans.write_to_socket(client_socket);
2563 LOGW ("Access denied to set initial ise\n");
2564 send_fail_reply (client_id);
2566 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2567 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2568 std::vector<String> strlist;
2569 m_info_manager->get_ise_list(client_id, strlist);
2571 Socket client_socket(client_id);
2577 trans.put_command(SCIM_TRANS_CMD_REPLY);
2578 trans.put_command(SCIM_TRANS_CMD_OK);
2580 num = strlist.size();
2581 trans.put_data(num);
2583 for (unsigned int i = 0; i < num; i++) {
2584 buf = const_cast<char*>(strlist[i].c_str());
2585 len = strlen(buf) + 1;
2586 trans.put_data(buf, len);
2589 trans.write_to_socket(client_socket);
2592 LOGW ("Access denied to get ise list\n");
2593 send_fail_reply (client_id);
2595 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2596 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2597 HELPER_ISE_INFO info;
2598 m_info_manager->get_all_helper_ise_info(client_id, info);
2602 Socket client_socket(client_id);
2605 trans.put_command(SCIM_TRANS_CMD_REPLY);
2606 trans.put_command(SCIM_TRANS_CMD_OK);
2608 if (info.appid.size() > 0) {
2609 trans.put_data(info.appid);
2610 trans.put_data(info.label);
2611 trans.put_data(info.is_enabled);
2612 trans.put_data(info.is_preinstalled);
2613 trans.put_data(info.has_option);
2616 trans.write_to_socket(client_socket);
2620 LOGW ("Access denied to get all helper ise info\n");
2621 send_fail_reply (client_id);
2623 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2624 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2629 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2630 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2633 LOGW ("wrong format of transaction\n");
2637 Socket client_socket(client_id);
2640 trans.put_command(SCIM_TRANS_CMD_REPLY);
2641 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2642 trans.write_to_socket(client_socket);
2645 LOGW ("Access denied to set enable helper ise info\n");
2646 send_fail_reply (client_id);
2648 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
2649 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2650 String strUuid, strName, strLanguage, strModuleName;
2654 if (m_recv_trans.get_data(strUuid)) {
2655 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
2657 LOGW ("wrong format of transaction\n");
2661 Socket client_socket(client_id);
2663 trans.put_command(SCIM_TRANS_CMD_REPLY);
2664 trans.put_command(SCIM_TRANS_CMD_OK);
2665 trans.put_data(strName);
2666 trans.put_data(strLanguage);
2667 trans.put_data(nType);
2668 trans.put_data(nOption);
2669 trans.put_data(strModuleName);
2670 trans.write_to_socket(client_socket);
2673 LOGW ("Access denied to get ise information\n");
2674 send_fail_reply (client_id);
2676 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
2677 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2679 Socket client_socket(client_id);
2682 trans.put_command(SCIM_TRANS_CMD_REPLY);
2683 trans.put_command(SCIM_TRANS_CMD_OK);
2684 trans.write_to_socket(client_socket);
2685 m_info_manager->show_helper_ise_selector(client_id);
2686 m_info_manager->reset_ise_option(client_id);
2689 LOGW ("Access denied to reset ise option\n");
2690 send_fail_reply (client_id);
2692 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
2693 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2694 m_info_manager->reset_default_ise(client_id);
2697 LOGW ("Access denied to reset default ise\n");
2698 send_fail_reply (client_id);
2700 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
2701 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2702 m_info_manager->show_isf_panel(client_id);
2705 LOGW ("Access denied to show isf control\n");
2706 send_fail_reply (client_id);
2708 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2709 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2710 m_info_manager->show_ise_option_window(client_id);
2713 LOGW ("Access denied to show ise option window\n");
2714 send_fail_reply (client_id);
2716 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
2717 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2719 Socket client_socket(client_id);
2722 trans.put_command(SCIM_TRANS_CMD_REPLY);
2723 trans.put_command(SCIM_TRANS_CMD_OK);
2724 trans.write_to_socket(client_socket);
2726 m_info_manager->show_helper_ise_list(client_id);
2729 LOGW ("Access denied to show helper ise list\n");
2730 send_fail_reply (client_id);
2732 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
2733 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2735 Socket client_socket(client_id);
2738 trans.put_command(SCIM_TRANS_CMD_REPLY);
2739 trans.put_command(SCIM_TRANS_CMD_OK);
2740 trans.write_to_socket(client_socket);
2741 m_info_manager->show_helper_ise_selector(client_id);
2744 LOGW ("Access denied to show helper ise selector\n");
2745 send_fail_reply (client_id);
2747 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
2748 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2750 uint32 nEnabled = 0;
2753 //ret need be checked
2754 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
2756 Socket client_socket(client_id);
2758 trans.put_command(SCIM_TRANS_CMD_REPLY);
2761 trans.put_command(SCIM_TRANS_CMD_OK);
2762 trans.put_data(static_cast<uint32>(nEnabled));
2764 trans.put_command(SCIM_TRANS_CMD_FAIL);
2767 trans.write_to_socket(client_socket);
2770 LOGW ("Access denied to check helper ise enabled\n");
2771 send_fail_reply (client_id);
2773 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
2777 Socket client_socket(client_id);
2780 trans.put_command(SCIM_TRANS_CMD_REPLY);
2782 if (m_recv_trans.get_data(angle)) {
2783 struct rectinfo info = {0, 0, 0, 0};
2784 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
2786 trans.put_command(SCIM_TRANS_CMD_OK);
2787 trans.put_data(info.pos_x);
2788 trans.put_data(info.pos_y);
2789 trans.put_data(info.width);
2790 trans.put_data(info.height);
2792 trans.put_command(SCIM_TRANS_CMD_FAIL);
2795 trans.write_to_socket(client_socket);
2796 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
2798 Socket client_socket(client_id);
2801 trans.put_command(SCIM_TRANS_CMD_REPLY);
2802 trans.put_command(SCIM_TRANS_CMD_OK);
2803 trans.write_to_socket(client_socket);
2804 m_info_manager->hide_helper_ise ();
2806 LOGW ("unknow cmd: %d\n", cmd);
2810 socket_transaction_end();
2814 void socket_exception_callback(SocketServer* server,
2815 const Socket& client) {
2816 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
2817 LOGD ("client id:%d\n", client.get_id());
2818 socket_close_connection(server, client);
2821 bool socket_open_connection(SocketServer* server,
2822 const Socket& client) {
2823 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
2824 LOGD ("client id:%d\n", client.get_id());
2826 String type = scim_socket_accept_connection(key,
2828 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
2832 if (type.length()) {
2833 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
2834 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
2835 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
2836 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
2837 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT)))));
2839 m_info_manager->add_client(client.get_id(), key, _type);
2843 LOGW ("open_connection failed\n");
2845 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
2846 server->close_connection(client);
2850 void socket_close_connection(SocketServer* server,
2851 const Socket& client) {
2852 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
2853 LOGD ("client id:%d\n", client.get_id());
2855 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
2857 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
2858 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
2859 ecore_main_fd_handler_del (_read_handler_list[i]);
2860 _read_handler_list.erase (IterPos);
2864 m_info_manager->del_client(client.get_id());
2867 void socket_transaction_start(void) {
2868 //m_signal_transaction_start ();
2871 void socket_transaction_end(void) {
2872 //m_signal_transaction_end ();
2879 //m_signal_unlock ();
2883 } /* namespace scim */
2885 /***************************************************/
2886 /*** Beginning of panel agent interface for ISF ***/
2887 /***************************************************/
2888 static scim::PanelAgentPointer instance;
2892 EXAPI void scim_module_init(void)
2896 EXAPI void scim_module_exit(void)
2901 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
2905 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
2907 scim::PanelAgentBase* _instance = NULL;
2908 if (instance.null()) {
2910 _instance = new scim::EcoreSocketPanelAgent();
2916 instance = _instance;
2923 vi:ts=4:nowrap:ai:expandtab