annotate libpurple/protocols/jabber/useravatar.c @ 28914:e14402d6c5e0

jabber: Go back to not overwriting avatars if there is not one locally set. This isn't quite right yet, because we need to pick up the hash and advertise it in our presence. Fixes #10287.
author Paul Aurich <paul@darkrain42.org>
date Fri, 13 Nov 2009 18:39:23 +0000
parents fa7f3426ed13
children 93e8e6331d44
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
1 /*
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
2 * purple - Jabber Protocol Plugin
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
3 *
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
6 * source distribution.
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
7 *
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
11 * (at your option) any later version.
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
12 *
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
16 * GNU General Public License for more details.
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
17 *
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
28397
8c991e09efcb Update various header copyrights thanks to licensecheck.
Paul Aurich <paul@darkrain42.org>
parents: 28114
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
21 *
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
22 */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
23
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
24 #include "internal.h"
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
25
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
26 #include "useravatar.h"
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
27 #include "pep.h"
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
28 #include "debug.h"
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
29
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
30 #define MAX_HTTP_BUDDYICON_BYTES (200 * 1024)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
31
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
32 static void update_buddy_metadata(JabberStream *js, const char *from, xmlnode *items);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
33
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
34 void jabber_avatar_init(void)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
35 {
26818
a0e48796defb Fix merging.
Paul Aurich <paul@darkrain42.org>
parents: 26791
diff changeset
36 jabber_add_feature(NS_AVATAR_1_1_METADATA,
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
37 jabber_pep_namespace_only_when_pep_enabled_cb);
26818
a0e48796defb Fix merging.
Paul Aurich <paul@darkrain42.org>
parents: 26791
diff changeset
38 jabber_add_feature(NS_AVATAR_1_1_DATA,
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
39 jabber_pep_namespace_only_when_pep_enabled_cb);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
40
26818
a0e48796defb Fix merging.
Paul Aurich <paul@darkrain42.org>
parents: 26791
diff changeset
41 jabber_pep_register_handler(NS_AVATAR_1_1_METADATA,
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
42 update_buddy_metadata);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
43 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
44
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
45 static void
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
46 remove_avatar_0_12_nodes(JabberStream *js)
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
47 {
26880
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
48 #if 0
26883
df7505e0d64a The correct fix here is to place non-code in a comment (yes, even if it's
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 26882
diff changeset
49 /* See note below for why this is #if 0'd */
26880
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
50
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
51 /* Publish an empty avatar according to the XEP-0084 v0.12 semantics */
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
52 xmlnode *publish, *item, *metadata;
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
53 /* publish the metadata */
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
54 publish = xmlnode_new("publish");
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
55 xmlnode_set_attrib(publish, "node", NS_AVATAR_0_12_METADATA);
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
56
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
57 item = xmlnode_new_child(publish, "item");
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
58 xmlnode_set_attrib(item, "id", "stop");
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
59
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
60 metadata = xmlnode_new_child(item, "metadata");
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
61 xmlnode_set_namespace(metadata, NS_AVATAR_0_12_METADATA);
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
62
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
63 xmlnode_new_child(metadata, "stop");
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
64
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
65 /* publish */
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
66 jabber_pep_publish(js, publish);
26880
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
67 #endif
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
68
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
69 /*
26880
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
70 * This causes ejabberd 2.0.0 to kill the connection unceremoniously.
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
71 * See https://support.process-one.net/browse/EJAB-623. When adiumx.com
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
72 * was upgraded, the issue went away.
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
73 *
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
74 * I think it makes a lot of sense to not have an avatar at the old
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
75 * node instead of having something interpreted as "no avatar". When
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
76 * a contact with an older client logs in, in the latter situation,
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
77 * there's a race between interpreting the <presence/> vcard-temp:x:update
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
78 * avatar (non-empty) and the XEP-0084 v0.12 avatar (empty, so show no
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
79 * avatar for the buddy) which leads to unhappy and confused users.
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
80 *
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
81 * A deluge of frustrating "Read error" bug reports may change my mind
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
82 * about this.
afc3ec89e83b Revert the partial hack for ejabberd 2.0.0. See comment in code.
Paul Aurich <paul@darkrain42.org>
parents: 26874
diff changeset
83 * --darkrain42
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
84 */
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
85 jabber_pep_delete_node(js, NS_AVATAR_0_12_METADATA);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
86 jabber_pep_delete_node(js, NS_AVATAR_0_12_DATA);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
87 }
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
88
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
89 void jabber_avatar_set(JabberStream *js, PurpleStoredImage *img)
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
90 {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
91 xmlnode *publish, *metadata, *item;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
92
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
93 if (!js->pep)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
94 return;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
95
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
96 /* Hmmm, not sure if this is worth the traffic, but meh */
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
97 remove_avatar_0_12_nodes(js);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
98
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
99 if (!img) {
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
100 publish = xmlnode_new("publish");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
101 xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_METADATA);
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
102
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
103 item = xmlnode_new_child(publish, "item");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
104 metadata = xmlnode_new_child(item, "metadata");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
105 xmlnode_set_namespace(metadata, NS_AVATAR_1_1_METADATA);
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
106
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
107 /* publish */
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
108 jabber_pep_publish(js, publish);
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
109 } else {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
110 /*
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
111 * TODO: This is pretty gross. The Jabber PRPL really shouldn't
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
112 * do voodoo to try to determine the image type, height
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
113 * and width.
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
114 */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
115 /* A PNG header, including the IHDR, but nothing else */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
116 const struct {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
117 guchar signature[8]; /* must be hex 89 50 4E 47 0D 0A 1A 0A */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
118 struct {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
119 guint32 length; /* must be 0x0d */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
120 guchar type[4]; /* must be 'I' 'H' 'D' 'R' */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
121 guint32 width;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
122 guint32 height;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
123 guchar bitdepth;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
124 guchar colortype;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
125 guchar compression;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
126 guchar filter;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
127 guchar interlace;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
128 } ihdr;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
129 } *png = purple_imgstore_get_data(img); /* ATTN: this is in network byte order! */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
130
26788
fbb2b8e2d91e Use purple_strequal and g_str_equal
Paul Aurich <paul@darkrain42.org>
parents: 25832
diff changeset
131 /* check if the data is a valid png file (well, at least to some extent) */
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
132 if(png->signature[0] == 0x89 &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
133 png->signature[1] == 0x50 &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
134 png->signature[2] == 0x4e &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
135 png->signature[3] == 0x47 &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
136 png->signature[4] == 0x0d &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
137 png->signature[5] == 0x0a &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
138 png->signature[6] == 0x1a &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
139 png->signature[7] == 0x0a &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
140 ntohl(png->ihdr.length) == 0x0d &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
141 png->ihdr.type[0] == 'I' &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
142 png->ihdr.type[1] == 'H' &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
143 png->ihdr.type[2] == 'D' &&
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
144 png->ihdr.type[3] == 'R') {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
145 /* parse PNG header to get the size of the image (yes, this is required) */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
146 guint32 width = ntohl(png->ihdr.width);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
147 guint32 height = ntohl(png->ihdr.height);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
148 xmlnode *data, *info;
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
149 char *lengthstring, *widthstring, *heightstring;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
150
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
151 /* compute the sha1 hash */
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
152 char *hash = jabber_calculate_data_sha1sum(purple_imgstore_get_data(img),
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
153 purple_imgstore_get_size(img));
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
154 char *base64avatar = purple_base64_encode(purple_imgstore_get_data(img),
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
155 purple_imgstore_get_size(img));
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
156
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
157 publish = xmlnode_new("publish");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
158 xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_DATA);
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
159
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
160 item = xmlnode_new_child(publish, "item");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
161 xmlnode_set_attrib(item, "id", hash);
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
162
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
163 data = xmlnode_new_child(item, "data");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
164 xmlnode_set_namespace(data, NS_AVATAR_1_1_DATA);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
165
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
166 xmlnode_insert_data(data, base64avatar, -1);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
167 /* publish the avatar itself */
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
168 jabber_pep_publish(js, publish);
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
169
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
170 g_free(base64avatar);
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
171
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
172 lengthstring = g_strdup_printf("%" G_GSIZE_FORMAT,
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
173 purple_imgstore_get_size(img));
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
174 widthstring = g_strdup_printf("%u", width);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
175 heightstring = g_strdup_printf("%u", height);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
176
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
177 /* publish the metadata */
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
178 publish = xmlnode_new("publish");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
179 xmlnode_set_attrib(publish, "node", NS_AVATAR_1_1_METADATA);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
180
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
181 item = xmlnode_new_child(publish, "item");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
182 xmlnode_set_attrib(item, "id", hash);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
183
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
184 metadata = xmlnode_new_child(item, "metadata");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
185 xmlnode_set_namespace(metadata, NS_AVATAR_1_1_METADATA);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
186
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
187 info = xmlnode_new_child(metadata, "info");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
188 xmlnode_set_attrib(info, "id", hash);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
189 xmlnode_set_attrib(info, "type", "image/png");
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
190 xmlnode_set_attrib(info, "bytes", lengthstring);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
191 xmlnode_set_attrib(info, "width", widthstring);
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
192 xmlnode_set_attrib(info, "height", heightstring);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
193
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
194 jabber_pep_publish(js, publish);
25820
c0a27a44ebd6 Support both XEP-0084 namespaces for fetching our own avatars at login
Paul Aurich <paul@darkrain42.org>
parents: 25819
diff changeset
195
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
196 g_free(lengthstring);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
197 g_free(widthstring);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
198 g_free(heightstring);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
199 g_free(hash);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
200 } else {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
201 purple_debug_error("jabber", "Cannot set PEP avatar to non-PNG data\n");
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
202 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
203 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
204 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
205
25817
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
206 static void
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
207 do_got_own_avatar_0_12_cb(JabberStream *js, const char *from, xmlnode *items)
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
208 {
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
209 if (items)
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
210 /* It wasn't an error (i.e. 'item-not-found') */
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
211 remove_avatar_0_12_nodes(js);
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
212 }
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
213
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
214 static void
25817
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
215 do_got_own_avatar_cb(JabberStream *js, const char *from, xmlnode *items)
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
216 {
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
217 xmlnode *item = NULL, *metadata = NULL, *info = NULL;
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
218 PurpleAccount *account = purple_connection_get_account(js->gc);
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
219 const char *server_hash = NULL;
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
220
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
221 if (items && (item = xmlnode_get_child(items, "item")) &&
28114
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
222 (metadata = xmlnode_get_child(item, "metadata")) &&
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
223 (info = xmlnode_get_child(metadata, "info"))) {
25817
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
224 server_hash = xmlnode_get_attrib(info, "id");
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
225 }
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
226
28114
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
227 /*
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
228 * If we have an avatar and the server returned an error/malformed data,
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
229 * push our avatar. If the server avatar doesn't match the local one, push
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
230 * our avatar.
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
231 */
28914
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
232 if ((!items || !metadata) ||
28114
93d9cf1151a4 jabber: Fix setting the PEP node the first time.
Paul Aurich <paul@darkrain42.org>
parents: 27216
diff changeset
233 !purple_strequal(server_hash, js->initial_avatar_hash)) {
25817
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
234 PurpleStoredImage *img = purple_buddy_icons_find_account_icon(account);
26791
80437c891f92 Publish only 'new' xmlns of avatars and delete old.
Paul Aurich <paul@darkrain42.org>
parents: 26790
diff changeset
235 jabber_avatar_set(js, img);
25817
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
236 purple_imgstore_unref(img);
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
237 }
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
238 }
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
239
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
240 void jabber_avatar_fetch_mine(JabberStream *js)
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
241 {
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
242 char *jid = g_strdup_printf("%s@%s", js->user->node, js->user->domain);
28914
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
243
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
244 if (js->initial_avatar_hash) {
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
245 jabber_pep_request_item(js, jid, NS_AVATAR_0_12_METADATA, NULL,
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
246 do_got_own_avatar_0_12_cb);
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
247 jabber_pep_request_item(js, jid, NS_AVATAR_1_1_METADATA, NULL,
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
248 do_got_own_avatar_cb);
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
249 }
e14402d6c5e0 jabber: Go back to not overwriting avatars if there is not one locally set.
Paul Aurich <paul@darkrain42.org>
parents: 28889
diff changeset
250
25817
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
251 g_free(jid);
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
252 }
9195955395b6 Only (re)publish XMPP avatars at login if the server's avatar differs
Paul Aurich <paul@darkrain42.org>
parents: 25816
diff changeset
253
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
254 typedef struct _JabberBuddyAvatarUpdateURLInfo {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
255 JabberStream *js;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
256 char *from;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
257 char *id;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
258 } JabberBuddyAvatarUpdateURLInfo;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
259
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
260 static void
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
261 do_buddy_avatar_update_fromurl(PurpleUtilFetchUrlData *url_data,
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
262 gpointer user_data, const gchar *url_text,
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
263 gsize len, const gchar *error_message)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
264 {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
265 JabberBuddyAvatarUpdateURLInfo *info = user_data;
27216
77cfaae36918 Need to make a copy of this because purple_util_fetch_url frees its.
Paul Aurich <paul@darkrain42.org>
parents: 26883
diff changeset
266 gpointer icon_data;
77cfaae36918 Need to make a copy of this because purple_util_fetch_url frees its.
Paul Aurich <paul@darkrain42.org>
parents: 26883
diff changeset
267
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
268 if(!url_text) {
28889
fa7f3426ed13 jabber: Convert to purple_debug_* convenience functions.
Paul Aurich <paul@darkrain42.org>
parents: 28397
diff changeset
269 purple_debug_error("jabber",
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
270 "do_buddy_avatar_update_fromurl got error \"%s\"",
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
271 error_message);
25816
b68ac693ae2d Don't leak a JabberBuddyAvatarUpdateURLInfo struct in the error case
Paul Aurich <paul@darkrain42.org>
parents: 25815
diff changeset
272 goto out;
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
273 }
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
274
27216
77cfaae36918 Need to make a copy of this because purple_util_fetch_url frees its.
Paul Aurich <paul@darkrain42.org>
parents: 26883
diff changeset
275 icon_data = g_memdup(url_text, len);
77cfaae36918 Need to make a copy of this because purple_util_fetch_url frees its.
Paul Aurich <paul@darkrain42.org>
parents: 26883
diff changeset
276 purple_buddy_icons_set_for_user(purple_connection_get_account(info->js->gc), info->from, icon_data, len, info->id);
25816
b68ac693ae2d Don't leak a JabberBuddyAvatarUpdateURLInfo struct in the error case
Paul Aurich <paul@darkrain42.org>
parents: 25815
diff changeset
277
b68ac693ae2d Don't leak a JabberBuddyAvatarUpdateURLInfo struct in the error case
Paul Aurich <paul@darkrain42.org>
parents: 25815
diff changeset
278 out:
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
279 g_free(info->from);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
280 g_free(info->id);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
281 g_free(info);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
282 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
283
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
284 static void
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
285 do_buddy_avatar_update_data(JabberStream *js, const char *from, xmlnode *items)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
286 {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
287 xmlnode *item, *data;
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
288 const char *checksum;
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
289 char *b64data;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
290 void *img;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
291 size_t size;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
292 if(!items)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
293 return;
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
294
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
295 item = xmlnode_get_child(items, "item");
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
296 if(!item)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
297 return;
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
298
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
299 data = xmlnode_get_child(item, "data");
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
300 if(!data)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
301 return;
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
302
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
303 checksum = xmlnode_get_attrib(item,"id");
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
304 if(!checksum)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
305 return;
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
306
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
307 b64data = xmlnode_get_data(data);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
308 if(!b64data)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
309 return;
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
310
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
311 img = purple_base64_decode(b64data, &size);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
312 if(!img) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
313 g_free(b64data);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
314 return;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
315 }
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
316
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
317 purple_buddy_icons_set_for_user(purple_connection_get_account(js->gc), from, img, size, checksum);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
318 g_free(b64data);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
319 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
320
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
321 static void
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
322 update_buddy_metadata(JabberStream *js, const char *from, xmlnode *items)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
323 {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
324 PurpleBuddy *buddy = purple_find_buddy(purple_connection_get_account(js->gc), from);
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
325 const char *checksum;
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
326 xmlnode *item, *metadata;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
327 if(!buddy)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
328 return;
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
329
25830
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
330 if (!items)
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
331 return;
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
332
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
333 item = xmlnode_get_child(items,"item");
25830
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
334 if (!item)
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
335 return;
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
336
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
337 metadata = xmlnode_get_child(item, "metadata");
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
338 if(!metadata)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
339 return;
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
340
25830
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
341 checksum = purple_buddy_icons_get_checksum_for_user(buddy);
b3dbc9e8b6ef I had the distinct pleasure of throwing invalid garbage at this code; it
Paul Aurich <paul@darkrain42.org>
parents: 25823
diff changeset
342
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
343 /* <stop/> was the pre-v1.1 method of publishing an empty avatar */
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
344 if(xmlnode_get_child(metadata, "stop")) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
345 purple_buddy_icons_set_for_user(purple_connection_get_account(js->gc), from, NULL, 0, NULL);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
346 } else {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
347 xmlnode *info, *goodinfo = NULL;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
348 gboolean has_children = FALSE;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
349
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
350 /* iterate over all info nodes to get one we can use */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
351 for(info = metadata->child; info; info = info->next) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
352 if(info->type == XMLNODE_TYPE_TAG)
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
353 has_children = TRUE;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
354 if(info->type == XMLNODE_TYPE_TAG && !strcmp(info->name,"info")) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
355 const char *type = xmlnode_get_attrib(info,"type");
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
356 const char *id = xmlnode_get_attrib(info,"id");
25821
5313cf16e1e2 Whitespace changes
Paul Aurich <paul@darkrain42.org>
parents: 25820
diff changeset
357
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
358 if(checksum && id && !strcmp(id, checksum)) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
359 /* we already have that avatar, so we don't have to do anything */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
360 goodinfo = NULL;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
361 break;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
362 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
363 /* We'll only pick the png one for now. It's a very nice image format anyways. */
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
364 if(type && id && !goodinfo && !strcmp(type, "image/png"))
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
365 goodinfo = info;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
366 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
367 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
368 if(has_children == FALSE) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
369 purple_buddy_icons_set_for_user(purple_connection_get_account(js->gc), from, NULL, 0, NULL);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
370 } else if(goodinfo) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
371 const char *url = xmlnode_get_attrib(goodinfo, "url");
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
372 const char *id = xmlnode_get_attrib(goodinfo,"id");
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
373
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
374 /* the avatar might either be stored in a pep node, or on a HTTP(S) URL */
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
375 if(!url) {
26874
76de9455154c Drop support for XEP-0084 v0.12 and publish a <stop/> instead of deleting the node.
Paul Aurich <paul@darkrain42.org>
parents: 26818
diff changeset
376 jabber_pep_request_item(js, from, NS_AVATAR_1_1_DATA, id,
25819
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
377 do_buddy_avatar_update_data);
ba8f51cb3691 Support XEP-0084 (User Avatar) v1.1 alongside v0.12
Paul Aurich <paul@darkrain42.org>
parents: 25817
diff changeset
378 } else {
25815
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
379 PurpleUtilFetchUrlData *url_data;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
380 JabberBuddyAvatarUpdateURLInfo *info = g_new0(JabberBuddyAvatarUpdateURLInfo, 1);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
381 info->js = js;
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
382
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
383 url_data = purple_util_fetch_url_len(url, TRUE, NULL, TRUE,
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
384 MAX_HTTP_BUDDYICON_BYTES,
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
385 do_buddy_avatar_update_fromurl, info);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
386 if (url_data) {
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
387 info->from = g_strdup(from);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
388 info->id = g_strdup(id);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
389 js->url_datas = g_slist_prepend(js->url_datas, url_data);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
390 } else
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
391 g_free(info);
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
392
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
393 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
394 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
395 }
5dd25c58b65e Migrate the XMPP User Avatar (XEP-0084) code to its own file
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
396 }