Mercurial > hg
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);