aboutsummaryrefslogblamecommitdiffstats
path: root/libempathy/empathy-conf.c
blob: 71e520f724d655d50d2aa8d382b4521aab3afcab (plain) (tree)



























                                                                           

                          


                             
                                               

                                                         
                                                                                               


                                  
                  

                

                                    
                                         
                        


                                            
                                                         
 
                                       

           
                                                 






                                               
                                                                          


           
                                     
 
                              





                                                         
                                                










                                                            
                              



                                                    
                                                   






                                                        
                                                                      

 

                       

                           
                                                                     





                           
                            







                                             
                                         


                                        
                              
 
                                                             
 
                                                                           









                                                        
                                         


                                        
                              



                                      
                                                             







                                                          








                                     
                                          


                                         
                              
 
                                                             
 
                                                                       










                                                            
                                          


                                         
                              



                                      
                                                             







                                                           








                                     
                                            


                                           
                              
 
                                                             
 
                                                                   










                                                           
                                             


                                            
                              



                                      
                                                             






                                                             








                                     
                                                 


                                                
                              
 
                                                             










                                                         
                                                  


                                                 
                              



                                      
                                                             















                                                           
                                                   

                                    
                                                   







                                         
                                    








                                                
                                                     
                                                  
                                                   

                                                        
                                    
                                  
                                    
 
                                                         


                               
                                                   














                                                                        
                                              

                                          
                              
 
                                                             







                                                            
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 * Copyright (C) 2006 Imendio AB
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program 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
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 *
 * Authors: Richard Hult <richard@imendio.com>
 */

#include "config.h"

#include <string.h>

#include <gconf/gconf-client.h>

#include "empathy-conf.h"
#include "empathy-debug.h"

#define DEBUG_DOMAIN "Config"

#define EMPATHY_CONF_ROOT       "/apps/empathy"
#define DESKTOP_INTERFACE_ROOT "/desktop/gnome/interface"

#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_CONF, EmpathyConfPriv))

typedef struct {
    GConfClient *gconf_client;
} EmpathyConfPriv;

typedef struct {
    EmpathyConf           *conf;
    EmpathyConfNotifyFunc  func;
    gpointer               user_data;
} EmpathyConfNotifyData;

static void conf_finalize (GObject *object);

G_DEFINE_TYPE (EmpathyConf, empathy_conf, G_TYPE_OBJECT);

static EmpathyConf *global_conf = NULL;

static void
empathy_conf_class_init (EmpathyConfClass *class)
{
    GObjectClass *object_class;

    object_class = G_OBJECT_CLASS (class);

    object_class->finalize = conf_finalize;

    g_type_class_add_private (object_class, sizeof (EmpathyConfPriv));
}

static void
empathy_conf_init (EmpathyConf *conf)
{
    EmpathyConfPriv *priv;

    priv = GET_PRIV (conf);

    priv->gconf_client = gconf_client_get_default ();

    gconf_client_add_dir (priv->gconf_client,
                  EMPATHY_CONF_ROOT,
                  GCONF_CLIENT_PRELOAD_ONELEVEL,
                  NULL);
    gconf_client_add_dir (priv->gconf_client,
                  DESKTOP_INTERFACE_ROOT,
                  GCONF_CLIENT_PRELOAD_NONE,
                  NULL);
}

static void
conf_finalize (GObject *object)
{
    EmpathyConfPriv *priv;

    priv = GET_PRIV (object);

    gconf_client_remove_dir (priv->gconf_client,
                 EMPATHY_CONF_ROOT,
                 NULL);
    gconf_client_remove_dir (priv->gconf_client,
                 DESKTOP_INTERFACE_ROOT,
                 NULL);

    g_object_unref (priv->gconf_client);

    G_OBJECT_CLASS (empathy_conf_parent_class)->finalize (object);
}

EmpathyConf *
empathy_conf_get (void)
{
    if (!global_conf) {
        global_conf = g_object_new (EMPATHY_TYPE_CONF, NULL);
    }

    return global_conf;
}

void
empathy_conf_shutdown (void)
{
    if (global_conf) {
        g_object_unref (global_conf);
        global_conf = NULL;
    }
}

gboolean
empathy_conf_set_int (EmpathyConf  *conf,
             const gchar *key,
             gint         value)
{
    EmpathyConfPriv *priv;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    empathy_debug (DEBUG_DOMAIN, "Setting int:'%s' to %d", key, value);

    priv = GET_PRIV (conf);

    return gconf_client_set_int (priv->gconf_client,
                     key,
                     value,
                     NULL);
}

gboolean
empathy_conf_get_int (EmpathyConf  *conf,
             const gchar *key,
             gint        *value)
{
    EmpathyConfPriv *priv;
    GError          *error = NULL;

    *value = 0;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);
    g_return_val_if_fail (value != NULL, FALSE);

    priv = GET_PRIV (conf);

    *value = gconf_client_get_int (priv->gconf_client,
                       key,
                       &error);

    if (error) {
        g_error_free (error);
        return FALSE;
    }

    return TRUE;
}

gboolean
empathy_conf_set_bool (EmpathyConf  *conf,
              const gchar *key,
              gboolean     value)
{
    EmpathyConfPriv *priv;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    empathy_debug (DEBUG_DOMAIN, "Setting bool:'%s' to %d ---> %s",
              key, value, value ? "true" : "false");

    priv = GET_PRIV (conf);

    return gconf_client_set_bool (priv->gconf_client,
                      key,
                      value,
                      NULL);
}

gboolean
empathy_conf_get_bool (EmpathyConf  *conf,
              const gchar *key,
              gboolean    *value)
{
    EmpathyConfPriv *priv;
    GError          *error = NULL;

    *value = FALSE;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);
    g_return_val_if_fail (value != NULL, FALSE);

    priv = GET_PRIV (conf);

    *value = gconf_client_get_bool (priv->gconf_client,
                    key,
                    &error);

    if (error) {
        g_error_free (error);
        return FALSE;
    }

    return TRUE;
}

gboolean
empathy_conf_set_string (EmpathyConf  *conf,
            const gchar *key,
            const gchar *value)
{
    EmpathyConfPriv *priv;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    empathy_debug (DEBUG_DOMAIN, "Setting string:'%s' to '%s'",
              key, value);

    priv = GET_PRIV (conf);

    return gconf_client_set_string (priv->gconf_client,
                    key,
                    value,
                    NULL);
}

gboolean
empathy_conf_get_string (EmpathyConf   *conf,
            const gchar  *key,
            gchar       **value)
{
    EmpathyConfPriv *priv;
    GError          *error = NULL;

    *value = NULL;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    priv = GET_PRIV (conf);

    *value = gconf_client_get_string (priv->gconf_client,
                      key,
                      &error);

    if (error) {
        g_error_free (error);
        return FALSE;
    }

    return TRUE;
}

gboolean
empathy_conf_set_string_list (EmpathyConf  *conf,
                 const gchar *key,
                 GSList      *value)
{
    EmpathyConfPriv *priv;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    priv = GET_PRIV (conf);

    return gconf_client_set_list (priv->gconf_client,
                      key,
                      GCONF_VALUE_STRING,
                      value,
                      NULL);
}

gboolean
empathy_conf_get_string_list (EmpathyConf   *conf,
                 const gchar  *key,
                 GSList      **value)
{
    EmpathyConfPriv *priv;
    GError          *error = NULL;

    *value = NULL;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    priv = GET_PRIV (conf);

    *value = gconf_client_get_list (priv->gconf_client,
                    key,
                    GCONF_VALUE_STRING,
                    &error);
    if (error) {
        g_error_free (error);
        return FALSE;
    }

    return TRUE;
}

static void
conf_notify_data_free (EmpathyConfNotifyData *data)
{
    g_object_unref (data->conf);
    g_slice_free (EmpathyConfNotifyData, data);
}

static void
conf_notify_func (GConfClient *client,
          guint        id,
          GConfEntry  *entry,
          gpointer     user_data)
{
    EmpathyConfNotifyData *data;

    data = user_data;

    data->func (data->conf,
            gconf_entry_get_key (entry),
            data->user_data);
}

guint
empathy_conf_notify_add (EmpathyConf           *conf,
            const gchar          *key,
            EmpathyConfNotifyFunc func,
            gpointer              user_data)
{
    EmpathyConfPriv       *priv;
    guint                  id;
    EmpathyConfNotifyData *data;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), 0);

    priv = GET_PRIV (conf);

    data = g_slice_new (EmpathyConfNotifyData);
    data->func = func;
    data->user_data = user_data;
    data->conf = g_object_ref (conf);

    id = gconf_client_notify_add (priv->gconf_client,
                      key,
                      conf_notify_func,
                      data,
                      (GFreeFunc) conf_notify_data_free,
                      NULL);

    return id;
}

gboolean
empathy_conf_notify_remove (EmpathyConf *conf,
               guint       id)
{
    EmpathyConfPriv *priv;

    g_return_val_if_fail (EMPATHY_IS_CONF (conf), FALSE);

    priv = GET_PRIV (conf);

    gconf_client_notify_remove (priv->gconf_client, id);

    return TRUE;
}