# HG changeset patch # User Myhailo Danylenko # Date 1268503754 -7200 # Node ID d80a9e32ab1a3894182a1e5dde183a8526484392 # Parent 0e7fe154ab76ee3229f13e9cb6552f069c5d9a43 Refuse to replace existing guards * Settings_set_guard returns success status * API v3 * Min API v3 diff -r 0e7fe154ab76 -r d80a9e32ab1a mcabber/mcabber/api.h --- 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 // 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; diff -r 0e7fe154ab76 -r d80a9e32ab1a mcabber/mcabber/settings.c --- 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); diff -r 0e7fe154ab76 -r d80a9e32ab1a mcabber/mcabber/settings.h --- 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);