Blame conf/memconf/config.c

Packit Service 1d8f1c
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
Packit Service 1d8f1c
/* vim:set et sts=4: */
Packit Service 1d8f1c
/* ibus - The Input Bus
Packit Service 1d8f1c
 * Copyright (c) 2010, Google Inc. All rights reserved.
Packit Service 1d8f1c
 * Copyright (C) 2010 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is free software; you can redistribute it and/or
Packit Service 1d8f1c
 * modify it under the terms of the GNU Lesser General Public
Packit Service 1d8f1c
 * License as published by the Free Software Foundation; either
Packit Service 1d8f1c
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is distributed in the hope that it will be useful,
Packit Service 1d8f1c
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 1d8f1c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 1d8f1c
 * Lesser General Public License for more details.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * You should have received a copy of the GNU Lesser General Public
Packit Service 1d8f1c
 * License along with this library; if not, write to the Free Software
Packit Service 1d8f1c
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit Service 1d8f1c
 * USA
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
#include <string.h>
Packit Service 1d8f1c
#include <ibus.h>
Packit Service 1d8f1c
#include "config.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
typedef struct _IBusConfigMemconfClass IBusConfigMemconfClass;
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _IBusConfigMemconf {
Packit Service 1d8f1c
    IBusConfigService parent;
Packit Service 1d8f1c
    GHashTable *values;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _IBusConfigMemconfClass {
Packit Service 1d8f1c
    IBusConfigServiceClass parent;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static void         ibus_config_memconf_class_init  (IBusConfigMemconfClass *class);
Packit Service 1d8f1c
static void         ibus_config_memconf_init        (IBusConfigMemconf      *config);
Packit Service 1d8f1c
static void         ibus_config_memconf_destroy     (IBusConfigMemconf      *config);
Packit Service 1d8f1c
static gboolean     ibus_config_memconf_set_value   (IBusConfigService      *config,
Packit Service 1d8f1c
                                                     const gchar            *section,
Packit Service 1d8f1c
                                                     const gchar            *name,
Packit Service 1d8f1c
                                                     GVariant               *value,
Packit Service 1d8f1c
                                                     GError                **error);
Packit Service 1d8f1c
static GVariant    *ibus_config_memconf_get_value   (IBusConfigService      *config,
Packit Service 1d8f1c
                                                     const gchar            *section,
Packit Service 1d8f1c
                                                     const gchar            *name,
Packit Service 1d8f1c
                                                     GError                **error);
Packit Service 1d8f1c
static GVariant    *ibus_config_memconf_get_values  (IBusConfigService      *config,
Packit Service 1d8f1c
                                                     const gchar            *section,
Packit Service 1d8f1c
                                                     GError                **error);
Packit Service 1d8f1c
static gboolean     ibus_config_memconf_unset_value (IBusConfigService      *config,
Packit Service 1d8f1c
                                                     const gchar            *section,
Packit Service 1d8f1c
                                                     const gchar            *name,
Packit Service 1d8f1c
                                                     GError                **error);
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE (IBusConfigMemconf, ibus_config_memconf, IBUS_TYPE_CONFIG_SERVICE)
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_config_memconf_class_init (IBusConfigMemconfClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObjectClass *object_class = G_OBJECT_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_OBJECT_CLASS (object_class)->destroy = (IBusObjectDestroyFunc) ibus_config_memconf_destroy;
Packit Service 1d8f1c
    IBUS_CONFIG_SERVICE_CLASS (object_class)->set_value   = ibus_config_memconf_set_value;
Packit Service 1d8f1c
    IBUS_CONFIG_SERVICE_CLASS (object_class)->get_value   = ibus_config_memconf_get_value;
Packit Service 1d8f1c
    IBUS_CONFIG_SERVICE_CLASS (object_class)->get_values  = ibus_config_memconf_get_values;
Packit Service 1d8f1c
    IBUS_CONFIG_SERVICE_CLASS (object_class)->unset_value = ibus_config_memconf_unset_value;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_config_memconf_init (IBusConfigMemconf *config)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    config->values = g_hash_table_new_full (g_str_hash,
Packit Service 1d8f1c
                                            g_str_equal,
Packit Service 1d8f1c
                                            (GDestroyNotify)g_free,
Packit Service 1d8f1c
                                            (GDestroyNotify)g_variant_unref);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_config_memconf_destroy (IBusConfigMemconf *config)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_hash_table_destroy (config->values);
Packit Service 1d8f1c
    IBUS_OBJECT_CLASS (ibus_config_memconf_parent_class)->destroy ((IBusObject *)config);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_config_memconf_set_value (IBusConfigService *config,
Packit Service 1d8f1c
                               const gchar       *section,
Packit Service 1d8f1c
                               const gchar       *name,
Packit Service 1d8f1c
                               GVariant          *value,
Packit Service 1d8f1c
                               GError           **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_CONFIG_MEMCONF (config));
Packit Service 1d8f1c
    g_assert (section);
Packit Service 1d8f1c
    g_assert (name);
Packit Service 1d8f1c
    g_assert (value);
Packit Service 1d8f1c
    g_assert (error == NULL || *error == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *key = g_strdup_printf ("%s:%s", section, name);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_hash_table_insert (IBUS_CONFIG_MEMCONF (config)->values,
Packit Service 1d8f1c
                         key, g_variant_ref_sink (value));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_config_service_value_changed (config, section, name, value);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return TRUE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static GVariant *
Packit Service 1d8f1c
ibus_config_memconf_get_value (IBusConfigService *config,
Packit Service 1d8f1c
                               const gchar       *section,
Packit Service 1d8f1c
                               const gchar       *name,
Packit Service 1d8f1c
                               GError           **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_CONFIG_MEMCONF (config));
Packit Service 1d8f1c
    g_assert (section);
Packit Service 1d8f1c
    g_assert (name);
Packit Service 1d8f1c
    g_assert (error == NULL || *error == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *key = g_strdup_printf ("%s:%s", section, name);
Packit Service 1d8f1c
    GVariant *value = (GVariant *)g_hash_table_lookup (IBUS_CONFIG_MEMCONF (config)->values, key);
Packit Service 1d8f1c
    g_free (key);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (value != NULL) {
Packit Service 1d8f1c
        g_variant_ref (value);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else if (error != NULL) {
Packit Service 1d8f1c
        *error = g_error_new (G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                              "Config value [%s:%s] does not exist.", section, name);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return value;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static GVariant *
Packit Service 1d8f1c
ibus_config_memconf_get_values (IBusConfigService *config,
Packit Service 1d8f1c
                                const gchar       *section,
Packit Service 1d8f1c
                                GError           **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_CONFIG_MEMCONF (config));
Packit Service 1d8f1c
    g_assert (section);
Packit Service 1d8f1c
    g_assert (error == NULL || *error == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GHashTableIter iter;
Packit Service 1d8f1c
    const gchar *key;
Packit Service 1d8f1c
    GVariant *value;
Packit Service 1d8f1c
    
Packit Service 1d8f1c
    GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
Packit Service 1d8f1c
    g_hash_table_iter_init (&iter, IBUS_CONFIG_MEMCONF (config)->values);
Packit Service 1d8f1c
    while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) {
Packit Service 1d8f1c
        gchar **v = g_strsplit (key, ":", 2);
Packit Service 1d8f1c
        if (g_strcmp0 (v[0], section) == 0) {
Packit Service 1d8f1c
            g_variant_builder_add (builder, "{sv}", v[1], value); 
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_strfreev(v);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return g_variant_builder_end (builder);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_config_memconf_unset_value (IBusConfigService *config,
Packit Service 1d8f1c
                                 const gchar       *section,
Packit Service 1d8f1c
                                 const gchar       *name,
Packit Service 1d8f1c
                                 GError            **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_CONFIG_MEMCONF (config));
Packit Service 1d8f1c
    g_assert (section);
Packit Service 1d8f1c
    g_assert (name);
Packit Service 1d8f1c
    g_assert (error == NULL || *error == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *key = g_strdup_printf ("%s:%s", section, name);
Packit Service 1d8f1c
    gboolean retval = g_hash_table_remove (IBUS_CONFIG_MEMCONF (config)->values, key);
Packit Service 1d8f1c
    g_free (key);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (retval) {
Packit Service 1d8f1c
        ibus_config_service_value_changed (config,
Packit Service 1d8f1c
                                           section,
Packit Service 1d8f1c
                                           name,
Packit Service 1d8f1c
                                           g_variant_new_tuple (NULL, 0));
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_set_error (error,
Packit Service 1d8f1c
                     G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                     "Config value [%s:%s] does not exist.",
Packit Service 1d8f1c
                     section, name);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusConfigMemconf *
Packit Service 1d8f1c
ibus_config_memconf_new (GDBusConnection *connection)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusConfigMemconf *config;
Packit Service 1d8f1c
    config = (IBusConfigMemconf *) g_object_new (IBUS_TYPE_CONFIG_MEMCONF,
Packit Service 1d8f1c
                                                 "object-path", IBUS_PATH_CONFIG,
Packit Service 1d8f1c
                                                 "connection", connection,
Packit Service 1d8f1c
                                                 NULL);
Packit Service 1d8f1c
    return config;
Packit Service 1d8f1c
}