diff options
author | Paul Aurich <darkrain42@pidgin.im> | 2009-04-27 05:49:32 +0000 |
---|---|---|
committer | Paul Aurich <darkrain42@pidgin.im> | 2009-04-27 05:49:32 +0000 |
commit | c2652e81993908d28b4512dc31381a0d4bd5da87 (patch) | |
tree | e08d9ff2a3a87f9f343186195189dcf9028936d0 | |
parent | cbb5738b8db765b8b5909aa1121e92c5217b411e (diff) | |
download | pidgin-cpw.darkrain42.xmpp.avatars.tar.gz |
Publish only 'new' xmlns of avatars and delete old.cpw.darkrain42.xmpp.avatars
Instead of publishing our avatar to both PEP nodes, publish only to the new
and delete anything at the old. We still support receiving both/either.
Backward compatibility is achieved through vcard-temp:x:update.
-rw-r--r-- | libpurple/protocols/jabber/buddy.c | 8 | ||||
-rw-r--r-- | libpurple/protocols/jabber/pep.c | 19 | ||||
-rw-r--r-- | libpurple/protocols/jabber/pep.h | 5 | ||||
-rw-r--r-- | libpurple/protocols/jabber/useravatar.c | 144 | ||||
-rw-r--r-- | libpurple/protocols/jabber/useravatar.h | 6 |
5 files changed, 79 insertions, 103 deletions
diff --git a/libpurple/protocols/jabber/buddy.c b/libpurple/protocols/jabber/buddy.c index 5a6f67d383..1a1c6f1818 100644 --- a/libpurple/protocols/jabber/buddy.c +++ b/libpurple/protocols/jabber/buddy.c @@ -485,10 +485,10 @@ void jabber_set_info(PurpleConnection *gc, const char *info) void jabber_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img) { PurpleAccount *account = purple_connection_get_account(gc); - jabber_avatar_set(gc->proto_data, img, NULL); - /* vCard avatars do not have an image type requirement so update our - * vCard avatar regardless of image type for those poor older clients - */ + + /* Publish the avatar as specified in XEP-0084 */ + jabber_avatar_set(gc->proto_data, img); + /* Set the image in our vCard */ jabber_set_info(gc, purple_account_get_user_info(account)); /* TODO: Fake image to ourselves, since a number of servers do not echo diff --git a/libpurple/protocols/jabber/pep.c b/libpurple/protocols/jabber/pep.c index eb89079b47..8a5f7377e0 100644 --- a/libpurple/protocols/jabber/pep.c +++ b/libpurple/protocols/jabber/pep.c @@ -112,6 +112,25 @@ void jabber_handle_event(JabberMessage *jm) { g_free(jid); } +void jabber_pep_delete_node(JabberStream *js, const gchar *node) +{ + JabberIq *iq; + xmlnode *pubsub, *del; + + g_return_if_fail(node != NULL); + g_return_if_fail(js->pep); + + iq = jabber_iq_new(js, JABBER_IQ_SET); + + pubsub = xmlnode_new_child(iq->node, "pubsub"); + xmlnode_set_namespace(pubsub, "http://jabber.org/protocol/pubsub#owner"); + + del = xmlnode_new_child(pubsub, "delete"); + xmlnode_set_attrib(del, "node", node); + + jabber_iq_send(iq); +} + void jabber_pep_publish(JabberStream *js, xmlnode *publish) { JabberIq *iq; xmlnode *pubsub; diff --git a/libpurple/protocols/jabber/pep.h b/libpurple/protocols/jabber/pep.h index f1c3d4e037..ae170a2422 100644 --- a/libpurple/protocols/jabber/pep.h +++ b/libpurple/protocols/jabber/pep.h @@ -74,6 +74,11 @@ gboolean jabber_pep_namespace_only_when_pep_enabled_cb(JabberStream *js, const g void jabber_handle_event(JabberMessage *jm); +/** + * Delete the specified PEP node. + */ +void jabber_pep_delete_node(JabberStream *js, const gchar *node); + /* * Publishes PEP item(s) * diff --git a/libpurple/protocols/jabber/useravatar.c b/libpurple/protocols/jabber/useravatar.c index 64486e6b24..f3b053b588 100644 --- a/libpurple/protocols/jabber/useravatar.c +++ b/libpurple/protocols/jabber/useravatar.c @@ -33,10 +33,6 @@ static void update_buddy_metadata(JabberStream *js, const char *from, xmlnode *i void jabber_avatar_init(void) { - jabber_add_feature("avatarmeta", NS_AVATAR_0_12_METADATA, - jabber_pep_namespace_only_when_pep_enabled_cb); - jabber_add_feature("avatardata", NS_AVATAR_0_12_DATA, - jabber_pep_namespace_only_when_pep_enabled_cb); jabber_pep_register_handler("avatar", NS_AVATAR_0_12_METADATA, update_buddy_metadata); @@ -49,41 +45,32 @@ void jabber_avatar_init(void) update_buddy_metadata); } -void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img, const char *ns) +static void +remove_avatar_0_12_nodes(JabberStream *js) +{ + jabber_pep_delete_node(js, NS_AVATAR_0_12_METADATA); + jabber_pep_delete_node(js, NS_AVATAR_0_12_DATA); +} + +void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img) { xmlnode *publish, *metadata, *item; if (!js->pep) return; - if (!img) { - if (ns == NULL || g_str_equal(ns, NS_AVATAR_0_12_METADATA)) { - /* remove the metadata */ - publish = xmlnode_new("publish"); - xmlnode_set_attrib(publish, "node", NS_AVATAR_0_12_METADATA); - - item = xmlnode_new_child(publish, "item"); - metadata = xmlnode_new_child(item, "metadata"); - xmlnode_set_namespace(metadata, NS_AVATAR_0_12_METADATA); - - xmlnode_new_child(metadata, "stop"); - /* publish */ - jabber_pep_publish(js, publish); - } + remove_avatar_0_12_nodes(js); - if (ns == NULL || g_str_equal(ns, NS_AVATAR_1_1_METADATA)) { - /* Now for the XEP-0084 v1.1 namespace, where we publish an empty - * metadata node instead of a <stop/> element */ - publish = xmlnode_new("publish"); - xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_METADATA); + if (!img) { + publish = xmlnode_new("publish"); + xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_METADATA); - item = xmlnode_new_child(publish, "item"); - metadata = xmlnode_new_child(item, "metadata"); - xmlnode_set_namespace(metadata, NS_AVATAR_1_1_METADATA); + item = xmlnode_new_child(publish, "item"); + metadata = xmlnode_new_child(item, "metadata"); + xmlnode_set_namespace(metadata, NS_AVATAR_1_1_METADATA); - /* publish */ - jabber_pep_publish(js, publish); - } + /* publish */ + jabber_pep_publish(js, publish); } else { /* * TODO: This is pretty gross. The Jabber PRPL really shouldn't @@ -132,35 +119,18 @@ void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img, const char *ns) char *base64avatar = purple_base64_encode(purple_imgstore_get_data(img), purple_imgstore_get_size(img)); - if (ns == NULL || g_str_equal(ns, NS_AVATAR_0_12_METADATA)) { - publish = xmlnode_new("publish"); - xmlnode_set_attrib(publish, "node", NS_AVATAR_0_12_DATA); - - item = xmlnode_new_child(publish, "item"); - xmlnode_set_attrib(item, "id", hash); - - data = xmlnode_new_child(item, "data"); - xmlnode_set_namespace(data, NS_AVATAR_0_12_DATA); - - xmlnode_insert_data(data, base64avatar, -1); - /* publish the avatar itself */ - jabber_pep_publish(js, publish); - } - - if (ns == NULL || g_str_equal(ns, NS_AVATAR_1_1_METADATA)) { - publish = xmlnode_new("publish"); - xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_DATA); + publish = xmlnode_new("publish"); + xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_DATA); - item = xmlnode_new_child(publish, "item"); - xmlnode_set_attrib(item, "id", hash); + item = xmlnode_new_child(publish, "item"); + xmlnode_set_attrib(item, "id", hash); - data = xmlnode_new_child(item, "data"); - xmlnode_set_namespace(data, NS_AVATAR_1_1_DATA); + data = xmlnode_new_child(item, "data"); + xmlnode_set_namespace(data, NS_AVATAR_1_1_DATA); - xmlnode_insert_data(data, base64avatar, -1); - /* publish the avatar itself */ - jabber_pep_publish(js, publish); - } + xmlnode_insert_data(data, base64avatar, -1); + /* publish the avatar itself */ + jabber_pep_publish(js, publish); g_free(base64avatar); @@ -169,47 +139,24 @@ void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img, const char *ns) widthstring = g_strdup_printf("%u", width); heightstring = g_strdup_printf("%u", height); - if (ns == NULL || g_str_equal(ns, NS_AVATAR_0_12_METADATA)) { - /* next step: publish the metadata to the old namespace */ - publish = xmlnode_new("publish"); - xmlnode_set_attrib(publish, "node", NS_AVATAR_0_12_METADATA); - - item = xmlnode_new_child(publish, "item"); - xmlnode_set_attrib(item, "id", hash); - - metadata = xmlnode_new_child(item, "metadata"); - xmlnode_set_namespace(metadata, NS_AVATAR_0_12_METADATA); - - info = xmlnode_new_child(metadata, "info"); - xmlnode_set_attrib(info, "id", hash); - xmlnode_set_attrib(info, "type", "image/png"); - xmlnode_set_attrib(info, "bytes", lengthstring); - xmlnode_set_attrib(info, "width", widthstring); - xmlnode_set_attrib(info, "height", heightstring); - /* publish the metadata */ - jabber_pep_publish(js, publish); - } - - if (ns == NULL || g_str_equal(ns, NS_AVATAR_1_1_METADATA)) { - /* publish the metadata to the new namespace */ - publish = xmlnode_new("publish"); - xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_METADATA); + /* publish the metadata */ + publish = xmlnode_new("publish"); + xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_METADATA); - item = xmlnode_new_child(publish, "item"); - xmlnode_set_attrib(item, "id", hash); + item = xmlnode_new_child(publish, "item"); + xmlnode_set_attrib(item, "id", hash); - metadata = xmlnode_new_child(item, "metadata"); - xmlnode_set_namespace(metadata, NS_AVATAR_1_1_METADATA); + metadata = xmlnode_new_child(item, "metadata"); + xmlnode_set_namespace(metadata, NS_AVATAR_1_1_METADATA); - info = xmlnode_new_child(metadata, "info"); - xmlnode_set_attrib(info, "id", hash); - xmlnode_set_attrib(info, "type", "image/png"); - xmlnode_set_attrib(info, "bytes", lengthstring); - xmlnode_set_attrib(info, "width", widthstring); - xmlnode_set_attrib(info, "height", heightstring); + info = xmlnode_new_child(metadata, "info"); + xmlnode_set_attrib(info, "id", hash); + xmlnode_set_attrib(info, "type", "image/png"); + xmlnode_set_attrib(info, "bytes", lengthstring); + xmlnode_set_attrib(info, "width", widthstring); + xmlnode_set_attrib(info, "height", heightstring); - jabber_pep_publish(js, publish); - } + jabber_pep_publish(js, publish); g_free(lengthstring); g_free(widthstring); @@ -242,10 +189,19 @@ do_got_own_avatar_cb(JabberStream *js, const char *from, xmlnode *items) if (!ns) return; + /* + * We no longer publish avatars to the older namespace. If there is one + * there, delete it. + */ + if (g_str_equal(ns, NS_AVATAR_0_12_METADATA) && server_hash) { + remove_avatar_0_12_nodes(js); + return; + } + /* Publish ours if it's different than the server's */ if (!purple_strequal(server_hash, js->initial_avatar_hash)) { PurpleStoredImage *img = purple_buddy_icons_find_account_icon(account); - jabber_avatar_set(js, img, ns); + jabber_avatar_set(js, img); purple_imgstore_unref(img); } } diff --git a/libpurple/protocols/jabber/useravatar.h b/libpurple/protocols/jabber/useravatar.h index 0865ae2dd7..0ae77dfdfa 100644 --- a/libpurple/protocols/jabber/useravatar.h +++ b/libpurple/protocols/jabber/useravatar.h @@ -36,11 +36,7 @@ #define NS_AVATAR_1_1_METADATA "urn:xmpp:avatar:metadata" void jabber_avatar_init(void); -/** - * @param ns The metadata namespace for which to set the avatar or NULL to set the - * avatar for both namespaces. - */ -void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img, const char *ns); +void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img); void jabber_avatar_fetch_mine(JabberStream *js); |