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(m_info_manager->get_current_helper_uuid());
954 m_send_trans.put_command(SCIM_TRANS_CMD_EXIT);
956 Socket client_socket(client);
957 m_send_trans.write_to_socket(client_socket);
960 void socket_update_surrounding_text(int client, uint32 context, const String& uuid, String& text, uint32 cursor) {
961 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
962 LOGD ("client id:%d\n", client);
964 Socket client_socket(client);
966 m_send_trans.clear();
967 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
968 m_send_trans.put_data(context);
969 m_send_trans.put_data(uuid);
970 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
971 m_send_trans.put_data(text);
972 m_send_trans.put_data(cursor);
973 m_send_trans.write_to_socket(client_socket);
976 void socket_update_selection(int client, uint32 context, const String& uuid, String text) {
977 LOGD ("client id:%d\n", client);
979 Socket client_socket(client);
981 m_send_trans.clear();
982 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
983 m_send_trans.put_data(context);
984 m_send_trans.put_data(uuid);
985 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_SELECTION);
986 m_send_trans.put_data(text);
987 m_send_trans.write_to_socket(client_socket);
990 void socket_get_keyboard_ise_list(int client, uint32 context, const String& uuid, std::vector<String>& list) {
991 LOGD ("client id:%d\n", client);
993 Socket socket_client(client);
994 m_send_trans.clear();
995 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
996 m_send_trans.put_data(context);
997 m_send_trans.put_data(uuid);
998 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
999 m_send_trans.put_data(list.size());
1001 for (unsigned int i = 0; i < list.size(); i++)
1002 m_send_trans.put_data(list[i]);
1004 m_send_trans.write_to_socket(socket_client);
1007 void socket_get_candidate_ui(int client, uint32 context, const String& uuid, int style, int mode) {
1008 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
1010 LOGD ("client id:%d\n", client);
1012 Socket socket_client(client);
1013 m_send_trans.clear();
1014 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1015 m_send_trans.put_data(context);
1016 m_send_trans.put_data(uuid);
1017 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
1018 m_send_trans.put_data(style);
1019 m_send_trans.put_data(mode);
1020 m_send_trans.write_to_socket(socket_client);
1023 void socket_get_candidate_geometry(int client, uint32 context, const String& uuid, struct rectinfo& info) {
1024 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1026 LOGD ("client id:%d\n", client);
1028 Socket socket_client(client);
1029 m_send_trans.clear();
1030 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1031 m_send_trans.put_data(context);
1032 m_send_trans.put_data(uuid);
1033 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
1034 m_send_trans.put_data(info.pos_x);
1035 m_send_trans.put_data(info.pos_y);
1036 m_send_trans.put_data(info.width);
1037 m_send_trans.put_data(info.height);
1038 m_send_trans.write_to_socket(socket_client);
1041 void socket_get_keyboard_ise(int client, uint32 context, const String& uuid, String& ise_name, String& ise_uuid) {
1042 LOGD ("client id:%d\n", client);
1044 Socket socket_client(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_KEYBOARD_ISE);
1050 m_send_trans.put_data(ise_name);
1051 m_send_trans.put_data(ise_uuid);
1052 m_send_trans.write_to_socket(socket_client);
1055 void socket_start_helper(int client, uint32 context, const String& ic_uuid) {
1056 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
1058 LOGD ("client id:%d\n", client);
1060 Socket client_socket(client);
1061 m_send_trans.clear();
1062 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1063 m_send_trans.put_data(context);
1064 m_send_trans.put_data(ic_uuid);
1065 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1066 m_send_trans.write_to_socket(client_socket);
1069 void helper_detach_input_context(int client, uint32 context, const String& ic_uuid) {
1070 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
1072 LOGD ("client id:%d\n", client);
1074 Socket client_socket(client);
1075 m_send_trans.clear();
1076 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1077 m_send_trans.put_data(context);
1078 m_send_trans.put_data(ic_uuid);
1079 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
1080 m_send_trans.write_to_socket(client_socket);
1083 void helper_process_imengine_event(int client, uint32 context, const String& ic_uuid, const Transaction& _nest_trans) {
1084 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
1085 LOGD ("client id:%d\n", client);
1087 Socket client_socket(client);
1091 m_send_trans.clear();
1092 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1094 /* FIXME: We presume that client and context are both less than 65536.
1095 * Hopefully, it should be true in any UNIXs.
1096 * So it's ok to combine client and context into one uint32. */
1097 m_send_trans.put_data(context);
1098 m_send_trans.put_data(ic_uuid);
1099 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
1100 m_send_trans.put_data(_nest_trans);
1101 m_send_trans.write_to_socket(client_socket);
1106 void process_helper_event(int client, uint32 context, String target_uuid, String active_uuid, Transaction& nest_trans) {
1107 LOGD ("client id:%d\n", client);
1109 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
1110 Socket socket_client(client);
1112 m_send_trans.clear();
1113 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1114 m_send_trans.put_data(context);
1115 m_send_trans.put_command(SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
1116 m_send_trans.put_data(target_uuid);
1117 m_send_trans.put_data(active_uuid);
1118 m_send_trans.put_data(nest_trans);
1119 m_send_trans.write_to_socket(socket_client);
1124 void socket_helper_key_event(int client, uint32 context, int cmd, KeyEvent& key) {
1125 LOGD ("client id:%d\n", client);
1127 Socket socket_client(client);
1129 m_send_trans.clear();
1130 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1131 m_send_trans.put_data(context);
1132 m_send_trans.put_command(cmd);
1133 m_send_trans.put_data(key);
1134 m_send_trans.write_to_socket(socket_client);
1138 void commit_string(int client, uint32 target_context, const WideString& wstr) {
1139 LOGD ("client id:%d\n", client);
1141 Socket socket_client(client);
1143 m_send_trans.clear();
1144 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1145 m_send_trans.put_data(target_context);
1146 m_send_trans.put_command(SCIM_TRANS_CMD_COMMIT_STRING);
1147 m_send_trans.put_data(wstr);
1148 m_send_trans.write_to_socket(socket_client);
1152 void socket_helper_get_surrounding_text(int client, uint32 context_id, uint32 maxlen_before, uint32 maxlen_after) {
1153 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1154 LOGD ("client id:%d\n", client);
1156 Socket socket_client(client);
1158 m_send_trans.clear();
1159 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1160 m_send_trans.put_data(context_id);
1161 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1162 m_send_trans.put_data(maxlen_before);
1163 m_send_trans.put_data(maxlen_after);
1164 m_send_trans.write_to_socket(socket_client);
1168 void socket_helper_delete_surrounding_text(int client, uint32 context_id, uint32 offset, uint32 len) {
1169 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1170 LOGD ("client id:%d\n", client);
1172 Socket socket_client(client);
1174 m_send_trans.clear();
1175 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1176 m_send_trans.put_data(context_id);
1177 m_send_trans.put_command(SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1178 m_send_trans.put_data(offset);
1179 m_send_trans.put_data(len);
1180 m_send_trans.write_to_socket(socket_client);
1184 void socket_helper_get_selection(int client, uint32 context_id) {
1185 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
1186 LOGD ("client id:%d\n", client);
1189 Socket socket_client(client);
1191 m_send_trans.clear();
1192 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1193 m_send_trans.put_data(context_id);
1194 m_send_trans.put_command(SCIM_TRANS_CMD_GET_SELECTION);
1195 m_send_trans.write_to_socket(socket_client);
1199 void socket_helper_set_selection(int client, uint32 context_id, uint32 start, uint32 end) {
1200 LOGD ("client id:%d\n", client);
1202 Socket socket_client(client);
1204 m_send_trans.clear();
1205 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1206 m_send_trans.put_data(context_id);
1207 m_send_trans.put_command(SCIM_TRANS_CMD_SET_SELECTION);
1208 m_send_trans.put_data(start);
1209 m_send_trans.put_data(end);
1210 m_send_trans.write_to_socket(socket_client);
1214 void show_preedit_string(int client, uint32 target_context) {
1215 LOGD ("client id:%d\n", client);
1217 Socket socket_client(client);
1219 m_send_trans.clear();
1220 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1221 m_send_trans.put_data(target_context);
1222 m_send_trans.put_command(SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
1223 m_send_trans.write_to_socket(socket_client);
1227 void hide_preedit_string(int client, uint32 target_context) {
1228 LOGD ("client id:%d\n", client);
1230 Socket socket_client(client);
1232 m_send_trans.clear();
1233 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1234 m_send_trans.put_data(target_context);
1235 m_send_trans.put_command(SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1236 m_send_trans.write_to_socket(socket_client);
1240 void update_preedit_string(int client, uint32 target_context, WideString wstr, AttributeList& attrs, uint32 caret) {
1241 LOGD ("client id:%d\n", client);
1243 Socket socket_client(client);
1245 m_send_trans.clear();
1246 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1247 m_send_trans.put_data(target_context);
1248 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1249 m_send_trans.put_data(wstr);
1250 m_send_trans.put_data(attrs);
1251 m_send_trans.put_data(caret);
1252 m_send_trans.write_to_socket(socket_client);
1257 void update_preedit_caret(int client, uint32 focused_context, uint32 caret) {
1259 LOGD ("client id:%d\n", client);
1261 Socket socket_client(client);
1263 m_send_trans.clear();
1264 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1265 m_send_trans.put_data(focused_context);
1266 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1267 m_send_trans.put_data(caret);
1268 m_send_trans.write_to_socket(socket_client);
1273 void helper_attach_input_context_and_update_screen(int client, std::vector < std::pair <uint32, String> >& helper_ic_index, uint32 current_screen) {
1274 LOGD ("client id:%d\n", client);
1276 Socket socket_client(client);
1277 m_send_trans.clear();
1278 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1279 m_send_trans.put_command(SCIM_TRANS_CMD_OK);
1280 m_send_trans.put_command(SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
1282 for (size_t i = 0; i < helper_ic_index.size(); ++i) {
1283 m_send_trans.put_data(helper_ic_index[i].first);
1284 m_send_trans.put_data(helper_ic_index[i].second);
1287 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1288 m_send_trans.put_data((uint32)current_screen);
1289 m_send_trans.write_to_socket(socket_client);
1292 void update_ise_input_context(int client, uint32 focused_context, uint32 type, uint32 value) {
1293 LOGD ("client id:%d\n", client);
1295 Socket client_socket(client);
1296 m_send_trans.clear();
1297 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1298 m_send_trans.put_data(focused_context);
1299 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1300 m_send_trans.put_data(type);
1301 m_send_trans.put_data(value);
1302 m_send_trans.write_to_socket(client_socket);
1306 void send_private_command(int client, uint32 focused_context, String command) {
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(focused_context);
1314 m_send_trans.put_command(SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND);
1315 m_send_trans.put_data(command);
1316 m_send_trans.write_to_socket(socket_client);
1321 void helper_all_update_spot_location(int client, uint32 context_id, String uuid, int x, int y) {
1322 LOGD ("client id:%d\n", client);
1324 m_send_trans.clear();
1325 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1327 /* FIXME: We presume that client and context are both less than 65536.
1328 * Hopefully, it should be true in any UNIXs.
1329 * So it's ok to combine client and context into one uint32. */
1330 m_send_trans.put_data(context_id);
1331 m_send_trans.put_data(uuid);
1332 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
1333 m_send_trans.put_data((uint32) x);
1334 m_send_trans.put_data((uint32) y);
1336 Socket client_socket(client);
1337 m_send_trans.write_to_socket(client_socket);
1341 void helper_all_update_cursor_position(int client, uint32 context_id, String uuid, int cursor_pos) {
1342 LOGD ("client id:%d\n", client);
1344 m_send_trans.clear();
1345 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1346 m_send_trans.put_data(context_id);
1347 m_send_trans.put_data(uuid);
1348 m_send_trans.put_command(ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
1349 m_send_trans.put_data((uint32) cursor_pos);
1351 Socket client_socket(client);
1352 m_send_trans.write_to_socket(client_socket);
1356 void helper_all_update_screen(int client, uint32 context_id, String uuid, int screen) {
1357 LOGD ("client id:%d\n", client);
1359 m_send_trans.clear();
1360 m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
1362 /* FIXME: We presume that client and context are both less than 65536.
1363 * Hopefully, it should be true in any UNIXs.
1364 * So it's ok to combine client and context into one uint32. */
1365 m_send_trans.put_data(context_id);
1366 m_send_trans.put_data(uuid);
1367 m_send_trans.put_command(SCIM_TRANS_CMD_UPDATE_SCREEN);
1368 m_send_trans.put_data((uint32) screen);
1370 Socket client_socket(client);
1371 m_send_trans.write_to_socket(client_socket);
1377 static void send_fail_reply (int client_id)
1379 Socket client_socket (client_id);
1382 trans.put_command (SCIM_TRANS_CMD_REPLY);
1383 trans.put_command (SCIM_TRANS_CMD_FAIL);
1384 trans.write_to_socket (client_socket);
1387 bool filter_event(int fd) {
1388 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n";
1390 return m_socket_server.filter_event(fd);
1393 bool filter_exception_event(int fd) {
1394 SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n";
1396 return m_socket_server.filter_exception_event(fd);
1399 int get_server_id() {
1400 SCIM_DEBUG_MAIN(1) << "PanelAgent::get_server_id ()\n";
1402 return m_socket_server.get_id();
1405 bool socket_check_client_connection(const Socket& client) {
1406 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id() << ")\n";
1408 unsigned char buf [sizeof(uint32)];
1410 int nbytes = client.read_with_timeout(buf, sizeof(uint32), m_socket_timeout);
1412 if (nbytes == sizeof(uint32))
1416 LOGW ("Error occurred when reading socket: %s\n", client.get_error_message().c_str());
1418 LOGW ("Timeout when reading socket\n");
1425 * @brief Callback function for ecore fd handler.
1427 * @param data The data to pass to this callback.
1428 * @param fd_handler The ecore fd handler.
1430 * @return ECORE_CALLBACK_RENEW
1432 static Eina_Bool panel_agent_handler(void* data, Ecore_Fd_Handler* fd_handler) {
1433 if (fd_handler == NULL || data == NULL)
1434 return ECORE_CALLBACK_RENEW;
1436 EcoreSocketPanelAgent* _agent = (EcoreSocketPanelAgent*)data;
1438 int fd = ecore_main_fd_handler_fd_get(fd_handler);
1440 for (unsigned int i = 0; i < _agent->_read_handler_list.size(); i++) {
1441 if (fd_handler == _agent->_read_handler_list [i]) {
1442 if (!_agent->filter_event(fd)) {
1443 std::cerr << "_panel_agent->filter_event () is failed!!!\n";
1444 ecore_main_fd_handler_del(fd_handler);
1446 ISF_SAVE_LOG("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd);
1449 return ECORE_CALLBACK_RENEW;
1453 std::cerr << "panel_agent_handler () has received exception event!!!\n";
1454 _agent->filter_exception_event(fd);
1455 ecore_main_fd_handler_del(fd_handler);
1457 ISF_SAVE_LOG("Received exception event (fd=%d)!!!\n", fd);
1458 return ECORE_CALLBACK_RENEW;
1461 void socket_accept_callback(SocketServer* server,
1462 const Socket& client) {
1463 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id() << ")\n";
1467 if (m_should_exit) {
1468 SCIM_DEBUG_MAIN(3) << "Exit Socket Server Thread.\n";
1471 //m_signal_accept_connection (client.get_id ());
1472 Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add(client.get_id(), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL);
1473 _read_handler_list.push_back(panel_agent_read_handler);
1479 void socket_receive_callback(SocketServer* server,
1480 const Socket& client) {
1481 int client_id = client.get_id();
1487 ClientInfo client_info;
1489 SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
1491 /* If the connection is closed then close this client. */
1492 if (!socket_check_client_connection(client)) {
1493 LOGW ("check client connection failed\n");
1494 socket_close_connection(server, client);
1498 client_info = m_info_manager->socket_get_client_info(client_id);
1500 /* If it's a new client, then request to open the connection first. */
1501 if (client_info.type == UNKNOWN_CLIENT) {
1502 socket_open_connection(server, client);
1506 /* If can not read the transaction,
1507 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
1508 * or the key is mismatch,
1510 if (!m_recv_trans.read_from_socket(client, m_socket_timeout) ||
1511 !m_recv_trans.get_command(cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
1512 !m_recv_trans.get_data(key) || key != (uint32) client_info.key) {
1513 LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key);
1517 if (client_info.type == FRONTEND_ACT_CLIENT) {
1518 if (m_recv_trans.get_data(context)) {
1519 SCIM_DEBUG_MAIN(1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
1520 socket_transaction_start();
1522 while (m_recv_trans.get_command(cmd)) {
1523 LOGD ("PanelAgent::cmd = %d\n", cmd);
1525 if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
1528 if (m_recv_trans.get_data(id)) {
1529 m_info_manager->register_panel_client(client_id, id);
1531 LOGW ("wrong format of transaction\n");
1537 else if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
1538 if (m_recv_trans.get_data(uuid)) {
1539 m_info_manager->register_input_context(client_id, context, uuid);
1541 LOGW ("wrong format of transaction\n");
1547 else if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
1548 m_info_manager->remove_input_context(client_id, context);
1552 else if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
1553 m_info_manager->socket_reset_input_context(client_id, context);
1557 else if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
1558 SCIM_DEBUG_MAIN(4) << " SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
1560 if (m_recv_trans.get_data(uuid)) {
1561 m_info_manager->focus_in(client_id, context, uuid);
1563 LOGW ("wrong format of transaction\n");
1569 else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
1572 if (m_recv_trans.get_data(isOn)) {
1573 m_info_manager->socket_turn_on_log(isOn);
1575 LOGW ("wrong format of transaction\n");
1581 else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
1582 m_info_manager->show_isf_panel(client_id);
1584 } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
1585 m_info_manager->hide_isf_panel(client_id);
1587 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
1594 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context) && m_recv_trans.get_data(&data, len)) {
1597 LOGW ("wrong format of transaction\n");
1601 Socket client_socket(client_id);
1604 trans.put_command(SCIM_TRANS_CMD_REPLY);
1605 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
1606 trans.put_data(ret);
1607 trans.write_to_socket(client_socket);
1613 m_info_manager->show_ise_panel(client_id, client, context, data, len);
1616 } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
1620 if (m_recv_trans.get_data(client) && m_recv_trans.get_data(context)) {
1621 m_info_manager->hide_ise_panel(client_id, client, context);
1623 LOGW ("wrong format of transaction\n");
1627 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
1628 struct rectinfo info;
1629 m_info_manager->get_input_panel_geometry(client_id, info);
1631 Socket client_socket(client_id);
1634 trans.put_command(SCIM_TRANS_CMD_REPLY);
1635 trans.put_command(SCIM_TRANS_CMD_OK);
1636 trans.put_data(info.pos_x);
1637 trans.put_data(info.pos_y);
1638 trans.put_data(info.width);
1639 trans.put_data(info.height);
1640 trans.write_to_socket(client_socket);
1642 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
1643 struct rectinfo info;
1644 m_info_manager->get_candidate_window_geometry(client_id, info);
1646 Socket client_socket(client_id);
1649 trans.put_command(SCIM_TRANS_CMD_REPLY);
1650 trans.put_command(SCIM_TRANS_CMD_OK);
1651 trans.put_data(info.pos_x);
1652 trans.put_data(info.pos_y);
1653 trans.put_data(info.width);
1654 trans.put_data(info.height);
1655 trans.write_to_socket(client_socket);
1657 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
1660 m_info_manager->get_ise_language_locale(client_id, data, len);
1663 trans.put_command(SCIM_TRANS_CMD_REPLY);
1665 if (data != NULL && len > 0) {
1666 trans.put_command(SCIM_TRANS_CMD_OK);
1667 trans.put_data(data, len);
1669 trans.put_command(SCIM_TRANS_CMD_FAIL);
1672 Socket client_socket(client_id);
1673 trans.write_to_socket(client_socket);
1679 } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
1682 if (m_recv_trans.get_data(language)) {
1683 m_info_manager->set_ise_language(client_id, language);
1685 LOGW ("wrong format of transaction\n");
1689 } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
1690 char* imdata = NULL;
1693 if (m_recv_trans.get_data(&imdata, len)) {
1694 m_info_manager->set_ise_imdata(client_id, imdata, len);
1696 LOGW ("wrong format of transaction\n");
1703 } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
1704 char* imdata = NULL;
1706 m_info_manager->get_ise_imdata(client_id, &imdata, len);
1708 Socket client_socket(client_id);
1711 trans.put_command(SCIM_TRANS_CMD_REPLY);
1714 trans.put_command(SCIM_TRANS_CMD_OK);
1715 trans.put_data(imdata, len);
1717 trans.put_command(SCIM_TRANS_CMD_FAIL);
1720 trans.write_to_socket(client_socket);
1726 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
1729 if (m_recv_trans.get_data(type)) {
1730 m_info_manager->set_ise_return_key_type(client_id, type);
1732 LOGW ("wrong format of transaction\n");
1736 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
1738 bool ret = m_info_manager->get_ise_return_key_type(client_id, type);
1740 Socket client_socket(client_id);
1743 trans.put_command(SCIM_TRANS_CMD_REPLY);
1746 trans.put_command(SCIM_TRANS_CMD_OK);
1747 trans.put_data(type);
1749 trans.put_command(SCIM_TRANS_CMD_FAIL);
1752 trans.write_to_socket(client_socket);
1754 } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
1757 if (m_recv_trans.get_data(disabled)) {
1758 m_info_manager->set_ise_return_key_disable(client_id, disabled);
1760 LOGW ("wrong format of transaction\n");
1764 } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
1767 m_info_manager->get_ise_return_key_disable(client_id, disabled);
1769 Socket client_socket(client_id);
1772 trans.put_command(SCIM_TRANS_CMD_REPLY);
1775 trans.put_command(SCIM_TRANS_CMD_OK);
1776 trans.put_data(disabled);
1778 trans.put_command(SCIM_TRANS_CMD_FAIL);
1781 trans.write_to_socket(client_socket);
1783 } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
1785 bool ret = m_info_manager->get_ise_layout(client_id, layout);
1787 Socket client_socket(client_id);
1790 trans.put_command(SCIM_TRANS_CMD_REPLY);
1793 trans.put_command(SCIM_TRANS_CMD_OK);
1794 trans.put_data(layout);
1796 trans.put_command(SCIM_TRANS_CMD_FAIL);
1799 trans.write_to_socket(client_socket);
1801 } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
1804 if (m_recv_trans.get_data(layout)) {
1805 m_info_manager->set_ise_layout(client_id, layout);
1807 LOGW ("wrong format of transaction\n");
1811 } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
1814 if (m_recv_trans.get_data(mode)) {
1815 m_info_manager->set_ise_caps_mode(client_id, mode);
1817 LOGW ("wrong format of transaction\n");
1821 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
1822 m_info_manager->will_show_ack(client_id);
1824 } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
1825 m_info_manager->will_hide_ack(client_id);
1827 } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
1830 if (m_recv_trans.get_data(mode)) {
1831 m_info_manager->set_keyboard_mode(client_id, mode);
1833 LOGW ("wrong format of transaction\n");
1837 } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
1838 m_info_manager->candidate_will_hide_ack(client_id);
1840 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT) {
1846 if (m_recv_trans.get_data(key)) {
1848 m_info_manager->process_key_event(key, result);
1850 LOGW ("wrong format of transaction\n");
1854 Socket client_socket(client_id);
1857 trans.put_command(SCIM_TRANS_CMD_REPLY);
1860 trans.put_command(SCIM_TRANS_CMD_OK);
1861 trans.put_data(result);
1863 trans.put_command(SCIM_TRANS_CMD_FAIL);
1866 trans.write_to_socket(client_socket);
1868 } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_HELPER_OPTION) {
1870 m_info_manager->get_active_helper_option(client_id, option);
1872 Socket client_socket(client_id);
1875 trans.put_command(SCIM_TRANS_CMD_REPLY);
1876 trans.put_command(SCIM_TRANS_CMD_OK);
1877 trans.put_data(option);
1878 SCIM_DEBUG_MAIN(4) << __func__ << " option " << option << "\n";
1879 trans.write_to_socket(client_socket);
1881 } else if (cmd == ISM_TRANS_CMD_GET_ISE_STATE) {
1883 m_info_manager->get_ise_state(client_id, state);
1885 Socket client_socket(client_id);
1888 trans.put_command(SCIM_TRANS_CMD_REPLY);
1889 trans.put_command(SCIM_TRANS_CMD_OK);
1890 trans.put_data(state);
1891 trans.write_to_socket(client_socket);
1893 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_MODE) {
1896 if (m_recv_trans.get_data(input_mode)) {
1897 m_info_manager->set_ise_input_mode(client_id, input_mode);
1899 LOGW ("wrong format of transaction\n");
1903 } else if (cmd == ISM_TRANS_CMD_SET_INPUT_HINT) {
1906 if (m_recv_trans.get_data(input_hint)) {
1907 m_info_manager->set_ise_input_hint(client_id, input_hint);
1909 LOGW ("wrong format of transaction\n");
1913 } else if (cmd == ISM_TRANS_CMD_UPDATE_BIDI_DIRECTION) {
1914 uint32 bidi_direction;
1916 if (m_recv_trans.get_data(bidi_direction)) {
1917 m_info_manager->update_ise_bidi_direction(client_id, bidi_direction);
1919 LOGW ("wrong format of transaction\n");
1923 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
1924 m_info_manager->show_ise_option_window(client_id);
1931 else if (cmd == SCIM_TRANS_CMD_START_HELPER) {
1934 if (m_recv_trans.get_data(uuid) && uuid.length()) {
1935 m_info_manager->socket_start_helper(client_id, context, uuid);
1937 LOGW ("wrong format of transaction\n");
1941 } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
1944 if (m_recv_trans.get_data(uuid) && m_recv_trans.get_data(m_nest_trans) &&
1945 uuid.length() && m_nest_trans.valid()) {
1946 m_info_manager->socket_send_helper_event(client_id, context, uuid, m_nest_trans);
1948 LOGW ("wrong format of transaction\n");
1952 } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
1955 if (m_recv_trans.get_data(uuid) && uuid.length()) {
1956 m_info_manager->socket_stop_helper(client_id, context, uuid);
1958 LOGW ("wrong format of transaction\n");
1967 /* Client must focus in before do any other things. */
1968 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
1969 m_info_manager->socket_turn_on();
1970 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
1971 m_info_manager->socket_turn_off();
1972 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN) {
1975 if (m_recv_trans.get_data(num))
1976 m_info_manager->socket_update_screen(client_id, num);
1978 LOGW ("wrong format of transaction\n");
1979 } else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION) {
1982 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) && m_recv_trans.get_data(top_y)) {
1983 m_info_manager->socket_update_spot_location(x, y, top_y);
1985 LOGW ("wrong format of transaction\n");
1987 } else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION) {
1990 if (m_recv_trans.get_data(cursor_pos)) {
1991 m_info_manager->socket_update_cursor_position(cursor_pos);
1993 LOGW ("wrong format of transaction\n");
1995 } else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT) {
1999 if (m_recv_trans.get_data(text) && m_recv_trans.get_data(cursor)) {
2000 m_info_manager->socket_update_surrounding_text(text, cursor);
2002 LOGW ("wrong format of transaction\n");
2004 } else if (cmd == ISM_TRANS_CMD_UPDATE_SELECTION) {
2007 if (m_recv_trans.get_data(text)) {
2008 m_info_manager->socket_update_selection(text);
2010 LOGW ("wrong format of transaction\n");
2012 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE)
2013 m_info_manager->expand_candidate();
2014 else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE)
2015 m_info_manager->contract_candidate();
2016 else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2017 uint32 portrait_line, mode;
2019 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2020 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2022 LOGW ("wrong format of transaction\n");
2023 } else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO) {
2024 PanelFactoryInfo info;
2026 if (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2027 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2028 m_info_manager->socket_update_factory_info(info);
2030 LOGW ("wrong format of transaction\n");
2032 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
2033 m_info_manager->socket_show_preedit_string();
2034 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
2035 m_info_manager->socket_show_aux_string();
2036 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
2037 m_info_manager->socket_show_lookup_table();
2038 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
2039 m_info_manager->socket_show_associate_table();
2040 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
2041 m_info_manager->socket_hide_preedit_string();
2042 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
2043 m_info_manager->socket_hide_aux_string();
2044 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
2045 m_info_manager->socket_hide_lookup_table();
2046 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
2047 m_info_manager->socket_hide_associate_table();
2048 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2050 AttributeList attrs;
2053 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs) && m_recv_trans.get_data(caret))
2054 m_info_manager->socket_update_preedit_string(str, attrs, caret);
2056 LOGW ("wrong format of transaction\n");
2057 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2060 if (m_recv_trans.get_data(caret))
2061 m_info_manager->socket_update_preedit_caret(caret);
2063 LOGW ("wrong format of transaction\n");
2064 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2066 AttributeList attrs;
2068 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2069 m_info_manager->socket_update_aux_string(str, attrs);
2071 LOGW ("wrong format of transaction\n");
2072 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2073 CommonLookupTable _isf_candidate_table;
2075 if (m_recv_trans.get_data(_isf_candidate_table))
2076 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2078 LOGW ("wrong format of transaction\n");
2080 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2081 CommonLookupTable table;
2083 if (m_recv_trans.get_data(table))
2084 m_info_manager->socket_update_associate_table(table);
2086 LOGW ("wrong format of transaction\n");
2087 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2088 PropertyList properties;
2090 if (m_recv_trans.get_data(properties))
2091 m_info_manager->socket_register_properties(properties);
2093 LOGW ("wrong format of transaction\n");
2094 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2097 if (m_recv_trans.get_data(property))
2098 m_info_manager->socket_update_property(property);
2100 LOGW ("wrong format of transaction\n");
2101 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP) {
2104 if (m_recv_trans.get_data(help))
2105 m_info_manager->socket_show_help(help);
2107 LOGW ("wrong format of transaction\n");
2108 } else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU) {
2109 PanelFactoryInfo info;
2110 std::vector <PanelFactoryInfo> vec;
2112 while (m_recv_trans.get_data(info.uuid) && m_recv_trans.get_data(info.name) &&
2113 m_recv_trans.get_data(info.lang) && m_recv_trans.get_data(info.icon)) {
2114 info.lang = scim_get_normalized_language(info.lang);
2115 vec.push_back(info);
2118 m_info_manager->socket_show_factory_menu(vec);
2119 } else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
2120 m_info_manager->focus_out(client_id, context);
2122 LOGW ("unknow cmd: %d\n", cmd);
2126 socket_transaction_end();
2128 } else if (client_info.type == FRONTEND_CLIENT) {
2129 if (m_recv_trans.get_data(context)) {
2130 SCIM_DEBUG_MAIN(1) << "client_info.type == FRONTEND_CLIENT\n";
2131 socket_transaction_start();
2133 while (m_recv_trans.get_command(cmd)) {
2134 LOGD ("PanelAgent::cmd = %d\n", cmd);
2136 if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
2137 Socket client_socket(client_id);
2141 trans.put_command(SCIM_TRANS_CMD_REPLY);
2142 trans.put_command(SCIM_TRANS_CMD_OK);
2143 trans.put_data(client_id);
2144 trans.write_to_socket(client_socket);
2147 LOGW ("unknow cmd: %d\n", cmd);
2151 socket_transaction_end();
2153 } else if (client_info.type == HELPER_CLIENT) {
2154 socket_transaction_start();
2156 while (m_recv_trans.get_command(cmd)) {
2157 LOGD ("PanelAgent::cmd = %d\n", cmd);
2159 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
2162 if (m_recv_trans.get_data(info.uuid) &&
2163 m_recv_trans.get_data(info.name) &&
2164 m_recv_trans.get_data(info.icon) &&
2165 m_recv_trans.get_data(info.description) &&
2166 m_recv_trans.get_data(info.option) &&
2167 info.uuid.length()) {
2168 m_info_manager->socket_helper_register_helper(client_id, info);
2171 LOGW ("unknow cmd: %d\n", cmd);
2175 socket_transaction_end();
2176 } else if (client_info.type == HELPER_ACT_CLIENT) {
2177 socket_transaction_start();
2179 while (m_recv_trans.get_command(cmd)) {
2180 LOGD ("PanelAgent::cmd = %d\n", cmd);
2182 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
2185 if (m_recv_trans.get_data(info.uuid) &&
2186 m_recv_trans.get_data(info.name) &&
2187 m_recv_trans.get_data(info.icon) &&
2188 m_recv_trans.get_data(info.description) &&
2189 m_recv_trans.get_data(info.option) &&
2190 info.uuid.length()) {
2191 m_info_manager->socket_helper_register_helper_passive(client_id, info);
2193 LOGW ("wrong format of transaction\n");
2195 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
2200 if (m_recv_trans.get_data(target_ic) &&
2201 m_recv_trans.get_data(target_uuid) &&
2202 m_recv_trans.get_data(wstr) &&
2204 m_info_manager->socket_helper_commit_string(client_id, target_ic, target_uuid, wstr);
2206 LOGW ("wrong format of transaction\n");
2208 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
2212 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2213 m_info_manager->socket_helper_show_preedit_string(client_id, target_ic, target_uuid);
2215 LOGW ("wrong format of transaction\n");
2217 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
2218 m_info_manager->socket_show_aux_string();
2219 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
2220 m_info_manager->socket_show_lookup_table();
2221 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
2222 m_info_manager->socket_show_associate_table();
2223 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
2227 if (m_recv_trans.get_data(target_ic) && m_recv_trans.get_data(target_uuid)) {
2228 m_info_manager->socket_helper_hide_preedit_string(client_id, target_ic, target_uuid);
2230 LOGW ("wrong format of transaction\n");
2232 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
2233 m_info_manager->socket_hide_aux_string();
2234 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
2235 m_info_manager->socket_hide_lookup_table();
2236 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
2237 m_info_manager->socket_hide_associate_table();
2238 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
2242 AttributeList attrs;
2245 if (m_recv_trans.get_data(target_ic) &&
2246 m_recv_trans.get_data(target_uuid) &&
2247 m_recv_trans.get_data(wstr) &&
2248 m_recv_trans.get_data(attrs) &&
2249 m_recv_trans.get_data(caret)) {
2250 m_info_manager->socket_helper_update_preedit_string(client_id, target_ic, target_uuid, wstr, attrs, caret);
2252 LOGW ("wrong format of transaction\n");
2254 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET) {
2257 if (m_recv_trans.get_data(caret)) {
2258 m_info_manager->socket_helper_update_preedit_caret(client_id, caret);
2260 LOGW ("wrong format of transaction\n");
2262 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
2264 AttributeList attrs;
2266 if (m_recv_trans.get_data(str) && m_recv_trans.get_data(attrs))
2267 m_info_manager->socket_update_aux_string(str, attrs);
2269 LOGW ("wrong format of transaction\n");
2271 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
2272 CommonLookupTable _isf_candidate_table;
2274 if (m_recv_trans.get_data(_isf_candidate_table)) {
2275 m_info_manager->socket_update_lookup_table(_isf_candidate_table);
2277 LOGW ("wrong format of transaction\n");
2279 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
2280 CommonLookupTable _isf_candidate_table;
2282 if (m_recv_trans.get_data(_isf_candidate_table)) {
2283 m_info_manager->socket_update_associate_table(_isf_candidate_table);
2285 LOGW ("wrong format of transaction\n");
2287 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
2288 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
2293 if (m_recv_trans.get_data(target_ic) &&
2294 m_recv_trans.get_data(target_uuid) &&
2295 m_recv_trans.get_data(key) &&
2297 m_info_manager->socket_helper_send_key_event(client_id, target_ic, target_uuid, key);
2299 LOGW ("wrong format of transaction\n");
2301 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
2306 if (m_recv_trans.get_data(target_ic) &&
2307 m_recv_trans.get_data(target_uuid) &&
2308 m_recv_trans.get_data(key) &&
2310 m_info_manager->socket_helper_forward_key_event(client_id, target_ic, target_uuid, key);
2312 LOGW ("wrong format of transaction\n");
2314 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
2318 if (m_recv_trans.get_data(target_ic) &&
2319 m_recv_trans.get_data(target_uuid) &&
2320 m_recv_trans.get_data(m_nest_trans) &&
2321 m_nest_trans.valid()) {
2322 m_info_manager->socket_helper_send_imengine_event(client_id, target_ic, target_uuid, m_nest_trans);
2324 LOGW ("wrong format of transaction\n");
2326 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
2327 PropertyList properties;
2329 if (m_recv_trans.get_data(properties))
2330 m_info_manager->socket_helper_register_properties(client_id, properties);
2332 LOGW ("wrong format of transaction\n");
2333 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
2336 if (m_recv_trans.get_data(property))
2337 m_info_manager->socket_helper_update_property(client_id, property);
2339 LOGW ("wrong format of transaction\n");
2340 } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) {
2341 m_info_manager->reload_config();
2342 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
2346 if (m_recv_trans.get_data(type) && m_recv_trans.get_data(value)) {
2347 m_info_manager->socket_helper_update_input_context(client_id, type, value);
2349 LOGW ("wrong format of transaction\n");
2351 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
2354 if (m_recv_trans.get_data(uuid)) {
2355 m_info_manager->socket_get_keyboard_ise_list(uuid);
2357 LOGW ("wrong format of transaction\n");
2359 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
2360 uint32 portrait_line, mode;
2362 if (m_recv_trans.get_data(portrait_line) && m_recv_trans.get_data(mode))
2363 m_info_manager->socket_set_candidate_ui(portrait_line, mode);
2365 LOGW ("wrong format of transaction\n");
2366 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
2369 if (m_recv_trans.get_data(uuid)) {
2370 m_info_manager->socket_get_candidate_ui(uuid);
2372 LOGW ("wrong format of transaction\n");
2374 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
2377 if (m_recv_trans.get_data(left) && m_recv_trans.get_data(top))
2378 m_info_manager->socket_set_candidate_position(left, top);
2380 LOGW ("wrong format of transaction\n");
2381 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
2382 m_info_manager->socket_hide_candidate();
2383 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
2386 if (m_recv_trans.get_data(uuid)) {
2387 m_info_manager->socket_get_candidate_geometry(uuid);
2389 LOGW ("wrong format of transaction\n");
2391 } else if (cmd == ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE) {
2392 m_info_manager->reset_keyboard_ise();
2393 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
2396 if (m_recv_trans.get_data(uuid)) {
2397 m_info_manager->socket_set_keyboard_ise(uuid);
2399 LOGW ("wrong format of transaction\n");
2401 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
2404 if (m_recv_trans.get_data(uuid)) {
2405 m_info_manager->socket_get_keyboard_ise(uuid);
2407 LOGW ("wrong format of transaction\n");
2409 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY) {
2410 uint32 x, y, width, height;
2412 if (m_recv_trans.get_data(x) && m_recv_trans.get_data(y) &&
2413 m_recv_trans.get_data(width) && m_recv_trans.get_data(height)) {
2414 m_info_manager->socket_helper_update_ise_geometry(client_id, x, y, width, height);
2416 LOGW ("wrong format of transaction\n");
2418 } else if (cmd == ISM_TRANS_CMD_EXPAND_CANDIDATE) {
2419 m_info_manager->expand_candidate();
2420 } else if (cmd == ISM_TRANS_CMD_CONTRACT_CANDIDATE) {
2421 m_info_manager->contract_candidate();
2422 } else if (cmd == ISM_TRANS_CMD_SELECT_CANDIDATE) {
2425 if (m_recv_trans.get_data(index))
2426 m_info_manager->socket_helper_select_candidate(index);
2428 LOGW ("wrong format of transaction\n");
2429 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
2431 uint32 maxlen_before;
2432 uint32 maxlen_after;
2434 if (m_recv_trans.get_data(uuid) &&
2435 m_recv_trans.get_data(maxlen_before) &&
2436 m_recv_trans.get_data(maxlen_after)) {
2437 m_info_manager->socket_helper_get_surrounding_text(client_id, uuid, maxlen_before, maxlen_after);
2439 LOGW ("wrong format of transaction\n");
2441 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
2445 if (m_recv_trans.get_data(offset) && m_recv_trans.get_data(len)) {
2446 m_info_manager->socket_helper_delete_surrounding_text(client_id, offset, len);
2448 LOGW ("wrong format of transaction\n");
2450 } else if (cmd == SCIM_TRANS_CMD_GET_SELECTION) {
2453 if (m_recv_trans.get_data(uuid)) {
2454 m_info_manager->socket_helper_get_selection(client_id, uuid);
2456 LOGW ("wrong format of transaction\n");
2458 } else if (cmd == SCIM_TRANS_CMD_SET_SELECTION) {
2462 if (m_recv_trans.get_data(start) && m_recv_trans.get_data(end)) {
2463 m_info_manager->socket_helper_set_selection(client_id, start, end);
2465 LOGW ("wrong format of transaction\n");
2467 } else if (cmd == SCIM_TRANS_CMD_SEND_PRIVATE_COMMAND) {
2470 if (m_recv_trans.get_data(command)) {
2471 m_info_manager->socket_helper_send_private_command(client_id, command);
2473 LOGW ("wrong format of transaction\n");
2476 //} else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_EXIT) {
2477 // m_info_manager->UPDATE_ISE_EXIT(client_id);
2479 LOGW ("unknow cmd: %d\n", cmd);
2483 socket_transaction_end();
2484 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
2485 socket_transaction_start();
2487 while (m_recv_trans.get_command(cmd)) {
2488 LOGD ("PanelAgent::cmd = %d\n", cmd);
2490 if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE) {
2492 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2493 String default_uuid;
2494 m_info_manager->get_active_ise(client_id, default_uuid);
2496 Socket client_socket(client_id);
2499 trans.put_command(SCIM_TRANS_CMD_REPLY);
2500 trans.put_command(SCIM_TRANS_CMD_OK);
2501 trans.put_data(default_uuid);
2502 trans.write_to_socket(client_socket);
2505 LOGW ("Access denied to get active ise\n");
2506 send_fail_reply (client_id);
2508 } else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
2509 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2514 if (m_recv_trans.get_data(&buf, len)) {
2515 ret = m_info_manager->set_active_ise_by_uuid(client_id, buf, len);
2517 LOGW ("wrong format of transaction\n");
2521 Socket client_socket(client_id);
2524 trans.put_command(SCIM_TRANS_CMD_REPLY);
2525 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2526 trans.write_to_socket(client_socket);
2532 LOGW ("Access denied to set active ise\n");
2533 send_fail_reply (client_id);
2535 } else if (cmd == ISM_TRANS_CMD_SET_INITIAL_ISE_BY_UUID) {
2536 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2542 //ret need be checked
2543 if (m_recv_trans.get_data(&buf, len)) {
2544 m_info_manager->set_initial_ise_by_uuid(client_id, buf, len);
2546 LOGW ("wrong format of transaction\n");
2550 Socket client_socket(client_id);
2553 trans.put_command(SCIM_TRANS_CMD_REPLY);
2554 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2555 trans.write_to_socket(client_socket);
2561 LOGW ("Access denied to set initial ise\n");
2562 send_fail_reply (client_id);
2564 } else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST) {
2565 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2566 std::vector<String> strlist;
2567 m_info_manager->get_ise_list(client_id, strlist);
2569 Socket client_socket(client_id);
2575 trans.put_command(SCIM_TRANS_CMD_REPLY);
2576 trans.put_command(SCIM_TRANS_CMD_OK);
2578 num = strlist.size();
2579 trans.put_data(num);
2581 for (unsigned int i = 0; i < num; i++) {
2582 buf = const_cast<char*>(strlist[i].c_str());
2583 len = strlen(buf) + 1;
2584 trans.put_data(buf, len);
2587 trans.write_to_socket(client_socket);
2590 LOGW ("Access denied to get ise list\n");
2591 send_fail_reply (client_id);
2593 } else if (cmd == ISM_TRANS_CMD_GET_ALL_HELPER_ISE_INFO) {
2594 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2595 HELPER_ISE_INFO info;
2596 m_info_manager->get_all_helper_ise_info(client_id, info);
2600 Socket client_socket(client_id);
2603 trans.put_command(SCIM_TRANS_CMD_REPLY);
2604 trans.put_command(SCIM_TRANS_CMD_OK);
2606 if (info.appid.size() > 0) {
2607 trans.put_data(info.appid);
2608 trans.put_data(info.label);
2609 trans.put_data(info.is_enabled);
2610 trans.put_data(info.is_preinstalled);
2611 trans.put_data(info.has_option);
2614 trans.write_to_socket(client_socket);
2618 LOGW ("Access denied to get all helper ise info\n");
2619 send_fail_reply (client_id);
2621 } else if (cmd == ISM_TRANS_CMD_SET_ENABLE_HELPER_ISE_INFO) {
2622 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2627 if (m_recv_trans.get_data(appid) && appid.length() != 0 && m_recv_trans.get_data(is_enabled)) {
2628 m_info_manager->set_enable_helper_ise_info(client_id, appid, is_enabled);
2631 LOGW ("wrong format of transaction\n");
2635 Socket client_socket(client_id);
2638 trans.put_command(SCIM_TRANS_CMD_REPLY);
2639 trans.put_command(ret ? SCIM_TRANS_CMD_OK : SCIM_TRANS_CMD_FAIL);
2640 trans.write_to_socket(client_socket);
2643 LOGW ("Access denied to set enable helper ise info\n");
2644 send_fail_reply (client_id);
2646 } else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION) {
2647 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2648 String strUuid, strName, strLanguage, strModuleName;
2652 if (m_recv_trans.get_data(strUuid)) {
2653 m_info_manager->get_ise_information(client_id, strUuid, strName, strLanguage, nType, nOption, strModuleName);
2655 LOGW ("wrong format of transaction\n");
2659 Socket client_socket(client_id);
2661 trans.put_command(SCIM_TRANS_CMD_REPLY);
2662 trans.put_command(SCIM_TRANS_CMD_OK);
2663 trans.put_data(strName);
2664 trans.put_data(strLanguage);
2665 trans.put_data(nType);
2666 trans.put_data(nOption);
2667 trans.put_data(strModuleName);
2668 trans.write_to_socket(client_socket);
2671 LOGW ("Access denied to get ise information\n");
2672 send_fail_reply (client_id);
2674 } else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION) {
2675 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2677 Socket client_socket(client_id);
2680 trans.put_command(SCIM_TRANS_CMD_REPLY);
2681 trans.put_command(SCIM_TRANS_CMD_OK);
2682 trans.write_to_socket(client_socket);
2683 m_info_manager->show_helper_ise_selector(client_id);
2684 m_info_manager->reset_ise_option(client_id);
2687 LOGW ("Access denied to reset ise option\n");
2688 send_fail_reply (client_id);
2690 } else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE) {
2691 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2692 m_info_manager->reset_default_ise(client_id);
2695 LOGW ("Access denied to reset default ise\n");
2696 send_fail_reply (client_id);
2698 } else if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
2699 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2700 m_info_manager->show_isf_panel(client_id);
2703 LOGW ("Access denied to show isf control\n");
2704 send_fail_reply (client_id);
2706 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
2707 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2708 m_info_manager->show_ise_option_window(client_id);
2711 LOGW ("Access denied to show ise option window\n");
2712 send_fail_reply (client_id);
2714 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_LIST) {
2715 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2717 Socket client_socket(client_id);
2720 trans.put_command(SCIM_TRANS_CMD_REPLY);
2721 trans.put_command(SCIM_TRANS_CMD_OK);
2722 trans.write_to_socket(client_socket);
2724 m_info_manager->show_helper_ise_list(client_id);
2727 LOGW ("Access denied to show helper ise list\n");
2728 send_fail_reply (client_id);
2730 } else if (cmd == ISM_TRANS_CMD_SHOW_HELPER_ISE_SELECTOR) {
2731 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2733 Socket client_socket(client_id);
2736 trans.put_command(SCIM_TRANS_CMD_REPLY);
2737 trans.put_command(SCIM_TRANS_CMD_OK);
2738 trans.write_to_socket(client_socket);
2739 m_info_manager->show_helper_ise_selector(client_id);
2742 LOGW ("Access denied to show helper ise selector\n");
2743 send_fail_reply (client_id);
2745 } else if (cmd == ISM_TRANS_CMD_IS_HELPER_ISE_ENABLED) {
2746 if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
2748 uint32 nEnabled = 0;
2751 //ret need be checked
2752 m_info_manager->is_helper_ise_enabled(client_id, strAppid, nEnabled);
2754 Socket client_socket(client_id);
2756 trans.put_command(SCIM_TRANS_CMD_REPLY);
2759 trans.put_command(SCIM_TRANS_CMD_OK);
2760 trans.put_data(static_cast<uint32>(nEnabled));
2762 trans.put_command(SCIM_TRANS_CMD_FAIL);
2765 trans.write_to_socket(client_socket);
2768 LOGW ("Access denied to check helper ise enabled\n");
2769 send_fail_reply (client_id);
2771 } else if (cmd == ISM_TRANS_CMD_GET_RECENT_ISE_GEOMETRY) {
2775 Socket client_socket(client_id);
2778 trans.put_command(SCIM_TRANS_CMD_REPLY);
2780 if (m_recv_trans.get_data(angle)) {
2781 struct rectinfo info = {0, 0, 0, 0};
2782 m_info_manager->get_recent_ise_geometry(client_id, angle, info);
2784 trans.put_command(SCIM_TRANS_CMD_OK);
2785 trans.put_data(info.pos_x);
2786 trans.put_data(info.pos_y);
2787 trans.put_data(info.width);
2788 trans.put_data(info.height);
2790 trans.put_command(SCIM_TRANS_CMD_FAIL);
2793 trans.write_to_socket(client_socket);
2795 LOGW ("unknow cmd: %d\n", cmd);
2799 socket_transaction_end();
2803 void socket_exception_callback(SocketServer* server,
2804 const Socket& client) {
2805 SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n";
2806 LOGD ("client id:%d\n", client.get_id());
2807 socket_close_connection(server, client);
2810 bool socket_open_connection(SocketServer* server,
2811 const Socket& client) {
2812 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n";
2813 LOGD ("client id:%d\n", client.get_id());
2815 String type = scim_socket_accept_connection(key,
2817 String("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
2821 if (type.length()) {
2822 ClientType _type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
2823 ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
2824 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
2825 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
2826 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT)))));
2828 m_info_manager->add_client(client.get_id(), key, _type);
2832 LOGW ("open_connection failed\n");
2834 SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id() << "\n";
2835 server->close_connection(client);
2839 void socket_close_connection(SocketServer* server,
2840 const Socket& client) {
2841 SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id() << ")\n";
2842 LOGD ("client id:%d\n", client.get_id());
2844 std::vector<Ecore_Fd_Handler *>::iterator IterPos;
2846 for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
2847 if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id()) {
2848 ecore_main_fd_handler_del (_read_handler_list[i]);
2849 _read_handler_list.erase (IterPos);
2853 m_info_manager->del_client(client.get_id());
2856 void socket_transaction_start(void) {
2857 //m_signal_transaction_start ();
2860 void socket_transaction_end(void) {
2861 //m_signal_transaction_end ();
2868 //m_signal_unlock ();
2872 } /* namespace scim */
2874 /***************************************************/
2875 /*** Beginning of panel agent interface for ISF ***/
2876 /***************************************************/
2877 static scim::PanelAgentPointer instance;
2881 EXAPI void scim_module_init(void)
2885 EXAPI void scim_module_exit(void)
2890 EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config)
2894 EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance()
2896 scim::PanelAgentBase* _instance = NULL;
2897 if (instance.null()) {
2899 _instance = new scim::EcoreSocketPanelAgent();
2905 instance = _instance;
2912 vi:ts=4:nowrap:ai:expandtab