From: Jihoon Kim Date: Fri, 2 Sep 2016 08:37:02 +0000 (-0700) Subject: Revert "Add SocketConfigServer PanelAgent module" X-Git-Tag: accepted/tizen/common/20160905.171257~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F70%2F86670%2F3;p=platform%2Fcore%2Fuifw%2Fisf.git Revert "Add SocketConfigServer PanelAgent module" This reverts commit 7a52b8ac8201bc724a5b2339e1e40e92adadcfb9. Change-Id: I352a1d4b06fb08b5bed68bfe1c92225556e2e9f9 --- diff --git a/configure.ac b/configure.ac index f25a1db..304f6c9 100644 --- a/configure.ac +++ b/configure.ac @@ -832,7 +832,6 @@ AC_CONFIG_FILES([Makefile ism/modules/config/Makefile ism/modules/panelagent/ecoresocket/Makefile ism/modules/panelagent/wayland/Makefile - ism/modules/panelagent/socketconfigserver/Makefile ism/configs/Makefile ism/extras/Makefile ism/extras/gtk2_immodule/Makefile diff --git a/ism/configs/global b/ism/configs/global index 600b976..bd675f4 100755 --- a/ism/configs/global +++ b/ism/configs/global @@ -3,7 +3,7 @@ /DefaultConfigModule = simple /DefaultSocketFrontEndAddress = local:/tmp/scim-socket-frontend /DefaultSocketIMEngineAddress = local:/tmp/scim-socket-frontend -/DefaultSocketConfigAddress = local:/tmp/scim-socket-config +/DefaultSocketConfigAddress = local:/tmp/scim-panel-socket /DefaultPanelSocketAddress = local:/tmp/scim-panel-socket /DefaultHelperManagerSocketAddress = local:/tmp/scim-socket-frontend /DefaultSocketTimeout = 5000 diff --git a/ism/extras/efl_panel/isf_panel_efl.cpp b/ism/extras/efl_panel/isf_panel_efl.cpp index 2a5b08a..cf55a34 100644 --- a/ism/extras/efl_panel/isf_panel_efl.cpp +++ b/ism/extras/efl_panel/isf_panel_efl.cpp @@ -1814,6 +1814,7 @@ static bool set_active_ise (const String &uuid, bool launch_ise) _config->flush (); _config->reload (); + _info_manager->reload_config (); #if HAVE_VCONF vconf_set_str (VCONFKEY_ISF_ACTIVE_KEYBOARD_UUID, uuid.c_str ()); @@ -1852,6 +1853,7 @@ static void load_config (void) static void config_reload_cb (const ConfigPointer &config) { SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n"; + _info_manager->reload_config(); /* load_config (); */ } @@ -5774,9 +5776,10 @@ static void slot_set_keyboard_ise (const String &uuid) String language = String ("~other");/*scim_get_locale_language (scim_get_current_locale ());*/ _config->write (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, uuid); _config->flush (); + _config->reload (); _info_manager->change_factory (uuid); - _config->reload (); + _info_manager->reload_config (); } /** @@ -6424,6 +6427,7 @@ static void change_keyboard_mode (TOOLBAR_MODE_T mode) _ise_state = WINDOW_STATE_HIDE; _info_manager->set_current_toolbar_mode (TOOLBAR_KEYBOARD_MODE); _info_manager->hide_helper (helper_uuid); + _info_manager->reload_config (); /* Check whether stop soft keyboard */ if (_focus_in && (_ime_info[get_ise_index (helper_uuid)].options & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)) { diff --git a/ism/modules/Makefile.am b/ism/modules/Makefile.am index cd4e894..fe3a45d 100644 --- a/ism/modules/Makefile.am +++ b/ism/modules/Makefile.am @@ -18,4 +18,4 @@ MAINTAINERCLEANFILES = Makefile.in CLEANFILES = *.bak -SUBDIRS = frontend imengine config filter panelagent/ecoresocket panelagent/wayland panelagent/socketconfigserver +SUBDIRS = frontend imengine config filter panelagent/ecoresocket panelagent/wayland diff --git a/ism/modules/config/scim_socket_config.cpp b/ism/modules/config/scim_socket_config.cpp index b001f4b..a053cf1 100644 --- a/ism/modules/config/scim_socket_config.cpp +++ b/ism/modules/config/scim_socket_config.cpp @@ -87,6 +87,13 @@ SocketConfig::SocketConfig () { SCIM_DEBUG_CONFIG (2) << " Construct SocketConfig object.\n"; + String display_name; + { + const char *p = getenv ("DISPLAY"); + if (p) display_name = String (p); + } + m_socket_address = scim_get_default_panel_socket_address (display_name); + m_valid = open_connection (); } diff --git a/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp b/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp index fab2a5d..5e614c9 100755 --- a/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp +++ b/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp @@ -78,6 +78,9 @@ struct IMControlStub { #define scim_panel_agent_module_get_instance ecoresocket_LTX_scim_panel_agent_module_get_instance +static ConfigPointer _config; + + //==================================== PanelAgent =========================== class EcoreSocketPanelAgent: public PanelAgentBase { @@ -93,6 +96,7 @@ class EcoreSocketPanelAgent: public PanelAgentBase bool m_should_shared_ise; bool m_ise_exiting; + bool m_config_readonly; std::vector _read_handler_list; @@ -104,7 +108,8 @@ public: m_should_exit(false), m_socket_timeout(scim_get_default_socket_timeout()), m_should_shared_ise(false), - m_ise_exiting(false) { + m_ise_exiting(false), + m_config_readonly (false) { m_socket_server.signal_connect_accept(slot(this, &EcoreSocketPanelAgent::socket_accept_callback)); m_socket_server.signal_connect_receive(slot(this, &EcoreSocketPanelAgent::socket_receive_callback)); m_socket_server.signal_connect_exception(slot(this, &EcoreSocketPanelAgent::socket_exception_callback)); @@ -122,6 +127,13 @@ public: m_info_manager = info_manager; m_socket_address = scim_get_default_panel_socket_address(display); + if (!_config.null ()) + m_config_readonly = _config->read (String (SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY), false); + else { + m_config_readonly = false; + LOGW("config is not ready"); + } + m_socket_server.shutdown(); if (m_socket_server.create(SocketAddress(m_socket_address))) { @@ -148,6 +160,7 @@ public: if (client.connect(SocketAddress(m_socket_address))) { client.close(); } + _config.reset(); } private: void update_panel_event(int client, uint32 context_id, int cmd, uint32 nType, uint32 nValue) { @@ -2504,6 +2517,10 @@ private: m_info_manager->socket_helper_update_property(client_id, property); else LOGW ("wrong format of transaction\n"); +#if 0 //only receives reload message by socketconfig + } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) { + m_info_manager->reload_config(); +#endif } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) { uint32 type; uint32 value; @@ -3044,6 +3061,401 @@ private: } socket_transaction_end(); + } else if (client_info.type == CONFIG_CLIENT) { + socket_transaction_start (); + while (m_recv_trans.get_command (cmd)) { + LOGD ("PanelAgent::cmd = %d\n", cmd); + + if (cmd == SCIM_TRANS_CMD_FLUSH_CONFIG) { + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + SCIM_DEBUG_FRONTEND (2) << " socket_flush_config.\n"; + + _config->flush (); + + } else if (cmd == SCIM_TRANS_CMD_ERASE_CONFIG) { + + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_erase_config.\n"; + + if (m_recv_trans.get_data (key)) { + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + _config->erase (key); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) { + + SCIM_DEBUG_FRONTEND (2) << " socket_reload_config.\n"; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + + if (_config.null ()) { + LOGW ("config is not ready"); + m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); + } else { + static timeval last_timestamp = {0, 0}; + + timeval timestamp; + + gettimeofday (×tamp, 0); + + if (timestamp.tv_sec >= last_timestamp.tv_sec) + _config->reload (); + + gettimeofday (&last_timestamp, 0); + m_send_trans.put_command (SCIM_TRANS_CMD_OK); + } + + m_send_trans.write_to_socket (client_socket); + + } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_STRING) { + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_get_config_string.\n"; + + if (m_recv_trans.get_data (key)) { + String value; + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + if (!_config.null () && _config->read (key, &value)) { + m_send_trans.put_data (value); + m_send_trans.put_command (SCIM_TRANS_CMD_OK); + } else { + m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); + LOGW ("read config key = %s faided\n", key.c_str()); + } + m_send_trans.write_to_socket (client_socket); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_STRING) { + String key; + String value; + + SCIM_DEBUG_FRONTEND (2) << " socket_set_config_string.\n"; + + if (m_recv_trans.get_data (key) && + m_recv_trans.get_data (value)) { + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + _config->write (key, value); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_INT) { + if (_config.null ()) { + LOGW ("config not ready"); + break; + } + + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_get_config_int.\n"; + + if (m_recv_trans.get_data (key)) { + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + + int value; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + if (_config->read (key, &value)) { + m_send_trans.put_data ((uint32) value); + m_send_trans.put_command (SCIM_TRANS_CMD_OK); + } else { + m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); + LOGW ("read config key = %s faided\n", key.c_str()); + } + m_send_trans.write_to_socket (client_socket); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_INT) { + + String key; + uint32 value; + + SCIM_DEBUG_FRONTEND (2) << " socket_set_config_int.\n"; + + if (m_recv_trans.get_data (key) && + m_recv_trans.get_data (value)) { + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + _config->write (key, (int) value); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_BOOL) { + + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_get_config_bool.\n"; + + if (m_recv_trans.get_data (key)) { + bool value; + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + + if (!_config.null () && _config->read (key, &value)) { + m_send_trans.put_data ((uint32) value); + m_send_trans.put_command (SCIM_TRANS_CMD_OK); + } else { + m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); + LOGW ("read config key = %s faided\n", key.c_str()); + } + m_send_trans.write_to_socket (client_socket); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_BOOL) { + + String key; + uint32 value; + + SCIM_DEBUG_FRONTEND (2) << " socket_set_config_bool.\n"; + + if (m_recv_trans.get_data (key) && + m_recv_trans.get_data (value)) { + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + _config->write (key, (bool) value); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_DOUBLE) { + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_get_config_double.\n"; + + if (m_recv_trans.get_data (key)) { + double value; + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + + if (!_config.null () && _config->read (key, &value)) { + char buf [80]; + snprintf (buf, 79, "%lE", value); + m_send_trans.put_data (String (buf)); + m_send_trans.put_command (SCIM_TRANS_CMD_OK); + } else { + m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); + LOGW ("read config key = %s faided\n", key.c_str()); + } + m_send_trans.write_to_socket (client_socket); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_DOUBLE) { + + String key; + String str; + + SCIM_DEBUG_FRONTEND (2) << " socket_set_config_double.\n"; + + if (m_recv_trans.get_data (key) && + m_recv_trans.get_data (str)) { + double value; + sscanf (str.c_str (), "%lE", &value); + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + _config->write (key, value); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_VECTOR_STRING) { + + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_get_config_vector_string.\n"; + + if (m_recv_trans.get_data (key)) { + std::vector vec; + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + + if (!_config.null () && _config->read (key, &vec)) { + m_send_trans.put_data (vec); + m_send_trans.put_command (SCIM_TRANS_CMD_OK); + } else { + m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); + LOGW ("read config key = %s faided\n", key.c_str()); + } + m_send_trans.write_to_socket (client_socket); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_VECTOR_STRING) { + + String key; + std::vector vec; + + SCIM_DEBUG_FRONTEND (2) << " socket_set_config_vector_string.\n"; + + if (m_recv_trans.get_data (key) && + m_recv_trans.get_data (vec)) { + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + _config->write (key, vec); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_VECTOR_INT) { + + String key; + + SCIM_DEBUG_FRONTEND (2) << " socket_get_config_vector_int.\n"; + + if (m_recv_trans.get_data (key)) { + std::vector vec; + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + Socket client_socket (client_id); + m_send_trans.clear (); + m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); + + if (!_config.null () && _config->read (key, &vec)) { + std::vector reply; + + for (uint32 i=0; i vec; + + SCIM_DEBUG_FRONTEND (2) << " socket_set_config_vector_int.\n"; + + if (m_recv_trans.get_data (key) && + m_recv_trans.get_data (vec)) { + if (m_config_readonly) { + LOGW ("sorry config readonly"); + continue; + } + if (_config.null ()) { + LOGW ("config is not ready"); + continue; + } + std::vector req; + + SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; + + for (uint32 i=0; iwrite (key, req); + } else { + LOGW ("wrong format of transaction\n"); + break; + } + + } + } + + socket_transaction_end (); } } @@ -3142,6 +3554,7 @@ extern "C" { EXAPI void scim_panel_agent_module_init(const scim::ConfigPointer& config) { LOGD (""); + scim::_config = config; } EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance() diff --git a/ism/modules/panelagent/socketconfigserver/Makefile.am b/ism/modules/panelagent/socketconfigserver/Makefile.am deleted file mode 100644 index 6ac0b5f..0000000 --- a/ism/modules/panelagent/socketconfigserver/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -MAINTAINERCLEANFILES = Makefile.in -CLEANFILES = *.bak *.edj -EXTRA_DIST = socketconfigserver.version-script - -AM_CPPFLAGS = -I$(top_builddir) \ - -I$(top_builddir)/ism/src \ - -I$(top_srcdir) \ - -I$(top_srcdir)/ism/src \ - -I$(top_srcdir)/ism/intl \ - -I$(top_srcdir)/ism/data \ - -I$(top_srcdir)/ism/utils \ - -I$(includedir) \ - -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \ - -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \ - -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \ - -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \ - -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \ - -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \ - -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\" - -noinst_HEADERS = - - -CONFIG_SOCKETCONFIGSERVER_PANELAGENT_MODULE = socket_config_server.la - - -if SCIM_LD_VERSION_SCRIPT -LD_VERSION_SCRIPT_OPTION="-Wl,--version-script=$(srcdir)/socketconfigserver.version-script" -endif - -moduledir = @SCIM_MODULE_PATH@/$(SCIM_BINARY_VERSION)/PanelAgent -module_LTLIBRARIES = $(CONFIG_SOCKETCONFIGSERVER_PANELAGENT_MODULE) - -socket_config_server_la_SOURCES = socket_config_server_panel_agent_module.cpp - -socket_config_server_la_CXXFLAGS = @DLOG_CFLAGS@ @ECORE_CFLAGS@ - -socket_config_server_la_LDFLAGS = -avoid-version \ - -rpath $(moduledir) \ - -module \ - $(LD_VERSION_SCRIPT_OPTION) \ - @LIBTOOL_EXPORT_OPTIONS@ \ - @LTLIBINTL@ \ - @DLOG_LIBS@ \ - @ECORE_LIBS@ - -socket_config_server_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la diff --git a/ism/modules/panelagent/socketconfigserver/socket_config_server_panel_agent_module.cpp b/ism/modules/panelagent/socketconfigserver/socket_config_server_panel_agent_module.cpp deleted file mode 100644 index 60e5ed8..0000000 --- a/ism/modules/panelagent/socketconfigserver/socket_config_server_panel_agent_module.cpp +++ /dev/null @@ -1,814 +0,0 @@ -/* - * ISF(Input Service Framework) - * - * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. - * Copyright (c) 2016 Samsung Electronics Co., Ltd. - * - * Contact: Li Zhang - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation; either version 2.1 of the License, or (at your option) - * any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#define Uses_SCIM_TRANSACTION -#define Uses_SCIM_TRANS_COMMANDS -#define Uses_SCIM_PANEL_AGENT -#define Uses_SCIM_SOCKET -#define Uses_SCIM_EVENT -#define Uses_SCIM_CONFIG -#define Uses_SCIM_CONFIG_MODULE -#define Uses_SCIM_CONFIG_PATH -#define Uses_SCIM_UTILITY - -#include -#include -#include -#include -#include -#include -#include "scim_private.h" -#include "scim.h" -#include "scim_stl_map.h" - -#ifdef LOG_TAG -# undef LOG_TAG -#endif -#define LOG_TAG "ISF_SOCKET_CONFIG_SERVER_MODULE" - -#define SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY "/Panel/Socket/ConfigReadOnly" - - -namespace scim -{ - -#if SCIM_USE_STL_EXT_HASH_MAP -typedef __gnu_cxx::hash_map > ClientRepository; -#elif SCIM_USE_STL_HASH_MAP -typedef std::hash_map > ClientRepository; -#else -typedef std::map ClientRepository; -#endif - - -#define scim_module_init socketconfigserver_LTX_scim_module_init -#define scim_module_exit socketconfigserver_LTX_scim_module_exit -#define scim_panel_agent_module_init socketconfigserver_LTX_scim_panel_agent_module_init -#define scim_panel_agent_module_get_instance socketconfigserver_LTX_scim_panel_agent_module_get_instance - - -static ConfigPointer _config; - - -class SocketConfigServerPanelAgent: public PanelAgentBase -{ - bool m_should_exit; - - int m_socket_timeout; - String m_socket_address; - SocketServer m_socket_server; - - Transaction m_send_trans; - Transaction m_recv_trans; - - bool m_ise_exiting; - bool m_config_readonly; - - ClientRepository m_clients; - std::vector _read_handler_list; - Connection m_config_connection; - -public: - SocketConfigServerPanelAgent () - : PanelAgentBase ("socket_config_server"), - m_should_exit (false), - m_socket_timeout (scim_get_default_socket_timeout ()), - m_ise_exiting (false), - m_config_readonly (false) { - m_socket_server.signal_connect_accept (slot (this, &SocketConfigServerPanelAgent::socket_accept_callback)); - m_socket_server.signal_connect_receive (slot (this, &SocketConfigServerPanelAgent::socket_receive_callback)); - m_socket_server.signal_connect_exception (slot (this, &SocketConfigServerPanelAgent::socket_exception_callback)); - } - - ~SocketConfigServerPanelAgent () { - for (unsigned int ii = 0; ii < _read_handler_list.size (); ++ii) { - ecore_main_fd_handler_del (_read_handler_list[ii]); - } - _read_handler_list.clear (); - } - - bool initialize (InfoManager* info_manager, const String& display, bool resident) { - LOGD (""); - m_socket_address = scim_get_default_socket_config_address (); - - if (!_config.null ()) - m_config_readonly = _config->read (String (SCIM_CONFIG_PANEL_SOCKET_CONFIG_READONLY), false); - else { - m_config_readonly = false; - LOGW ("config is not ready"); - } - - m_config_connection = _config->signal_connect_reload (slot (this, &SocketConfigServerPanelAgent::reload_config_callback)); - - m_socket_server.shutdown (); - - if (m_socket_server.create (SocketAddress (m_socket_address))) { - Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add (m_socket_server.get_id (), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL); - _read_handler_list.push_back (panel_agent_read_handler); - return true; - } - - LOGE ("create socketconfig server failed\n"); - return false; - } - - bool valid (void) const { - return m_socket_server.valid (); - } - - void stop (void) { - SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n"; - LOGD (""); - m_config_connection.disconnect (); - lock (); - m_should_exit = true; - unlock (); - SocketClient client; - if (client.connect (SocketAddress (m_socket_address))) { - client.close (); - } - m_socket_server.shutdown (); - m_clients.clear (); - _config.reset (); - } -private: - - void reload_config_callback (const ConfigPointer &config) { - - SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n"; - LOGD (""); - for (unsigned int ii = 0; ii < _read_handler_list.size (); ++ii) { - - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - m_send_trans.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG); - - Socket client_socket (ecore_main_fd_handler_fd_get (_read_handler_list[ii])); - m_send_trans.write_to_socket (client_socket); - } - } - -private: - - bool socket_check_client_connection (const Socket& client) { - SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_check_client_connection (" << client.get_id () << ")\n"; - - unsigned char buf [sizeof(uint32)]; - - int nbytes = client.read_with_timeout (buf, sizeof(uint32), m_socket_timeout); - - if (nbytes == sizeof(uint32)) - return true; - - if (nbytes < 0) { - LOGW ("Error occurred when reading socket: %s\n", client.get_error_message ().c_str()); - } else { - LOGW ("Timeout when reading socket\n"); - } - - return false; - } - - /** - * @brief Callback function for ecore fd handler. - * - * @param data The data to pass to this callback. - * @param fd_handler The ecore fd handler. - * - * @return ECORE_CALLBACK_RENEW - */ - static Eina_Bool panel_agent_handler (void* data, Ecore_Fd_Handler* fd_handler) { - if (fd_handler == NULL || data == NULL) - return ECORE_CALLBACK_RENEW; - - SocketConfigServerPanelAgent* _agent = (SocketConfigServerPanelAgent*)data; - - int fd = ecore_main_fd_handler_fd_get (fd_handler); - - for (unsigned int i = 0; i < _agent->_read_handler_list.size (); i++) { - if (fd_handler == _agent->_read_handler_list [i]) { - if (!_agent->filter_event (fd)) { - std::cerr << "_panel_agent->filter_event () is failed!!!\n"; - ::close (fd); - ecore_main_fd_handler_del (fd_handler); - - ISF_SAVE_LOG ("_panel_agent->filter_event (fd=%d) is failed!!!\n", fd); - } - - return ECORE_CALLBACK_RENEW; - } - } - - std::cerr << "panel_agent_handler () has received exception event!!!\n"; - _agent->filter_exception_event (fd); - ::close (fd); - ecore_main_fd_handler_del (fd_handler); - - ISF_SAVE_LOG ("Received exception event (fd=%d)!!!\n", fd); - return ECORE_CALLBACK_RENEW; - } - - void socket_accept_callback (SocketServer* server, - const Socket& client) { - SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_accept_callback (" << client.get_id () << ")\n"; - LOGD (""); - lock (); - - if (m_should_exit) { - SCIM_DEBUG_MAIN (3) << "Exit Socket Server Thread.\n"; - server->shutdown(); - } else { - //m_signal_accept_connection (client.get_id ()); - Ecore_Fd_Handler* panel_agent_read_handler = ecore_main_fd_handler_add (client.get_id (), ECORE_FD_READ, panel_agent_handler, this, NULL, NULL); - _read_handler_list.push_back (panel_agent_read_handler); - } - - unlock (); - } - - void socket_receive_callback (SocketServer* server, - const Socket& client) { - int client_id = client.get_id (); - int cmd = 0; - uint32 key = 0; - - ClientInfo client_info; - - SCIM_DEBUG_MAIN(1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n"; - - /* If the connection is closed then close this client. */ - if (!socket_check_client_connection (client)) { - LOGW ("check client connection failed\n"); - socket_close_connection (server, client); - return; - } - - ClientRepository::iterator it = m_clients.find (client.get_id ()); - if (it == m_clients.end ()) { - socket_open_connection (server, client); - return; - } else - client_info = it->second; - - /* If can not read the transaction, - * or the transaction is not started with SCIM_TRANS_CMD_REQUEST, - * or the key is mismatch, - * just return. */ - if (!m_recv_trans.read_from_socket (client, m_socket_timeout) || - !m_recv_trans.get_command (cmd) || cmd != SCIM_TRANS_CMD_REQUEST || - !m_recv_trans.get_data (key) || key != (uint32) client_info.key) { - LOGW ("cmd:%d key:%d client info key: %d\n", cmd, key, client_info.key); - return; - } - - { - socket_transaction_start (); - while (m_recv_trans.get_command (cmd)) { - LOGD ("PanelAgent::cmd = %d\n", cmd); - - if (cmd == SCIM_TRANS_CMD_FLUSH_CONFIG) { - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - SCIM_DEBUG_FRONTEND (2) << " socket_flush_config.\n"; - - _config->flush (); - - } else if (cmd == SCIM_TRANS_CMD_ERASE_CONFIG) { - - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_erase_config.\n"; - - if (m_recv_trans.get_data (key)) { - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - _config->erase (key); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) { - - SCIM_DEBUG_FRONTEND (2) << " socket_reload_config.\n"; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - - if (_config.null ()) { - LOGW ("config is not ready"); - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - } else { - static timeval last_timestamp = {0, 0}; - - timeval timestamp; - - gettimeofday (×tamp, 0); - - if (timestamp.tv_sec >= last_timestamp.tv_sec) - _config->reload (); - - gettimeofday (&last_timestamp, 0); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } - - m_send_trans.write_to_socket (client_socket); - - } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_STRING) { - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_get_config_string.\n"; - - if (m_recv_trans.get_data (key)) { - String value; - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - if (!_config.null () && _config->read (key, &value)) { - LOGD ("get %s:%s", key.c_str (), value.c_str ()); - m_send_trans.put_data (value); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } else { - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - LOGW ("read config key = %s faided\n", key.c_str ()); - } - m_send_trans.write_to_socket (client_socket); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_STRING) { - String key; - String value; - - SCIM_DEBUG_FRONTEND (2) << " socket_set_config_string.\n"; - - if (m_recv_trans.get_data (key) && - m_recv_trans.get_data (value)) { - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - LOGD ("set %s:%s", key.c_str (), value.c_str ()); - _config->write (key, value); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_INT) { - if (_config.null ()) { - LOGW ("config not ready"); - break; - } - - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_get_config_int.\n"; - - if (m_recv_trans.get_data (key)) { - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - - int value; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - if (_config->read (key, &value)) { - LOGD ("get %s:%d", key.c_str (), value); - m_send_trans.put_data ((uint32) value); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } else { - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - LOGW ("read config key = %s faided\n", key.c_str ()); - } - m_send_trans.write_to_socket (client_socket); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_INT) { - - String key; - uint32 value; - - SCIM_DEBUG_FRONTEND (2) << " socket_set_config_int.\n"; - - if (m_recv_trans.get_data (key) && - m_recv_trans.get_data (value)) { - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - LOGD ("set %s:%d", key.c_str (), value); - _config->write (key, (int) value); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_BOOL) { - - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_get_config_bool.\n"; - - if (m_recv_trans.get_data (key)) { - bool value; - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - - if (!_config.null () && _config->read (key, &value)) { - m_send_trans.put_data ((uint32) value); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } else { - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - LOGW ("read config key = %s faided\n", key.c_str ()); - } - m_send_trans.write_to_socket (client_socket); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_BOOL) { - - String key; - uint32 value; - - SCIM_DEBUG_FRONTEND (2) << " socket_set_config_bool.\n"; - - if (m_recv_trans.get_data (key) && - m_recv_trans.get_data (value)) { - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - _config->write (key, (bool) value); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_DOUBLE) { - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_get_config_double.\n"; - - if (m_recv_trans.get_data (key)) { - double value; - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - - if (!_config.null () && _config->read (key, &value)) { - char buf [80]; - snprintf (buf, 79, "%lE", value); - m_send_trans.put_data (String (buf)); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } else { - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - LOGW ("read config key = %s faided\n", key.c_str()); - } - m_send_trans.write_to_socket (client_socket); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_DOUBLE) { - - String key; - String str; - - SCIM_DEBUG_FRONTEND (2) << " socket_set_config_double.\n"; - - if (m_recv_trans.get_data (key) && - m_recv_trans.get_data (str)) { - double value; - sscanf (str.c_str (), "%lE", &value); - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n"; - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - _config->write (key, value); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_VECTOR_STRING) { - - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_get_config_vector_string.\n"; - - if (m_recv_trans.get_data (key)) { - std::vector vec; - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - - if (!_config.null () && _config->read (key, &vec)) { - m_send_trans.put_data (vec); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } else { - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - LOGW ("read config key = %s faided\n", key.c_str()); - } - m_send_trans.write_to_socket (client_socket); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_VECTOR_STRING) { - - String key; - std::vector vec; - - SCIM_DEBUG_FRONTEND (2) << " socket_set_config_vector_string.\n"; - - if (m_recv_trans.get_data (key) && - m_recv_trans.get_data (vec)) { - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - _config->write (key, vec); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_VECTOR_INT) { - - String key; - - SCIM_DEBUG_FRONTEND (2) << " socket_get_config_vector_int.\n"; - - if (m_recv_trans.get_data (key)) { - std::vector vec; - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - Socket client_socket (client_id); - m_send_trans.clear (); - m_send_trans.put_command (SCIM_TRANS_CMD_REPLY); - - if (!_config.null () && _config->read (key, &vec)) { - std::vector reply; - - for (uint32 i=0; i < vec.size (); ++i) - reply.push_back ((uint32) vec[i]); - - m_send_trans.put_data (reply); - m_send_trans.put_command (SCIM_TRANS_CMD_OK); - } else { - m_send_trans.put_command (SCIM_TRANS_CMD_FAIL); - LOGW ("read config key = %s faided\n", key.c_str()); - } - m_send_trans.write_to_socket (client_socket); - - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_VECTOR_INT) { - - String key; - std::vector vec; - - SCIM_DEBUG_FRONTEND (2) << " socket_set_config_vector_int.\n"; - - if (m_recv_trans.get_data (key) && - m_recv_trans.get_data (vec)) { - if (m_config_readonly) { - LOGW ("sorry config readonly"); - continue; - } - if (_config.null ()) { - LOGW ("config is not ready"); - continue; - } - std::vector req; - - SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n"; - - for (uint32 i=0; i < vec.size (); ++i) - req.push_back ((int) vec[i]); - - _config->write (key, req); - } else { - LOGW ("wrong format of transaction\n"); - break; - } - - } - } - - socket_transaction_end (); - } - } - - void socket_exception_callback (SocketServer* server, - const Socket& client) { - SCIM_DEBUG_MAIN(2) << "PanelAgent::socket_exception_callback (" << client.get_id() << ")\n"; - LOGD ("client id:%d\n", client.get_id ()); - socket_close_connection (server, client); - } - - bool socket_open_connection (SocketServer* server, - const Socket& client) { - SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_open_connection (" << client.get_id() << ")\n"; - LOGD ("client id:%d\n", client.get_id()); - uint32 key; - String type = scim_socket_accept_connection (key, - String ("Panel"), - String ("SocketConfig"), - client, - m_socket_timeout); - - SCIM_DEBUG_MAIN (3) << "type = " << type << "\n"; - if (type.length ()) { - ClientInfo info; - info.key = key; - info.type = CONFIG_CLIENT; - m_clients [client.get_id ()] = info; - return true; - } - LOGW ("open_connection failed\n"); - - SCIM_DEBUG_MAIN(4) << "Close client connection " << client.get_id () << "\n"; - server->close_connection (client); - return false; - } - - void socket_close_connection (SocketServer* server, - const Socket& client) { - SCIM_DEBUG_MAIN(3) << "PanelAgent::socket_close_connection (" << client.get_id () << ")\n"; - LOGD ("client id:%d\n", client.get_id ()); - - ClientRepository::iterator it = m_clients.find (client.get_id ()); - if (it != m_clients.end ()) - m_clients.erase (client.get_id ()); - - int i = 0; - std::vector::iterator IterPos; - - for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) { - if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == client.get_id ()) { - ecore_main_fd_handler_del (_read_handler_list[i]); - ::close (client.get_id ()); - _read_handler_list.erase (IterPos); - break; - } - } - LOGD ("client:%d , read handler: %d", m_clients.size (), _read_handler_list.size ()); - } - - bool filter_event (int fd) { - SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_event ()\n"; - - return m_socket_server.filter_event (fd); - } - - bool filter_exception_event (int fd) { - SCIM_DEBUG_MAIN(1) << "PanelAgent::filter_exception_event ()\n"; - - return m_socket_server.filter_exception_event (fd); - } - - void socket_transaction_start (void) { - //m_signal_transaction_start (); - } - - void socket_transaction_end (void) { - //m_signal_transaction_end (); - } - - void lock (void) { - //m_signal_lock (); - } - void unlock (void) { - //m_signal_unlock (); - } -}; - -} /* namespace scim */ - -/***************************************************/ -/*** Beginning of panel agent interface for ISF ***/ -/***************************************************/ -static scim::PanelAgentPointer instance; - -extern "C" { - - EXAPI void scim_module_init (void) - { - } - - EXAPI void scim_module_exit (void) - { - instance.reset (); - } - - EXAPI void scim_panel_agent_module_init (const scim::ConfigPointer& config) - { - LOGD (""); - scim::_config = config; - } - - EXAPI scim::PanelAgentPointer scim_panel_agent_module_get_instance () - { - scim::PanelAgentBase* _instance = NULL; - if (instance.null ()) { - try { - _instance = new scim::SocketConfigServerPanelAgent (); - } catch (...) { - delete _instance; - _instance = NULL; - } - if (_instance) - instance = _instance; - } - return instance; - } -} - -/* -vi:ts=4:nowrap:ai:expandtab -*/ diff --git a/ism/modules/panelagent/socketconfigserver/socketconfigserver.version-script b/ism/modules/panelagent/socketconfigserver/socketconfigserver.version-script deleted file mode 100644 index da27a4c..0000000 --- a/ism/modules/panelagent/socketconfigserver/socketconfigserver.version-script +++ /dev/null @@ -1,16 +0,0 @@ -SCIM_IMENGINE_1.0 { - global: - extern "C" { - *scim_panel_agent_module_create_instance*; - *scim_panel_agent_module_init*; - *scim_module_exit*; - *scim_module_init*; - }; - - local: - extern "C++" { - scim::*; - std::*; - __gnu_cxx::*; - }; -}; diff --git a/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp b/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp index d694a8f..85b6bf6 100644 --- a/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp +++ b/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp @@ -189,12 +189,20 @@ static void _show_preedit_string (int context); static void panel_req_update_bidi_direction (WSCContextISF *ic, int direction); +/* Panel iochannel handler*/ +static void panel_initialize (void); +static void panel_finalize (void); + + /* utility functions */ static bool filter_keys (const char *keyname, const char *config_path); static void set_ic_capabilities (WSCContextISF *ic); +static void initialize (void); +static void finalize (void); + static void send_wl_key_event (WSCContextISF *ic, const KeyEvent &key, bool fake); static void _hide_preedit_string (int context, bool update_preedit); @@ -211,6 +219,8 @@ static ConfigPointer _config; static WSCContextISF *_focused_ic = 0; +static bool _scim_initialized = false; + static int _panel_client_id = 0; static uint32 _active_helper_option = 0; @@ -1251,6 +1261,63 @@ insert_text (const char *text, uint32_t offset, const char *insert) return new_text; } +/* Public functions */ +void +isf_wsc_context_init (void) +{ + SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; + LOGD (""); + int val; + + if (!_scim_initialized) { + ecore_wl_init (NULL); + initialize (); + _scim_initialized = true; + isf_wsc_input_panel_init (); + //isf_wsc_context_set_hardware_keyboard_mode(context_scim); + + /* get autoperiod allow vconf value */ + if (vconf_get_bool (VCONFKEY_AUTOPERIOD_ALLOW_BOOL, &val) == 0) { + if (val == EINA_TRUE) + autoperiod_allow = EINA_TRUE; + } + + vconf_notify_key_changed (VCONFKEY_AUTOPERIOD_ALLOW_BOOL, autoperiod_allow_changed_cb, NULL); + + /* get autocapital allow vconf value */ + if (vconf_get_bool (VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, &val) == 0) { + if (val == EINA_TRUE) + autocap_allow = EINA_TRUE; + } + + vconf_notify_key_changed (VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, autocapital_allow_changed_cb, NULL); + + /* get input language vconf value */ + get_input_language (); + + vconf_notify_key_changed (VCONFKEY_ISF_INPUT_LANGUAGE, input_language_changed_cb, NULL); + } +} + +void +isf_wsc_context_shutdown (void) +{ + LOGD (""); + SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; + + if (_scim_initialized) { + _scim_initialized = false; + + vconf_ignore_key_changed (VCONFKEY_AUTOPERIOD_ALLOW_BOOL, autoperiod_allow_changed_cb); + vconf_ignore_key_changed (VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, autocapital_allow_changed_cb); + vconf_ignore_key_changed (VCONFKEY_ISF_INPUT_LANGUAGE, input_language_changed_cb); + + isf_wsc_input_panel_shutdown (); + finalize (); + ecore_wl_shutdown (); + } +} + void isf_wsc_context_add (WSCContextISF *wsc_ctx) { @@ -2297,6 +2364,41 @@ filter_keys (const char *keyname, const char *config_path) } static void +panel_initialize (void) +{ + SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; + LOGD (""); + String display_name; + { + const char *p = getenv ("DISPLAY"); + if (p) display_name = String (p); + } + g_info_manager->add_client (WAYLAND_MODULE_CLIENT_ID, 2, FRONTEND_CLIENT); + _panel_client_id = WAYLAND_MODULE_CLIENT_ID; + g_info_manager->register_panel_client (_panel_client_id, _panel_client_id); + WSCContextISF* context_scim = _ic_list; + + while (context_scim != NULL) { + //FIXME:modify the parameter + g_info_manager->register_input_context (WAYLAND_MODULE_CLIENT_ID, context_scim->id, ""); + + context_scim = context_scim->next; + } + + if (_focused_ic) { + _focused_ic = 0; + } +} + +static void +panel_finalize (void) +{ + SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; + LOGD (""); + g_info_manager->del_client (WAYLAND_MODULE_CLIENT_ID); +} + +static void panel_slot_update_preedit_caret (int context, int caret) { LOGD (""); @@ -2437,6 +2539,91 @@ _hide_preedit_string (int context, bool update_preedit) } } +static void +_update_preedit_string (int context, + const WideString &str, + const AttributeList &attrs, + int caret) +{ + SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; + LOGD (""); + WSCContextISF* ic = find_ic (context); + + if (ic && ic->impl && _focused_ic == ic) { + if (!ic->impl->is_on) + ic->impl->is_on = true; + + if (ic->impl->preedit_string != str || str.length ()) { + ic->impl->preedit_string = str; + ic->impl->preedit_attrlist = attrs; + + if (ic->impl->use_preedit) { + if (!ic->impl->preedit_started) { + if (!check_valid_ic (ic)) + return; + + ic->impl->preedit_started = true; + ic->impl->need_commit_preedit = true; + } + if (caret >= 0 && caret <= (int)str.length ()) + ic->impl->preedit_caret = caret; + else + ic->impl->preedit_caret = str.length (); + ic->impl->preedit_updating = true; + if (check_valid_ic (ic)) + ic->impl->preedit_updating = false; + wsc_context_send_preedit_string (ic); + } else { + String _str = utf8_wcstombs (str); + g_info_manager->socket_update_preedit_string (_str, attrs, (uint32)caret); + } + } + } +} + +void +initialize (void) +{ + + LOGD ("Initializing Wayland ISF IMModule...\n"); + + // Get system language. + _language = scim_get_locale_language (scim_get_current_locale ()); + + panel_initialize (); +} + +static void +finalize (void) +{ + LOGD ("Finalizing Ecore ISF IMModule...\n"); + + SCIM_DEBUG_FRONTEND(2) << "Finalize all IC partially.\n"; + while (_used_ic_impl_list) { + // In case in "shared input method" mode, + // all contexts share only one instance, + // so we need point the reference pointer correctly before finalizing. + #if 0 //REMOVE + if (_used_ic_impl_list->si) { + _used_ic_impl_list->si->set_frontend_data (static_cast (_used_ic_impl_list->parent)); + } + #endif + if (_used_ic_impl_list->parent && _used_ic_impl_list->parent->ctx) { + isf_wsc_context_del (_used_ic_impl_list->parent); + } + } + + delete_all_ic_impl (); + + SCIM_DEBUG_FRONTEND(2) << " Releasing Config...\n"; + _config.reset (); + _focused_ic = NULL; + _ic_list = NULL; + + _scim_initialized = false; + panel_finalize (); +} + static uint32_t _keyname_to_keysym (uint32_t keyname, uint32_t *modifiers) { if (!modifiers) @@ -2582,63 +2769,12 @@ public: : PanelAgentBase ("wayland") { } ~WaylandPanelAgent () { + stop (); } bool initialize (InfoManager* info_manager, const String& display, bool resident) { - LOGD ("Initializing Wayland ISF IMModule...\n"); - + LOGD (""); g_info_manager = info_manager; - int val; - - ecore_wl_init (NULL); - - // Get system language. - _language = scim_get_locale_language (scim_get_current_locale ()); - - String display_name; - { - const char *p = getenv ("DISPLAY"); - if (p) display_name = String (p); - } - - g_info_manager->add_client (WAYLAND_MODULE_CLIENT_ID, 2, FRONTEND_CLIENT); - _panel_client_id = WAYLAND_MODULE_CLIENT_ID; - g_info_manager->register_panel_client (_panel_client_id, _panel_client_id); - WSCContextISF* context_scim = _ic_list; - - while (context_scim != NULL) { - //FIXME:modify the parameter - g_info_manager->register_input_context (WAYLAND_MODULE_CLIENT_ID, context_scim->id, ""); - - context_scim = context_scim->next; - } - - if (_focused_ic) { - _focused_ic = 0; - } - - isf_wsc_input_panel_init (); - //isf_wsc_context_set_hardware_keyboard_mode(context_scim); - - /* get autoperiod allow vconf value */ - if (vconf_get_bool (VCONFKEY_AUTOPERIOD_ALLOW_BOOL, &val) == 0) { - if (val == EINA_TRUE) - autoperiod_allow = EINA_TRUE; - } - - vconf_notify_key_changed (VCONFKEY_AUTOPERIOD_ALLOW_BOOL, autoperiod_allow_changed_cb, NULL); - - /* get autocapital allow vconf value */ - if (vconf_get_bool (VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, &val) == 0) { - if (val == EINA_TRUE) - autocap_allow = EINA_TRUE; - } - - vconf_notify_key_changed (VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, autocapital_allow_changed_cb, NULL); - - /* get input language vconf value */ - get_input_language (); - - vconf_notify_key_changed (VCONFKEY_ISF_INPUT_LANGUAGE, input_language_changed_cb, NULL); + isf_wsc_context_init (); if (!_wsc_setup (&_wsc)) { return false; @@ -2648,49 +2784,21 @@ public: return true; } - bool valid (void) const { return true; } void stop (void) { - LOGD (""); - SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; - - vconf_ignore_key_changed (VCONFKEY_AUTOPERIOD_ALLOW_BOOL, autoperiod_allow_changed_cb); - vconf_ignore_key_changed (VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, autocapital_allow_changed_cb); - vconf_ignore_key_changed (VCONFKEY_ISF_INPUT_LANGUAGE, input_language_changed_cb); - - isf_wsc_input_panel_shutdown (); - - while (_used_ic_impl_list) { - // In case in "shared input method" mode, - // all contexts share only one instance, - // so we need point the reference pointer correctly before finalizing. - #if 0 //REMOVE - if (_used_ic_impl_list->si) { - _used_ic_impl_list->si->set_frontend_data (static_cast (_used_ic_impl_list->parent)); - } - #endif - if (_used_ic_impl_list->parent && _used_ic_impl_list->parent->ctx) { - isf_wsc_context_del (_used_ic_impl_list->parent); - } - } - - delete_all_ic_impl (); - - _focused_ic = NULL; - _ic_list = NULL; - - g_info_manager->del_client (WAYLAND_MODULE_CLIENT_ID); - _config_connection.disconnect (); - _config.reset (); - - ecore_wl_shutdown (); + isf_wsc_context_shutdown (); } public: + void + exit (int id, uint32 contextid) { + LOGD ("client id:%d", id); + finalize (); + } void update_preedit_caret (int id, uint32 context_id, uint32 caret) { @@ -2918,6 +3026,12 @@ public: } void + reload_config (int id) + { + LOGD ("client id:%d", id); + } + + void hide_helper_ise (int id, uint32 context_id) { LOGD ("client id:%d", id); diff --git a/ism/src/isf_info_manager.cpp b/ism/src/isf_info_manager.cpp index 9570f77..50c21e6 100644 --- a/ism/src/isf_info_manager.cpp +++ b/ism/src/isf_info_manager.cpp @@ -1832,6 +1832,34 @@ public: set_helper_caps_mode (m_current_helper_uuid, mode); } + //SCIM_TRANS_CMD_RELOAD_CONFIG + void reload_config (void) { + SCIM_DEBUG_MAIN (1) << "InfoManager::reload_config ()\n"; + LOGD (""); + lock (); + + for (ClientRepository::iterator it = m_client_repository.begin (); it != m_client_repository.end (); ++it) { + if (it->second.type == FRONTEND_CLIENT || it->second.type == HELPER_CLIENT) { + m_panel_agent_manager.reload_config (it->first); + } + } + + unlock (); + } + + bool exit (void) { + SCIM_DEBUG_MAIN (1) << "InfoManager::exit ()\n"; + lock (); + + for (ClientRepository::iterator it = m_client_repository.begin (); it != m_client_repository.end (); ++it) { + m_panel_agent_manager.exit (it->first, 0); + } + + unlock (); + stop (); + return true; + } + void update_ise_list (std::vector& strList) { /* request PanelClient to update keyboard ise list */ update_keyboard_ise_list (); @@ -3935,7 +3963,8 @@ InfoManager::valid (void) const void InfoManager::stop (void) { - m_impl->stop (); + if (m_impl != NULL) + m_impl->stop (); } const ClientInfo& @@ -4161,6 +4190,17 @@ InfoManager::set_should_shared_ise (const bool should_shared_ise) m_impl->set_should_shared_ise (should_shared_ise); } +//void +//InfoManager::reload_config (void) +//{ +// m_impl->reload_config (); +//} + +bool +InfoManager::exit (void) +{ + return m_impl->exit (); +} void InfoManager::update_ise_list (std::vector& strList) { @@ -4414,6 +4454,12 @@ void InfoManager::set_ise_caps_mode (int client_id, uint32 mode) m_impl->set_ise_caps_mode (client_id, mode); } +//SCIM_TRANS_CMD_RELOAD_CONFIG +void InfoManager::reload_config (void) +{ + m_impl->reload_config (); +} + //ISM_TRANS_CMD_SEND_WILL_SHOW_ACK void InfoManager::will_show_ack (int client_id) { diff --git a/ism/src/isf_info_manager.h b/ism/src/isf_info_manager.h index 94387af..110d2b9 100644 --- a/ism/src/isf_info_manager.h +++ b/ism/src/isf_info_manager.h @@ -527,6 +527,19 @@ public: bool stop_helper (const String& uuid); /** + * @brief Let all FrontEnds and Helpers reload configuration. + * @return true if the command was sent correctly. + */ + //void reload_config (void); + + /** + * @brief Let all FrontEnds, Helpers and this Panel exit. + * @return true if the command was sent correctly. + */ + bool exit (void); + + + /** * @brief Send candidate longpress event to ISE. * * @param type The candidate object type. @@ -697,6 +710,10 @@ public: void set_ise_caps_mode (int client_id, uint32 mode); + //SCIM_TRANS_CMD_RELOAD_CONFIG + void reload_config (void); + + //ISM_TRANS_CMD_SEND_WILL_SHOW_ACK void will_show_ack (int client_id); diff --git a/ism/src/isf_panel_agent_base.cpp b/ism/src/isf_panel_agent_base.cpp index 2af0253..ebd4977 100644 --- a/ism/src/isf_panel_agent_base.cpp +++ b/ism/src/isf_panel_agent_base.cpp @@ -209,6 +209,7 @@ void PanelAgentBase::socket_start_helper (int client, uint32 context, const Stri LOGW ("not implemented for %s", m_name.c_str ()); } + void PanelAgentBase::exit (int client, uint32 context) { LOGW ("not implemented for %s", m_name.c_str ()); @@ -342,6 +343,11 @@ void PanelAgentBase::reset_helper_context (int client, uint32 context, const Str LOGW ("not implemented for %s", m_name.c_str ()); } +void PanelAgentBase::reload_config (int client) +{ + LOGW ("not implemented for %s", m_name.c_str ()); +} + void PanelAgentBase::socket_update_surrounding_text (int client, uint32 context, const String& uuid, String& text, uint32 cursor) { LOGW ("not implemented for %s", m_name.c_str ()); diff --git a/ism/src/isf_panel_agent_base.h b/ism/src/isf_panel_agent_base.h index 2e9e19e..c8419b2 100644 --- a/ism/src/isf_panel_agent_base.h +++ b/ism/src/isf_panel_agent_base.h @@ -311,6 +311,12 @@ public: virtual void trigger_property (int client, uint32 context, const String& property); /** + * @brief Let all FrontEnds and Helpers reload configuration. + * @return true if the command was sent correctly. + */ + virtual void reload_config (int client); + + /** * @brief Let all FrontEnds, Helpers and this Panel exit. * @return true if the command was sent correctly. */ diff --git a/ism/src/isf_panel_agent_manager.cpp b/ism/src/isf_panel_agent_manager.cpp index e732440..dba1dac 100644 --- a/ism/src/isf_panel_agent_manager.cpp +++ b/ism/src/isf_panel_agent_manager.cpp @@ -73,7 +73,6 @@ public: PanelAgentPointer m_socket; PanelAgentPointer m_wayland; - PanelAgentPointer m_config; public: PanelAgentManagerImpl () { } @@ -81,7 +80,6 @@ public: ~PanelAgentManagerImpl () { m_socket.reset(0); m_wayland.reset(0); - m_config.reset (0); std::vector::iterator iter = m_panel_agent_modules.begin (); for (; iter != m_panel_agent_modules.end (); iter++) { @@ -146,10 +144,8 @@ bool PanelAgentManager::initialize (InfoManager* info_manager, const ConfigPoint if (_panel_agent_module->get_module_name () == "wayland") m_impl->m_wayland = _panelagent; - else if (_panel_agent_module->get_module_name () == "ecoresocket") + else m_impl->m_socket = _panelagent; - else if (_panel_agent_module->get_module_name () == "socketconfigserver") - m_impl->m_config = _panelagent; } return true; @@ -162,13 +158,7 @@ bool PanelAgentManager::valid (void) const void PanelAgentManager::stop (void) { - LOGD (""); - if (!m_impl->m_wayland.null ()) - m_impl->m_wayland->stop (); - if (!m_impl->m_socket.null ()) - m_impl->m_socket->stop (); - if (!m_impl->m_config.null ()) - m_impl->m_config->stop (); + SCIM_DEBUG_MAIN (1) << "PanelAgent::stop ()\n"; } void PanelAgentManager::update_panel_event (int id, uint32 context_id, int cmd, uint32 nType, uint32 nValue) @@ -355,6 +345,7 @@ void PanelAgentManager::socket_start_helper (int id, uint32 context_id, const St _p->socket_start_helper (id, context_id, ic_uuid); } + void PanelAgentManager::exit (int id, uint32 context_id) { PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id); @@ -565,6 +556,14 @@ void PanelAgentManager::reset_helper_context (int id, uint32 context_id, const S _p->reset_helper_context (id, context_id, uuid); } +void PanelAgentManager::reload_config (int id) +{ + PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id); + + if (!_p.null ()) + _p->reload_config (id); +} + void PanelAgentManager::socket_update_surrounding_text (int id, uint32 context_id, const String& uuid, String& text, uint32 cursor) { PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id); diff --git a/ism/src/isf_panel_agent_manager.h b/ism/src/isf_panel_agent_manager.h index 90130f1..57ee504 100644 --- a/ism/src/isf_panel_agent_manager.h +++ b/ism/src/isf_panel_agent_manager.h @@ -268,6 +268,14 @@ public: */ void trigger_property (int client, uint32 context, const String& property); + + + /** + * @brief Let all FrontEnds and Helpers reload configuration. + * @return true if the command was sent correctly. + */ + void reload_config (int client); + /** * @brief Let all FrontEnds, Helpers and this Panel exit. * @return true if the command was sent correctly. diff --git a/ism/src/scim_helper.cpp b/ism/src/scim_helper.cpp index e92d188..e449738 100644 --- a/ism/src/scim_helper.cpp +++ b/ism/src/scim_helper.cpp @@ -160,8 +160,7 @@ public: HelperAgentSignalVoid signal_exit; HelperAgentSignalVoid signal_attach_input_context; HelperAgentSignalVoid signal_detach_input_context; - //Deprecated - //HelperAgentSignalVoid signal_reload_config; + HelperAgentSignalVoid signal_reload_config; HelperAgentSignalInt signal_update_screen; HelperAgentSignalIntInt signal_update_spot_location; HelperAgentSignalInt signal_update_cursor_position; @@ -556,7 +555,6 @@ public: send.write_to_socket (socket_active, magic_active); } } - private: HelperAgentImpl () : magic (0), magic_active (0), timeout (-1), focused_ic ((uint32) -1) { } }; @@ -881,6 +879,14 @@ HelperAgent::handle_message (MessageItem *message) m_impl->signal_exit(this, subclass->get_ic_ref(), subclass->get_ic_uuid_ref()); break; } + case SCIM_TRANS_CMD_RELOAD_CONFIG: + { + MessageItemReloadConfig *subclass = static_cast(message); + m_impl->signal_reload_config (this, subclass->get_ic_ref(), subclass->get_ic_uuid_ref()); + if (!m_impl->m_config.null()) + m_impl->m_config->ConfigBase::reload(); + break; + } case SCIM_TRANS_CMD_UPDATE_SCREEN: { MessageItemUpdateScreen *subclass = static_cast(message); @@ -1357,7 +1363,6 @@ HelperAgent::handle_message (MessageItem *message) } /** - * Deprecated: replace by ConfigBase::get (false, "socket")->reload() * @brief Request SCIM to reload all configuration. * * This function should only by used by Setup Helper to request @@ -1367,6 +1372,15 @@ void HelperAgent::reload_config () const { LOGD (""); +#if 0 //reload config message only send by socketconfig client + if (m_impl->socket_active.is_connected ()) { + m_impl->send.clear (); + m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST); + m_impl->send.put_data (m_impl->magic_active); + m_impl->send.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG); + m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active); + } +#endif if (!m_impl->m_config.null()) m_impl->m_config->reload(); } @@ -2570,7 +2584,6 @@ HelperAgent::signal_connect_detach_input_context (HelperAgentSlotVoid *slot) } /** - * Deprecated: replace by ConfigBase::get (false, "socket")->signal_connect_reload (slot (reload_config_callback)); * @brief Connect a slot to Helper reload config signal. * * This signal is used to let the Helper reload configuration. @@ -2582,8 +2595,7 @@ HelperAgent::signal_connect_detach_input_context (HelperAgentSlotVoid *slot) Connection HelperAgent::signal_connect_reload_config (HelperAgentSlotVoid *slot) { - //return m_impl->signal_reload_config.connect (slot); - return Connection(); + return m_impl->signal_reload_config.connect (slot); } /** diff --git a/ism/src/scim_helper_launcher.cpp b/ism/src/scim_helper_launcher.cpp index 7ee53aa..c09e9eb 100644 --- a/ism/src/scim_helper_launcher.cpp +++ b/ism/src/scim_helper_launcher.cpp @@ -172,6 +172,11 @@ int main (int argc, char *argv []) return -1; } + //FIXME + //Temporary solution + //remove this if simple socket config server is done + config = "simple"; + ConfigPointer config_pointer = ConfigBase::get (true, config); if (config_pointer.null ()) { diff --git a/ism/src/scim_socket.cpp b/ism/src/scim_socket.cpp index be703a4..dbc2c4c 100644 --- a/ism/src/scim_socket.cpp +++ b/ism/src/scim_socket.cpp @@ -1336,7 +1336,6 @@ SocketClient::close () #define SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS "local:/tmp/scim-socket-frontend" #define SCIM_DEFAULT_PANEL_SOCKET_ADDRESS "local:/tmp/scim-panel-socket" #define SCIM_DEFAULT_HELPER_MANAGER_SOCKET_ADDRESS "local:/tmp/scim-socket-frontend" -#define SCIM_DEFAULT_SOCKET_CONFIG_SOCKET_ADDRESS "local:/tmp/scim-socket-config" String scim_get_default_socket_frontend_address () { @@ -1382,7 +1381,7 @@ String scim_get_default_socket_imengine_address () String scim_get_default_socket_config_address () { - String address (SCIM_DEFAULT_SOCKET_CONFIG_SOCKET_ADDRESS); + String address (SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS); address = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_CONFIG_ADDRESS, address); @@ -1396,7 +1395,7 @@ String scim_get_default_socket_config_address () } if (address == "default") - address = SCIM_DEFAULT_SOCKET_CONFIG_SOCKET_ADDRESS; + address = SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS; return address; }