From 4da4893bd535d6e122f99300e2f5152d40723bbc Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 7 Jun 2012 11:50:14 +0200 Subject: [PATCH] account-settings: always use GVariant to store parameters https://bugzilla.gnome.org/show_bug.cgi?id=677545 --- libempathy-gtk/empathy-account-widget-irc.c | 23 +- libempathy-gtk/empathy-account-widget.c | 65 ++-- libempathy-gtk/empathy-irc-network-chooser.c | 5 +- libempathy-gtk/empathy-new-account-dialog.c | 8 +- libempathy/empathy-account-settings.c | 299 ++++++++++--------- libempathy/empathy-account-settings.h | 8 +- 6 files changed, 220 insertions(+), 188 deletions(-) diff --git a/libempathy-gtk/empathy-account-widget-irc.c b/libempathy-gtk/empathy-account-widget-irc.c index b4d5673a..8e671946 100644 --- a/libempathy-gtk/empathy-account-widget-irc.c +++ b/libempathy-gtk/empathy-account-widget-irc.c @@ -57,19 +57,19 @@ account_widget_irc_destroy_cb (GtkWidget *widget, static void account_widget_irc_setup (EmpathyAccountWidgetIrc *settings) { - const gchar *nick = NULL; - const gchar *fullname = NULL; + gchar *nick = NULL; + gchar *fullname = NULL; EmpathyAccountSettings *ac_settings; g_object_get (settings->self, "settings", &ac_settings, NULL); - nick = empathy_account_settings_get_string (ac_settings, "account"); - fullname = empathy_account_settings_get_string (ac_settings, + nick = empathy_account_settings_dup_string (ac_settings, "account"); + fullname = empathy_account_settings_dup_string (ac_settings, "fullname"); if (nick == NULL) { - nick = g_get_user_name (); + nick = g_strdup (g_get_user_name ()); empathy_account_settings_set (ac_settings, "account", g_variant_new_string (nick)); @@ -77,14 +77,17 @@ account_widget_irc_setup (EmpathyAccountWidgetIrc *settings) if (fullname == NULL) { - fullname = g_get_real_name (); + fullname = g_strdup (g_get_real_name ()); if (fullname == NULL) - fullname = nick; + fullname = g_strdup (nick); empathy_account_settings_set (ac_settings, "fullname", g_variant_new_string (fullname)); } + + g_free (nick); + g_free (fullname); } static void @@ -146,7 +149,7 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, EmpathyAccountWidgetIrc *settings; EmpathyAccountSettings *ac_settings; GtkWidget *entry_password; - const gchar *password; + gchar *password; settings = g_slice_new0 (EmpathyAccountWidgetIrc); settings->self = self; @@ -190,7 +193,7 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, g_object_unref (ac_settings); /* Automatically set password-prompt when needed */ - password = empathy_account_settings_get_string (ac_settings, "password"); + password = empathy_account_settings_dup_string (ac_settings, "password"); if (set_password_prompt_if_needed (ac_settings, password)) { @@ -198,6 +201,8 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, empathy_account_settings_apply_async (ac_settings, NULL, NULL); } + g_free (password); + g_signal_connect (entry_password, "changed", G_CALLBACK (entry_password_changed_cb), settings); diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c index df56816b..00f85df6 100644 --- a/libempathy-gtk/empathy-account-widget.c +++ b/libempathy-gtk/empathy-account-widget.c @@ -288,16 +288,18 @@ account_widget_entry_changed_common (EmpathyAccountWidget *self, if (EMP_STR_EMPTY (str)) { - const gchar *value = NULL; - empathy_account_settings_unset (self->priv->settings, param_name); if (focus) { - value = empathy_account_settings_get_string (self->priv->settings, + gchar *value; + + value = empathy_account_settings_dup_string (self->priv->settings, param_name); + DEBUG ("Unset %s and restore to %s", param_name, value); gtk_entry_set_text (entry, value ? value : ""); + g_free (value); } } else @@ -450,7 +452,7 @@ account_widget_combobox_changed_cb (GtkWidget *widget, GtkTreeIter iter; GtkTreeModel *model; const gchar *value; - const GValue *v; + GVariant *v; const gchar *default_value = NULL; const gchar *param_name; @@ -463,9 +465,9 @@ account_widget_combobox_changed_cb (GtkWidget *widget, param_name = g_object_get_data (G_OBJECT (widget), "param_name"); - v = empathy_account_settings_get_default (self->priv->settings, param_name); - if (v != NULL) - default_value = g_value_get_string (v); + v = empathy_account_settings_dup_default (self->priv->settings, param_name); + if (v != NULL && g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)) + default_value = g_variant_get_string (v, NULL); if (!tp_strdiff (value, default_value)) { @@ -480,6 +482,8 @@ account_widget_combobox_changed_cb (GtkWidget *widget, } empathy_account_widget_changed (self); + + tp_clear_pointer (&v, g_variant_unref); } static void @@ -576,9 +580,9 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self, } else if (GTK_IS_ENTRY (widget)) { - const gchar *str = NULL; + gchar *str; - str = empathy_account_settings_get_string (self->priv->settings, + str = empathy_account_settings_dup_string (self->priv->settings, param_name); gtk_entry_set_text (GTK_ENTRY (widget), str ? str : ""); @@ -609,11 +613,12 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self, g_signal_connect (widget, "activate", G_CALLBACK (account_entry_activated_cb), self); - g_signal_connect (widget, "changed", G_CALLBACK (account_widget_entry_changed_cb), self); g_signal_connect (widget, "map", G_CALLBACK (account_widget_entry_map_cb), self); + + g_free (str); } else if (GTK_IS_TOGGLE_BUTTON (widget)) { @@ -631,12 +636,12 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self, { /* The combo box's model has to contain the param value in its first * column (as a string) */ - const gchar *str; + gchar *str; GtkTreeModel *model; GtkTreeIter iter; gboolean valid; - str = empathy_account_settings_get_string (self->priv->settings, + str = empathy_account_settings_dup_string (self->priv->settings, param_name); model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget)); @@ -659,6 +664,8 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self, g_free (name); } + g_free (str); + g_signal_connect (widget, "changed", G_CALLBACK (account_widget_combobox_changed_cb), self); @@ -1225,14 +1232,15 @@ static void suffix_id_widget_changed_cb (GtkWidget *entry, EmpathyAccountWidget *self) { - const gchar *account; + gchar *account; g_assert (self->priv->jid_suffix != NULL); account_widget_entry_changed_common (self, GTK_ENTRY (entry), FALSE); - account = empathy_account_settings_get_string (self->priv->settings, + account = empathy_account_settings_dup_string (self->priv->settings, "account"); + if (!EMP_STR_EMPTY (account) && !g_str_has_suffix (account, self->priv->jid_suffix)) { @@ -1248,6 +1256,8 @@ suffix_id_widget_changed_cb (GtkWidget *entry, } empathy_account_widget_changed (self); + + g_free (account); } static gchar * @@ -1267,7 +1277,7 @@ setup_id_widget_with_suffix (EmpathyAccountWidget *self, GtkWidget *widget, const gchar *suffix) { - const gchar *str = NULL; + gchar *str = NULL; g_object_set_data_full (G_OBJECT (widget), "param_name", g_strdup ("account"), g_free); @@ -1275,7 +1285,7 @@ setup_id_widget_with_suffix (EmpathyAccountWidget *self, g_assert (self->priv->jid_suffix == NULL); self->priv->jid_suffix = g_strdup (suffix); - str = empathy_account_settings_get_string (self->priv->settings, "account"); + str = empathy_account_settings_dup_string (self->priv->settings, "account"); if (str != NULL) { gchar *tmp; @@ -1283,6 +1293,7 @@ setup_id_widget_with_suffix (EmpathyAccountWidget *self, tmp = remove_jid_suffix (self, str); gtk_entry_set_text (GTK_ENTRY (widget), tmp); g_free (tmp); + g_free (str); } self->priv->param_account_widget = widget; @@ -1883,7 +1894,9 @@ account_settings_password_retrieved_cb (GObject *object, gpointer user_data) { EmpathyAccountWidget *self = user_data; - const gchar *password = empathy_account_settings_get_string ( + gchar *password; + + password = empathy_account_settings_dup_string ( self->priv->settings, "password"); if (password != NULL) @@ -1900,6 +1913,8 @@ account_settings_password_retrieved_cb (GObject *object, gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (self->priv->remember_password_widget), !EMP_STR_EMPTY (password)); + + g_free (password); } static void @@ -1984,10 +1999,14 @@ do_constructed (GObject *obj) } else { + gchar *password; + + password = empathy_account_settings_dup_string (self->priv->settings, + "password"); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (self->priv->remember_password_widget), - !EMP_STR_EMPTY (empathy_account_settings_get_string ( - self->priv->settings, "password"))); + !EMP_STR_EMPTY (password)); /* The password might not have been retrieved from the * keyring yet. We should update the remember password @@ -1995,6 +2014,8 @@ do_constructed (GObject *obj) tp_g_signal_connect_object (self->priv->settings, "password-retrieved", G_CALLBACK (account_settings_password_retrieved_cb), self, 0); + + g_free (password); } g_signal_connect (self->priv->remember_password_widget, "toggled", @@ -2232,12 +2253,12 @@ empathy_account_widget_new_for_protocol (EmpathyAccountSettings *settings, gchar * empathy_account_widget_get_default_display_name (EmpathyAccountWidget *self) { - const gchar *login_id; + gchar *login_id; const gchar *protocol, *p; gchar *default_display_name; Service service; - login_id = empathy_account_settings_get_string (self->priv->settings, + login_id = empathy_account_settings_dup_string (self->priv->settings, "account"); protocol = empathy_account_settings_get_protocol (self->priv->settings); service = account_widget_get_service (self); @@ -2291,6 +2312,8 @@ empathy_account_widget_get_default_display_name (EmpathyAccountWidget *self) default_display_name = g_strdup (_("New account")); } + g_free (login_id); + return default_display_name; } diff --git a/libempathy-gtk/empathy-irc-network-chooser.c b/libempathy-gtk/empathy-irc-network-chooser.c index ac814e61..d6c51aee 100644 --- a/libempathy-gtk/empathy-irc-network-chooser.c +++ b/libempathy-gtk/empathy-irc-network-chooser.c @@ -225,11 +225,11 @@ static void set_label_from_settings (EmpathyIrcNetworkChooser *self) { EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); - const gchar *server; + gchar *server; tp_clear_object (&priv->network); - server = empathy_account_settings_get_string (priv->settings, "server"); + server = empathy_account_settings_dup_string (priv->settings, "server"); if (server != NULL) { @@ -263,6 +263,7 @@ set_label_from_settings (EmpathyIrcNetworkChooser *self) set_label (self); g_object_unref (srv); + g_free (server); return; } diff --git a/libempathy-gtk/empathy-new-account-dialog.c b/libempathy-gtk/empathy-new-account-dialog.c index ed09be82..c36cfcfc 100644 --- a/libempathy-gtk/empathy-new-account-dialog.c +++ b/libempathy-gtk/empathy-new-account-dialog.c @@ -66,11 +66,11 @@ protocol_changed_cb (GtkComboBox *chooser, /* Save "account" and "password" parameters */ if (self->priv->settings != NULL) { - account = g_strdup (empathy_account_settings_get_string ( - self->priv->settings, "account")); + account = empathy_account_settings_dup_string ( + self->priv->settings, "account"); - password = g_strdup (empathy_account_settings_get_string ( - self->priv->settings, "password")); + password = empathy_account_settings_dup_string ( + self->priv->settings, "password"); g_object_unref (self->priv->settings); } diff --git a/libempathy/empathy-account-settings.c b/libempathy/empathy-account-settings.c index 8a0e61fb..a14e5c10 100644 --- a/libempathy/empathy-account-settings.c +++ b/libempathy/empathy-account-settings.c @@ -492,7 +492,7 @@ empathy_account_settings_migrate_password_cb (GObject *source, g_hash_table_unref (empty); } -static const GValue * empathy_account_settings_get ( +static GVariant * empathy_account_settings_dup ( EmpathyAccountSettings *settings, const gchar *param); @@ -500,13 +500,16 @@ static void empathy_account_settings_try_migrating_password (EmpathyAccountSettings *self) { EmpathyAccountSettingsPriv *priv = GET_PRIV (self); - const GValue *v; + GVariant *v; const gchar *password; - if (!priv->supports_sasl || empathy_account_settings_get ( - self, "password") == NULL) + v = empathy_account_settings_dup (self, "password"); + if (v == NULL) return; + if (!priv->supports_sasl) + goto out; + /* mission-control still has our password, although the CM * supports SASL. Let's try migrating it. */ @@ -514,16 +517,14 @@ empathy_account_settings_try_migrating_password (EmpathyAccountSettings *self) "keyring ourselves for account %s", tp_account_get_path_suffix (priv->account)); - v = empathy_account_settings_get (self, "password"); - /* I can't imagine why this would fail. */ - if (!G_VALUE_HOLDS_STRING (v)) - return; + if (!g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)) + goto out; - password = g_value_get_string (v); + password = g_variant_get_string (v, NULL); if (EMP_STR_EMPTY (password)) - return; + goto out; empathy_keyring_set_account_password_async (priv->account, password, empathy_account_settings_migrate_password_cb, self); @@ -534,6 +535,9 @@ empathy_account_settings_try_migrating_password (EmpathyAccountSettings *self) priv->password = g_strdup (password); priv->password_original = g_strdup (password); + +out: + g_variant_unref (v); } static void @@ -832,18 +836,17 @@ account_settings_remove_from_unset (EmpathyAccountSettings *settings, } } -const GValue * -empathy_account_settings_get_default (EmpathyAccountSettings *settings, +GVariant * +empathy_account_settings_dup_default (EmpathyAccountSettings *settings, const gchar *param) { const TpConnectionManagerParam *p; p = empathy_account_settings_get_tp_param (settings, param); - - if (p == NULL || !(p->flags & TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT)) + if (p == NULL) return NULL; - return &(p->default_value); + return tp_connection_manager_param_dup_default_variant (p); } const gchar * @@ -860,43 +863,35 @@ empathy_account_settings_get_dbus_signature (EmpathyAccountSettings *settings, return tp_connection_manager_param_get_dbus_signature (p); } -static const GValue * -empathy_account_settings_get (EmpathyAccountSettings *settings, +static GVariant * +empathy_account_settings_dup (EmpathyAccountSettings *settings, const gchar *param) { EmpathyAccountSettingsPriv *priv = GET_PRIV (settings); - const GValue *result = NULL; - GVariant *variant; + GVariant *result; /* Lookup the update parameters we set */ - variant = g_hash_table_lookup (priv->parameters, param); - if (variant != NULL) - { - GValue v = G_VALUE_INIT; - - dbus_g_value_parse_g_variant (variant, &v); - result = (const GValue *) tp_g_value_slice_dup (&v); - - g_value_unset (&v); - /* FIXME: this GValue is leaked */ - return result; - } + result = g_hash_table_lookup (priv->parameters, param); + if (result != NULL) + return g_variant_ref (result); /* If the parameters isn't unset use the accounts setting if any */ if (priv->account != NULL && !empathy_account_settings_is_unset (settings, param)) { - const GHashTable *parameters; + GVariant *parameters; - parameters = tp_account_get_parameters (priv->account); - result = tp_asv_lookup (parameters, param); + parameters = tp_account_dup_parameters_vardict (priv->account); + result = g_variant_lookup_value (parameters, param, NULL); + g_variant_unref (parameters); if (result != NULL) + /* g_variant_lookup_value() is (transfer full) */ return result; } /* fallback to the default */ - return empathy_account_settings_get_default (settings, param); + return empathy_account_settings_dup_default (settings, param); } void @@ -940,76 +935,80 @@ empathy_account_settings_discard_changes (EmpathyAccountSettings *settings) priv->uri_scheme_tel = FALSE; } -const gchar * -empathy_account_settings_get_string (EmpathyAccountSettings *settings, +gchar * +empathy_account_settings_dup_string (EmpathyAccountSettings *settings, const gchar *param) { EmpathyAccountSettingsPriv *priv = GET_PRIV (settings); - const GValue *v; + GVariant *v; + gchar *result = NULL; if (!tp_strdiff (param, "password") && priv->supports_sasl) { - return priv->password; + return g_strdup (priv->password); } - v = empathy_account_settings_get (settings, param); - - if (v == NULL || !G_VALUE_HOLDS_STRING (v)) + v = empathy_account_settings_dup (settings, param); + if (v == NULL) return NULL; - return g_value_get_string (v); + if (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)) + result = g_variant_dup_string (v, NULL); + + g_variant_unref (v); + return result; } -const gchar * const * -empathy_account_settings_get_strv (EmpathyAccountSettings *settings, +GStrv +empathy_account_settings_dup_strv (EmpathyAccountSettings *settings, const gchar *param) { - const GValue *v; - - v = empathy_account_settings_get (settings, param); + GVariant *v; + GStrv result = NULL; - if (v == NULL || !G_VALUE_HOLDS (v, G_TYPE_STRV)) + v = empathy_account_settings_dup (settings, param); + if (v == NULL) return NULL; - return g_value_get_boxed (v); + if (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING_ARRAY)) + result = g_variant_dup_strv (v, NULL); + + g_variant_unref (v); + return result; } gint32 empathy_account_settings_get_int32 (EmpathyAccountSettings *settings, const gchar *param) { - const GValue *v; + GVariant *v; gint32 ret = 0; - v = empathy_account_settings_get (settings, param); - + v = empathy_account_settings_dup (settings, param); if (v == NULL) return 0; - switch G_VALUE_TYPE (v) + if (g_variant_is_of_type (v, G_VARIANT_TYPE_BYTE)) + ret = g_variant_get_byte (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT32)) + ret = g_variant_get_int32 (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) + ret = CLAMP (g_variant_get_uint32 (v), (guint) G_MININT32, + G_MAXINT32); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT64)) + ret = CLAMP (g_variant_get_int64 (v), G_MININT32, G_MAXINT32); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT64)) + ret = CLAMP (g_variant_get_uint64 (v), (guint64) G_MININT32, G_MAXINT32); + else { - case G_TYPE_UCHAR: - ret = g_value_get_uchar (v); - break; - case G_TYPE_INT: - ret = g_value_get_int (v); - break; - case G_TYPE_UINT: - ret = CLAMP (g_value_get_uint (v), (guint) G_MININT32, - G_MAXINT32); - break; - case G_TYPE_INT64: - ret = CLAMP (g_value_get_int64 (v), G_MININT32, G_MAXINT32); - break; - case G_TYPE_UINT64: - ret = CLAMP (g_value_get_uint64 (v), (guint64) G_MININT32, - G_MAXINT32); - break; - default: - ret = 0; - break; + gchar *tmp; + + tmp = g_variant_print (v, TRUE); + DEBUG ("Unsupported type for param '%s': %s'", param, tmp); + g_free (tmp); } + g_variant_unref (v); return ret; } @@ -1017,35 +1016,33 @@ gint64 empathy_account_settings_get_int64 (EmpathyAccountSettings *settings, const gchar *param) { - const GValue *v; + GVariant *v; gint64 ret = 0; - v = empathy_account_settings_get (settings, param); + v = empathy_account_settings_dup (settings, param); if (v == NULL) return 0; - switch G_VALUE_TYPE (v) + if (g_variant_is_of_type (v, G_VARIANT_TYPE_BYTE)) + ret = g_variant_get_byte (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT32)) + ret = g_variant_get_int32 (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) + ret = g_variant_get_uint32 (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT64)) + ret = g_variant_get_int64 (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT64)) + ret = CLAMP (g_variant_get_uint64 (v), (guint64) G_MININT64, G_MAXINT64); + else { - case G_TYPE_UCHAR: - ret = g_value_get_uchar (v); - break; - case G_TYPE_INT: - ret = g_value_get_int (v); - break; - case G_TYPE_UINT: - ret = g_value_get_uint (v); - break; - case G_TYPE_INT64: - ret = g_value_get_int64 (v); - break; - case G_TYPE_UINT64: - ret = CLAMP (g_value_get_uint64 (v), (guint64) G_MININT64, G_MAXINT64); - break; - default: - ret = 0; - break; + gchar *tmp; + + tmp = g_variant_print (v, TRUE); + DEBUG ("Unsupported type for param '%s': %s'", param, tmp); + g_free (tmp); } + g_variant_unref (v); return ret; } @@ -1053,35 +1050,33 @@ guint32 empathy_account_settings_get_uint32 (EmpathyAccountSettings *settings, const gchar *param) { - const GValue *v; - guint32 ret; + GVariant *v; + guint32 ret = 0; - v = empathy_account_settings_get (settings, param); + v = empathy_account_settings_dup (settings, param); if (v == NULL) return 0; - switch G_VALUE_TYPE (v) + if (g_variant_is_of_type (v, G_VARIANT_TYPE_BYTE)) + ret = g_variant_get_byte (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT32)) + ret = MAX (0, g_variant_get_int32 (v)); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) + ret = g_variant_get_uint32 (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT64)) + ret = CLAMP (g_variant_get_int64 (v), 0, G_MAXUINT32); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT64)) + ret = MIN (g_variant_get_uint64 (v), G_MAXUINT32); + else { - case G_TYPE_UCHAR: - ret = g_value_get_uchar (v); - break; - case G_TYPE_INT: - ret = MAX (0, g_value_get_int (v)); - break; - case G_TYPE_UINT: - ret = g_value_get_uint (v); - break; - case G_TYPE_INT64: - ret = CLAMP (g_value_get_int64 (v), 0, G_MAXUINT32); - break; - case G_TYPE_UINT64: - ret = MIN (g_value_get_uint64 (v), G_MAXUINT32); - break; - default: - ret = 0; - break; + gchar *tmp; + + tmp = g_variant_print (v, TRUE); + DEBUG ("Unsupported type for param '%s': %s'", param, tmp); + g_free (tmp); } + g_variant_unref (v); return ret; } @@ -1089,36 +1084,34 @@ guint64 empathy_account_settings_get_uint64 (EmpathyAccountSettings *settings, const gchar *param) { - const GValue *v; + GVariant *v; guint64 ret = 0; - v = empathy_account_settings_get (settings, param); - - if (v == NULL || !G_VALUE_HOLDS_INT (v)) + v = empathy_account_settings_dup (settings, param); + if (v == NULL) return 0; - switch G_VALUE_TYPE (v) + if (g_variant_is_of_type (v, G_VARIANT_TYPE_BYTE)) + ret = g_variant_get_byte (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT32)) + ret = MAX (0, g_variant_get_int32 (v)); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) + ret = g_variant_get_uint32 (v); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_INT64)) + ret = MAX (0, g_variant_get_int64 (v)); + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_UINT64)) + ret = g_variant_get_uint64 (v); + else { - case G_TYPE_UCHAR: - ret = g_value_get_uchar (v); - break; - case G_TYPE_INT: - ret = MAX (0, g_value_get_int (v)); - break; - case G_TYPE_UINT: - ret = g_value_get_uint (v); - break; - case G_TYPE_INT64: - ret = MAX (0, g_value_get_int64 (v)); - break; - case G_TYPE_UINT64: - ret = g_value_get_uint64 (v); - break; - default: - ret = 0; - break; + gchar *tmp; + + tmp = g_variant_print (v, TRUE); + DEBUG ("Unsupported type for param '%s': %s'", param, tmp); + g_free (tmp); } + + g_variant_unref (v); return ret; } @@ -1126,14 +1119,17 @@ gboolean empathy_account_settings_get_boolean (EmpathyAccountSettings *settings, const gchar *param) { - const GValue *v; + GVariant *v; + gboolean result = FALSE; - v = empathy_account_settings_get (settings, param); + v = empathy_account_settings_dup (settings, param); + if (v == NULL) + return result; - if (v == NULL || !G_VALUE_HOLDS_BOOLEAN (v)) - return FALSE; + if (g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) + result = g_variant_get_boolean (v); - return g_value_get_boolean (v); + return result; } void @@ -1673,7 +1669,6 @@ empathy_account_settings_parameter_is_valid ( { EmpathyAccountSettingsPriv *priv; const GRegex *regex; - const gchar *value; g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE); @@ -1704,9 +1699,17 @@ test_regex: regex = g_hash_table_lookup (priv->param_regexps, param); if (regex) { - value = empathy_account_settings_get_string (settings, param); - if (value != NULL && !g_regex_match (regex, value, 0, NULL)) + gchar *value; + gboolean match; + + value = empathy_account_settings_dup_string (settings, param); + if (value == NULL) return FALSE; + + match = g_regex_match (regex, value, 0, NULL); + + g_free (value); + return match; } return TRUE; diff --git a/libempathy/empathy-account-settings.h b/libempathy/empathy-account-settings.h index fef32827..e48ce988 100644 --- a/libempathy/empathy-account-settings.h +++ b/libempathy/empathy-account-settings.h @@ -104,14 +104,14 @@ const gchar * empathy_account_settings_get_dbus_signature (EmpathyAccountSettings *setting, const gchar *param); -const GValue * -empathy_account_settings_get_default (EmpathyAccountSettings *settings, +GVariant * +empathy_account_settings_dup_default (EmpathyAccountSettings *settings, const gchar *param); -const gchar *empathy_account_settings_get_string ( +gchar * empathy_account_settings_dup_string ( EmpathyAccountSettings *settings, const gchar *param); -const gchar * const * empathy_account_settings_get_strv ( +GStrv empathy_account_settings_dup_strv ( EmpathyAccountSettings *settings, const gchar *param); -- 2.39.2