summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-02-25 18:26:09 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-02-25 18:26:09 +0000
commit4fe5fa27a0186c9edab2ffc8ec38c21ce2416f37 (patch)
tree3b4f9464abb92c908e9eee0f8c0bd9c4c1fd2e41
parent8aad28fecf3717ec06941a5d4ea7a4deb4e0cc75 (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.c4
-rw-r--r--src/vcard-manager.c42
-rw-r--r--src/vcard-manager.h4
-rw-r--r--tests/twisted/vcard/redundant-set.py13
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')