changeset 1768:d80a9e32ab1a

Refuse to replace existing guards * Settings_set_guard returns success status * API v3 * Min API v3
author Myhailo Danylenko <isbear@ukrpost.net>
date Sat, 13 Mar 2010 20:09:14 +0200
parents 0e7fe154ab76
children fccc46cb4345
files mcabber/mcabber/api.h mcabber/mcabber/settings.c mcabber/mcabber/settings.h
diffstat 3 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/api.h	Sat Mar 13 21:51:14 2010 +0100
+++ b/mcabber/mcabber/api.h	Sat Mar 13 20:09:14 2010 +0200
@@ -3,8 +3,8 @@
 
 #include <mcabber/config.h> // For MCABBER_BRANCH
 
-#define MCABBER_API_VERSION 2
-#define MCABBER_API_MIN     1
+#define MCABBER_API_VERSION 3
+#define MCABBER_API_MIN     3
 
 extern const gchar *mcabber_branch;
 extern const guint mcabber_api_version;
--- a/mcabber/mcabber/settings.c	Sat Mar 13 21:51:14 2010 +0100
+++ b/mcabber/mcabber/settings.c	Sat Mar 13 20:09:14 2010 +0200
@@ -51,6 +51,10 @@
 } T_pgpopt;
 #endif
 
+typedef struct {
+  settings_guard_t guard;
+} installed_guard_t;
+
 #ifdef HAVE_LIBOTR
 static GHashTable *otrpolicy;
 static enum otr_policy default_policy;
@@ -74,7 +78,7 @@
   option  = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free);
   alias   = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free);
   binding = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free);
-  guards  = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, NULL);
+  guards  = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free);
 #ifdef HAVE_GPGME
   pgpopt = g_hash_table_new(&g_str_hash, &g_str_equal);
 #endif
@@ -299,12 +303,19 @@
   return TRUE;
 }
 
-void settings_set_guard(const gchar *key, settings_guard_t guard)
+gboolean settings_set_guard(const gchar *key, settings_guard_t guard)
 {
   if (!guard)
     g_hash_table_remove(guards, key);
-  else
-    g_hash_table_insert(guards, g_strdup(key), (gpointer)guard);
+  else {
+    installed_guard_t *iguard = g_hash_table_lookup(guards, key);
+    if (iguard)
+      return FALSE;
+    iguard = g_new(installed_guard_t, 1);
+    iguard->guard = guard;
+    g_hash_table_insert(guards, g_strdup(key), iguard);
+  }
+  return TRUE;
 }
 
 void settings_del_guard(const gchar *key)
@@ -327,9 +338,9 @@
   settings_guard_t guard = NULL;
 
   if (type == SETTINGS_TYPE_OPTION) {
-    guard = (settings_guard_t)g_hash_table_lookup(guards, key);
+    installed_guard_t *guard = g_hash_table_lookup(guards, key);
     if (guard)
-      dup_value = guard(key, value);
+      dup_value = guard->guard(key, value);
   }
 
   hash = get_hash(type);
--- a/mcabber/mcabber/settings.h	Sat Mar 13 21:51:14 2010 +0100
+++ b/mcabber/mcabber/settings.h	Sat Mar 13 20:09:14 2010 +0200
@@ -32,7 +32,7 @@
 void    settings_init(void);
 int     cfg_read_file(char *filename, guint mainfile);
 guint   parse_assigment(gchar *assignment, gchar **pkey, gchar **pval);
-void    settings_set_guard(const gchar *key, settings_guard_t guard);
+gboolean settings_set_guard(const gchar *key, settings_guard_t guard);
 void    settings_del_guard(const gchar *key);
 void    settings_opt_set_raw(const gchar *key, const gchar *value);
 void    settings_set(guint type, const gchar *key, const gchar *value);