diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-02-25 18:26:09 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-02-25 18:26:09 +0000 |
commit | 4fe5fa27a0186c9edab2ffc8ec38c21ce2416f37 (patch) | |
tree | 3b4f9464abb92c908e9eee0f8c0bd9c4c1fd2e41 | |
parent | 8aad28fecf3717ec06941a5d4ea7a4deb4e0cc75 (diff) |
SetAliases: When connected to GTalk, set the FN instead of the NICKNAME
Google's servers won't let us change fields other than N, FN and PHOTO,
so this is the best we can do.
This requires the test in vcard/redundant-set.py to be made more
realistic.
-rw-r--r-- | src/conn-aliasing.c | 4 | ||||
-rw-r--r-- | src/vcard-manager.c | 42 | ||||
-rw-r--r-- | src/vcard-manager.h | 4 | ||||
-rw-r--r-- | tests/twisted/vcard/redundant-set.py | 13 |
4 files changed, 53 insertions, 10 deletions
diff --git a/src/conn-aliasing.c b/src/conn-aliasing.c index 62496503e..fc48b0b25 100644 --- a/src/conn-aliasing.c +++ b/src/conn-aliasing.c @@ -547,8 +547,8 @@ setaliases_foreach (gpointer key, gpointer value, gpointer user_data) lm_message_unref (msg); } - gabble_vcard_manager_edit_one (data->conn->vcard_manager, 0, NULL, NULL, - G_OBJECT (data->conn), "NICKNAME", alias); + gabble_vcard_manager_edit_alias (data->conn->vcard_manager, 0, NULL, + NULL, G_OBJECT (data->conn), alias); } if (NULL != error) diff --git a/src/vcard-manager.c b/src/vcard-manager.c index 13d2368c4..ed4d82494 100644 --- a/src/vcard-manager.c +++ b/src/vcard-manager.c @@ -700,10 +700,24 @@ status_changed_cb (GObject *object, alias_src = _gabble_connection_get_cached_alias (conn, base->self_handle, &alias); + if (alias_src >= GABBLE_CONNECTION_ALIAS_FROM_VCARD) - priv->edits = g_slist_append (priv->edits, - gabble_vcard_manager_edit_info_new ("NICKNAME", alias, - GABBLE_VCARD_EDIT_REPLACE, NULL)); + { + /* Same logic as in gabble_vcard_manager_edit_alias, which we + * don't use here to avoid a duplicate 'get' request */ + if (gabble_vcard_manager_can_use_vcard_field (self, "NICKNAME")) + { + priv->edits = g_slist_append (priv->edits, + gabble_vcard_manager_edit_info_new ("NICKNAME", alias, + GABBLE_VCARD_EDIT_REPLACE, NULL)); + } + else + { + priv->edits = g_slist_append (priv->edits, + gabble_vcard_manager_edit_info_new ("FN", alias, + GABBLE_VCARD_EDIT_REPLACE, NULL)); + } + } g_free (alias); @@ -1536,6 +1550,28 @@ gabble_vcard_manager_edit_one (GabbleVCardManager *self, user_data, object, edits, FALSE); } +GabbleVCardManagerEditRequest * +gabble_vcard_manager_edit_alias (GabbleVCardManager *self, + guint timeout, + GabbleVCardManagerEditCb callback, + gpointer user_data, + GObject *object, + const gchar *new_alias) +{ + if (gabble_vcard_manager_can_use_vcard_field (self, "NICKNAME")) + { + return gabble_vcard_manager_edit_one (self, timeout, callback, user_data, + object, "NICKNAME", new_alias); + } + else + { + /* Google Talk servers won't let us set a NICKNAME; recover by + * setting the FN */ + return gabble_vcard_manager_edit_one (self, timeout, callback, user_data, + object, "FN", new_alias); + } +} + /* Add a pending request to edit the vCard. When it finishes, call the given * callback. The callback may be NULL. * diff --git a/src/vcard-manager.h b/src/vcard-manager.h index 75db5e9be..b824b0621 100644 --- a/src/vcard-manager.h +++ b/src/vcard-manager.h @@ -157,6 +157,10 @@ void gabble_vcard_manager_edit_info_free (GabbleVCardManagerEditInfo *info); gboolean gabble_vcard_manager_can_use_vcard_field (GabbleVCardManager *self, const gchar *field_name); +GabbleVCardManagerEditRequest *gabble_vcard_manager_edit_alias ( + GabbleVCardManager *self, guint timeout, GabbleVCardManagerEditCb callback, + gpointer user_data, GObject *object, const gchar *new_alias); + /* For unit tests only */ void gabble_vcard_manager_set_suspend_reply_timeout (guint timeout); void gabble_vcard_manager_set_default_request_timeout (guint timeout); diff --git a/tests/twisted/vcard/redundant-set.py b/tests/twisted/vcard/redundant-set.py index 05a73f111..d3694348e 100644 --- a/tests/twisted/vcard/redundant-set.py +++ b/tests/twisted/vcard/redundant-set.py @@ -24,11 +24,14 @@ def test(q, bus, conn, stream, is_google): result = make_result_iq(stream, iq_event.stanza) # Testing reveals that Google's vCard server does not actually support - # NICKNAME (or indeed any fields beside FN and PHOTO): if you set a vCard - # including it, it accepts the request but strips out the unsupported - # fields. So if the server looks like Google, we don't bother re-setting - # the NICKNAME. - if not is_google: + # NICKNAME (or indeed any fields beside FN, N and PHOTO): if you set a + # vCard including it, it accepts the request but strips out the unsupported + # fields. So if the server looks like Google, it's a redundant set + # operation on FN that we want to avoid. + if is_google: + vcard = result.firstChildElement() + vcard.addElement('FN', content='oh hello there') + else: vcard = result.firstChildElement() vcard.addElement('NICKNAME', content='oh hello there') |