diff mcabber/mcabber/settings.c @ 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 15e1f3957786
children 58d1390f28ca
line wrap: on
line diff
--- 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);