diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-05-18 10:43:25 +0800 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-05-18 10:43:25 +0800 |
commit | 5bacee9160d693ce0bd2abebacf86293a95d9c55 (patch) | |
tree | ddfecdd61bfa8aca25d93bc9361d04cbc0e51ac7 | |
parent | 7a50f19c30cf8388774e1182652eb2c1329ef220 (diff) | |
parent | a389d921d384916612835142d90300fb1365aba9 (diff) | |
download | gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.tar gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.tar.gz gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.tar.bz2 gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.tar.lz gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.tar.xz gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.tar.zst gsoc2013-empathy-5bacee9160d693ce0bd2abebacf86293a95d9c55.zip |
Merge branch 'alias-upstream-166' into empathy-skype
-rw-r--r-- | libempathy-gtk/empathy-contact-widget.c | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c index 93ab9d510..4efa9a0da 100644 --- a/libempathy-gtk/empathy-contact-widget.c +++ b/libempathy-gtk/empathy-contact-widget.c @@ -279,6 +279,23 @@ contact_info_field_spec_cmp (TpContactInfoFieldSpec *spec1, return contact_info_field_name_cmp (spec1->name, spec2->name); } +static TpContactInfoFieldSpec * +get_spec_from_list (GList *list, + const gchar *name) +{ + GList *l; + + for (l = list; l != NULL; l = g_list_next (l)) + { + TpContactInfoFieldSpec *spec = l->data; + + if (!tp_strdiff (spec->name, name)) + return spec; + } + + return NULL; +} + static guint contact_widget_details_update_edit (EmpathyContactWidget *information) { @@ -1062,13 +1079,44 @@ set_nickname_cb (GObject *source, } } +/* Update all the contact info fields having the +* Overwritten_By_Nickname flag to the new alias. This avoid accidentally +* reseting the alias when calling SetContactInfo(). See bgo #644298 for +* details. */ static void -set_alias_on_account (TpAccount *account, - const gchar *alias) +update_nickname_in_contact_info (EmpathyContactWidget *self, + TpConnection *connection, + const gchar *nickname) { - DEBUG ("Set Account.Nickname to %s", alias); + GList *specs, *l; - tp_account_set_nickname_async (account, alias, set_nickname_cb, NULL); + specs = tp_connection_get_contact_info_supported_fields (connection); + + for (l = self->details_to_set; l != NULL; l= g_list_next (l)) + { + TpContactInfoField *field = l->data; + TpContactInfoFieldSpec *spec; + + spec = get_spec_from_list (specs, field->field_name); + /* We shouldn't have added the field to details_to_set if it's not + * supported by the CM */ + g_assert (spec != NULL); + + if (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_OVERWRITTEN_BY_NICKNAME) + { + const gchar *strv[] = { nickname, NULL }; + + DEBUG ("Updating field '%s' to '%s' as it has the " + "Overwritten_By_Nickname flag and Account.Nickname has " + "been updated", field->field_name, nickname); + + if (field->field_value != NULL) + g_strfreev (field->field_value); + field->field_value = g_strdupv ((GStrv) strv); + } + } + + g_list_free (specs); } static gboolean @@ -1085,9 +1133,21 @@ contact_widget_entry_alias_focus_event_cb (GtkEditable *editable, if (empathy_contact_is_user (information->contact)) { TpAccount * account; + const gchar *current_nickname; account = empathy_contact_get_account (information->contact); - set_alias_on_account (account, alias); + current_nickname = tp_account_get_nickname (account); + + if (tp_strdiff (current_nickname, alias)) + { + DEBUG ("Set Account.Nickname to %s", alias); + + tp_account_set_nickname_async (account, alias, set_nickname_cb, + NULL); + + update_nickname_in_contact_info (information, + empathy_contact_get_connection (information->contact), alias); + } } else { |