diff options
Diffstat (limited to 'src/ibusconfig.c')
-rw-r--r-- | src/ibusconfig.c | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/src/ibusconfig.c b/src/ibusconfig.c new file mode 100644 index 0000000..9ebc799 --- /dev/null +++ b/src/ibusconfig.c @@ -0,0 +1,357 @@ +/* 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 "ibusshare.h" +#include "ibusconfig.h" + +#define IBUS_CONFIG_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_CONFIG, IBusConfigPrivate)) + +enum { + VALUE_CHANGED, + LAST_SIGNAL, +}; + + +/* IBusConfigPriv */ +struct _IBusConfigPrivate { + gpointer pad; +}; +typedef struct _IBusConfigPrivate IBusConfigPrivate; + +#if 0 +struct _BusPair { + GValue car; + GValue cdr; +}; +typedef struct _BusPair BusPair; +#endif + +static guint config_signals[LAST_SIGNAL] = { 0 }; + +#if 0 +/* functions prototype */ +static BusPair *bus_pair_new (GType car_type, + GType cdr_type, + gpointer car, + gpointer cdr); +static BusPair *bus_pair_copy (BusPair *pair); +static void bus_pair_free (BusPair *pair); +#endif +static void ibus_config_class_init (IBusConfigClass *klass); +static void ibus_config_init (IBusConfig *config); +static void ibus_config_real_destroy (IBusConfig *config); + +static gboolean ibus_config_ibus_signal (IBusProxy *proxy, + IBusMessage *message); + +static IBusProxyClass *parent_class = NULL; + +#if 0 +static BusPair * +bus_pair_new (GType car_type, + GType cdr_type, + gpointer car, + gpointer cdr) +{ + + g_assert (car_type == G_TYPE_STRING || + car_type == G_TYPE_INT || + car_type == G_TYPE_BOOLEAN || + car_type == G_TYPE_DOUBLE); + g_assert (cdr_type == G_TYPE_STRING || + cdr_type == G_TYPE_INT || + cdr_type == G_TYPE_BOOLEAN || + cdr_type == G_TYPE_DOUBLE); + g_assert (car != NULL); + g_assert (cdr != NULL); + + BusPair *pair; + + pair = g_slice_new0 (BusPair); + + g_value_init (&(pair->car), car_type); + g_value_init (&(pair->cdr), cdr_type); + + switch (car_type) { + case G_TYPE_STRING: + g_value_set_string (&(pair->car), *(gchar **)car); + break; + case G_TYPE_INT: + g_value_set_int (&(pair->car), *(gint32 *)car); + break; + case G_TYPE_BOOLEAN: + g_value_set_boolean (&(pair->car), *(gboolean *)car); + break; + case G_TYPE_DOUBLE: + g_value_set_double (&(pair->car), *(gdouble *)car); + break; + } + + switch (cdr_type) { + case G_TYPE_STRING: + g_value_set_string (&(pair->cdr), *(gchar **)cdr); + break; + case G_TYPE_INT: + g_value_set_int (&(pair->cdr), *(gint32 *)car); + break; + case G_TYPE_BOOLEAN: + g_value_set_boolean (&(pair->cdr), *(gboolean *)cdr); + break; + case G_TYPE_DOUBLE: + g_value_set_double (&(pair->cdr), *(gdouble *)cdr); + break; + } + return pair; +} + +static BusPair * +bus_pair_copy (BusPair *pair) +{ + g_assert (pair != NULL); + + BusPair *new_pair; + + new_pair = g_slice_new0 (BusPair); + g_value_copy (&(pair->car), &(new_pair->car)); + g_value_copy (&(pair->cdr), &(new_pair->cdr)); + return new_pair; +} + +static void +bus_pair_free (BusPair *pair) +{ + g_assert (pair == NULL); + + g_value_unset (&(pair->car)); + g_value_unset (&(pair->cdr)); + + g_slice_free (BusPair, pair); +} + +#endif + +GType +ibus_config_get_type (void) +{ + static GType type = 0; + + static const GTypeInfo type_info = { + sizeof (IBusConfigClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) ibus_config_class_init, + NULL, /* class finalize */ + NULL, /* class data */ + sizeof (IBusConfig), + 0, + (GInstanceInitFunc) ibus_config_init, + }; + + if (type == 0) { + type = g_type_register_static (IBUS_TYPE_PROXY, + "IBusConfig", + &type_info, + (GTypeFlags)0); + } + return type; +} + +IBusConfig * +ibus_config_new (IBusConnection *connection) +{ + g_assert (IBUS_IS_CONNECTION (connection)); + + GObject *obj; + obj = g_object_new (IBUS_TYPE_CONFIG, + "name", IBUS_SERVICE_CONFIG, + "path", IBUS_PATH_CONFIG, + "connection", connection, + NULL); + + return IBUS_CONFIG (obj); +} + +static void +ibus_config_class_init (IBusConfigClass *klass) +{ + IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass); + IBusProxyClass *proxy_class = IBUS_PROXY_CLASS (klass); + + + parent_class = (IBusProxyClass *) g_type_class_peek_parent (klass); + + g_type_class_add_private (klass, sizeof (IBusConfigPrivate)); + + ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_config_real_destroy; + + proxy_class->ibus_signal = ibus_config_ibus_signal; + + /* install signals */ + config_signals[VALUE_CHANGED] = + g_signal_new (I_("value-changed"), + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + ibus_marshal_VOID__STRING_STRING_BOXED, + G_TYPE_NONE, + 3, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_VALUE | G_SIGNAL_TYPE_STATIC_SCOPE); +} + +static void +ibus_config_init (IBusConfig *config) +{ + IBusConfigPrivate *priv; + priv = IBUS_CONFIG_GET_PRIVATE (config); +} + +static void +ibus_config_real_destroy (IBusConfig *config) +{ + if (ibus_proxy_get_connection ((IBusProxy *) config) != NULL) { + ibus_proxy_call ((IBusProxy *) config, + "Destroy", + G_TYPE_INVALID); + } + + IBUS_OBJECT_CLASS(parent_class)->destroy (IBUS_OBJECT (config)); +} + + +static gboolean +ibus_config_ibus_signal (IBusProxy *proxy, + IBusMessage *message) +{ + g_assert (IBUS_IS_CONFIG (proxy)); + g_assert (message != NULL); + + IBusConfig *config; + config = IBUS_CONFIG (proxy); + + if (ibus_message_is_signal (message, IBUS_INTERFACE_CONFIG, "ValueChanged")) { + gchar *section; + gchar *name; + GValue value = { 0 }; + IBusError *error = NULL; + gboolean retval; + + retval = ibus_message_get_args (message, + &error, + G_TYPE_STRING, §ion, + G_TYPE_STRING, &name, + G_TYPE_VALUE, &value, + G_TYPE_INVALID); + if (!retval) { + g_warning ("%s: Can not parse arguments of ValueChanges.", DBUS_ERROR_INVALID_ARGS); + return FALSE; + } + + g_signal_emit (config, + config_signals[VALUE_CHANGED], + 0, + section, + name, + &value); + g_value_unset (&value); + + g_signal_stop_emission_by_name (config, "ibus-signal"); + + return TRUE; + } + + return FALSE; +} + +gboolean +ibus_config_get_value (IBusConfig *config, + const gchar *section, + const gchar *name, + GValue *value) +{ + g_assert (IBUS_IS_CONFIG (config)); + g_assert (section != NULL); + g_assert (name != NULL); + g_assert (value != NULL); + + IBusMessage *reply; + IBusError *error; + gboolean retval; + + reply = ibus_proxy_call_with_reply_and_block ((IBusProxy *) config, + "GetValue", + -1, + &error, + G_TYPE_STRING, §ion, + G_TYPE_STRING, &name, + G_TYPE_INVALID); + if (reply == NULL) { + g_warning ("%s: %s", error->name, error->message); + ibus_error_free (error); + return FALSE; + } + + if ((error = ibus_error_new_from_message (reply)) != NULL) { + g_warning ("%s: %s", error->name, error->message); + ibus_error_free (error); + ibus_message_unref (reply); + return FALSE; + } + + retval = ibus_message_get_args (reply, + &error, + G_TYPE_VALUE, value, + G_TYPE_INVALID); + ibus_message_unref (reply); + if (!retval) { + g_warning ("%s: %s", error->name, error->message); + return FALSE; + } + + return TRUE; +} + +gboolean +ibus_config_set_value (IBusConfig *config, + const gchar *section, + const gchar *name, + const GValue *value) +{ + g_assert (IBUS_IS_CONFIG (config)); + g_assert (section != NULL); + g_assert (name != NULL); + g_assert (value != NULL); + + gboolean retval; + + retval = ibus_proxy_call ((IBusProxy *) config, + "SetValue", + G_TYPE_STRING, §ion, + G_TYPE_STRING, &name, + G_TYPE_VALUE, value, + G_TYPE_INVALID); + g_assert (retval); + return TRUE; +} |