summaryrefslogtreecommitdiffstats
path: root/bus/factoryproxy.c
diff options
context:
space:
mode:
Diffstat (limited to 'bus/factoryproxy.c')
-rw-r--r--bus/factoryproxy.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/bus/factoryproxy.c b/bus/factoryproxy.c
new file mode 100644
index 0000000..38357b4
--- /dev/null
+++ b/bus/factoryproxy.c
@@ -0,0 +1,220 @@
+/* vim:set et sts=4: */
+/* ibus - The Input Bus
+ * Copyright (C) 2008-2009 Huang Peng <shawn.p.huang@gmail.com>
+ *
+ * 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 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <ibusinternal.h>
+#include <ibusmarshalers.h>
+#include "dbusimpl.h"
+#include "factoryproxy.h"
+
+/* functions prototype */
+static void bus_factory_proxy_class_init (BusFactoryProxyClass *klass);
+static void bus_factory_proxy_init (BusFactoryProxy *factory);
+static void bus_factory_proxy_destroy (BusFactoryProxy *factory);
+
+
+static IBusProxyClass *parent_class = NULL;
+
+GType
+bus_factory_proxy_get_type (void)
+{
+ static GType type = 0;
+
+ static const GTypeInfo type_info = {
+ sizeof (BusFactoryProxyClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) bus_factory_proxy_class_init,
+ NULL, /* class finalize */
+ NULL, /* class data */
+ sizeof (BusFactoryProxy),
+ 0,
+ (GInstanceInitFunc) bus_factory_proxy_init,
+ };
+
+ if (type == 0) {
+ type = g_type_register_static (IBUS_TYPE_PROXY,
+ "BusFactoryProxy",
+ &type_info,
+ (GTypeFlags)0);
+ }
+ return type;
+}
+
+BusFactoryProxy *
+bus_factory_proxy_new (IBusComponent *component,
+ BusConnection *connection)
+{
+ g_assert (IBUS_IS_COMPONENT (component));
+
+ BusFactoryProxy *factory;
+ GList *p;
+
+ if (connection == NULL) {
+ connection = bus_dbus_impl_get_connection_by_name (BUS_DEFAULT_DBUS, component->name);
+ }
+
+ if (connection == NULL) {
+ return NULL;
+ }
+
+ factory = g_object_new (BUS_TYPE_FACTORY_PROXY,
+ "name", NULL,
+ "path", "/org/freedesktop/IBus/Factory",
+ "connection", connection,
+ NULL);
+
+ g_object_ref (component);
+ factory->component = component;
+ g_object_set_data ((GObject *)factory->component, "factory", factory);
+
+ factory->engine_list = ibus_component_get_engines (factory->component);
+
+ for (p = factory->engine_list; p != NULL; p = p->next) {
+ IBusEngineDesc *desc = (IBusEngineDesc *)p->data;
+ g_object_ref (desc);
+ g_object_set_data ((GObject *)desc, "factory", factory);
+ }
+
+ return factory;
+}
+
+static void
+bus_factory_proxy_class_init (BusFactoryProxyClass *klass)
+{
+ IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
+
+ parent_class = (IBusProxyClass *) g_type_class_peek_parent (klass);
+
+ ibus_object_class->destroy = (IBusObjectDestroyFunc) bus_factory_proxy_destroy;
+
+}
+
+static void
+bus_factory_proxy_init (BusFactoryProxy *factory)
+{
+ factory->component = NULL;
+}
+
+static void
+bus_factory_proxy_destroy (BusFactoryProxy *factory)
+{
+ GList *p;
+
+ for (p = factory->engine_list; p != NULL ; p = p->next) {
+ IBusEngineDesc *desc = (IBusEngineDesc *)p->data;
+ g_object_steal_data ((GObject *)desc, "factory");
+ g_object_unref (desc);
+ }
+ g_list_free (factory->engine_list);
+ factory->engine_list = NULL;
+
+ if (factory->component) {
+ g_object_steal_data ((GObject *)factory->component, "factory");
+ g_object_unref (factory->component);
+ factory->component = NULL;
+ }
+
+ IBUS_OBJECT_CLASS(parent_class)->destroy (IBUS_OBJECT (factory));
+}
+
+IBusComponent *
+bus_factory_proxy_get_component (BusFactoryProxy *factory)
+{
+ return factory->component;
+}
+
+BusFactoryProxy *
+bus_factory_proxy_get_from_component (IBusComponent *component)
+{
+ IBUS_IS_COMPONENT (component);
+
+ BusFactoryProxy *factory;
+
+ factory = (BusFactoryProxy *) g_object_get_data ((GObject *)component, "factory");
+
+ return factory;
+}
+
+BusFactoryProxy *
+bus_factory_proxy_get_from_engine (IBusEngineDesc *desc)
+{
+
+ IBUS_IS_ENGINE_DESC (desc);
+
+ BusFactoryProxy *factory;
+
+ factory = (BusFactoryProxy *) g_object_get_data ((GObject *)desc, "factory");
+
+ return factory;
+}
+
+BusEngineProxy *
+bus_factory_proxy_create_engine (BusFactoryProxy *factory,
+ IBusEngineDesc *desc)
+{
+ g_assert (BUS_IS_FACTORY_PROXY (factory));
+ g_assert (IBUS_IS_ENGINE_DESC (desc));
+
+ IBusMessage *reply_message;
+ IBusError *error;
+ BusEngineProxy *engine;
+ gchar *object_path;
+
+ if (g_list_find (factory->component->engines, desc) == NULL) {
+ return NULL;
+ }
+
+ reply_message = ibus_proxy_call_with_reply_and_block ((IBusProxy *) factory,
+ "CreateEngine",
+ -1,
+ &error,
+ G_TYPE_STRING, &(desc->name),
+ DBUS_TYPE_INVALID);
+ if (reply_message == NULL) {
+ g_warning ("%s: %s", error->name, error->message);
+ ibus_error_free (error);
+ return NULL;
+ }
+
+ if ((error = ibus_error_new_from_message (reply_message)) != NULL) {
+ g_warning ("%s: %s", error->name, error->message);
+ ibus_error_free (error);
+ ibus_message_unref (reply_message);
+ return NULL;
+ }
+
+ if (!ibus_message_get_args (reply_message,
+ &error,
+ IBUS_TYPE_OBJECT_PATH, &object_path,
+ G_TYPE_INVALID)) {
+ g_warning ("%s: %s", error->name, error->message);
+ ibus_error_free (error);
+ ibus_message_unref (reply_message);
+
+ return NULL;
+ }
+
+ IBusConnection *connection = ibus_proxy_get_connection ((IBusProxy *) factory);
+ engine = bus_engine_proxy_new (object_path, desc, (BusConnection *) connection);
+ ibus_message_unref (reply_message);
+
+ return engine;
+}
+