~vish/ubuntu/maverick/pidgin/bug25979

« back to all changes in this revision

Viewing changes to libpurple/protocols/jabber/data.c

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2009-10-09 19:40:26 UTC
  • mfrom: (1.4.1 upstream) (46.1.10 karmic)
  • Revision ID: james.westby@ubuntu.com-20091009194026-wbqqh0bsbz19nx5q
Tags: 1:2.6.2-1ubuntu7
* Don't stick the buddy list window to all desktops as some
  window managers have trouble to properly unstick it (LP: #346840)
  - debian/patches/11_buddy_list_really_show.patch
* Always use default tray icon size on KDE (LP: #209440)
  - debian/patches/62_tray_icon_size_kde.patch
* Use scrollbars in the preferences dialog if the screen height is
  below 700 px instead of 600 px
  - debian/patches/60_1024x600_gtkprefs.c.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
 
2
 * Purple is the legal property of its developers, whose names are too numerous
 
3
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 
4
 * source distribution.
 
5
 *
2
6
 * This program is free software; you can redistribute it and/or modify
3
7
 * it under the terms of the GNU General Public License as published by
4
8
 * the Free Software Foundation; either version 2 of the License, or
5
9
 * (at your option) any later version.
6
 
 * 
 
10
 *
7
11
 * This program is distributed in the hope that it will be useful,
8
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
14
 * GNU Library General Public License for more details.
11
 
 * 
 
15
 *
12
16
 * You should have received a copy of the GNU General Public License
13
17
 * along with this program; if not, write to the Free Software
14
 
 * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
 
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
15
19
 */
16
 
 
 
20
 
17
21
#include <stdlib.h>
18
22
#include <glib.h>
19
23
#include <string.h>
52
56
JabberData *
53
57
jabber_data_create_from_xml(xmlnode *tag)
54
58
{
55
 
        JabberData *data = g_new0(JabberData, 1);
56
 
        gsize size;
57
 
        gpointer raw_data = NULL;
58
 
 
59
 
        if (data == NULL) {
60
 
                purple_debug_error("jabber", "Could not allocate data object\n");
61
 
                g_free(data);
62
 
                return NULL;
63
 
        }
 
59
        JabberData *data;
 
60
        gchar *raw_data = NULL;
 
61
        const gchar *cid, *type;
64
62
 
65
63
        /* check if this is a "data" tag */
66
64
        if (strcmp(tag->name, "data") != 0) {
67
 
                purple_debug_error("jabber", "Invalid data element");
68
 
                g_free(data);
69
 
                return NULL;
70
 
        }
71
 
 
72
 
        data->cid = g_strdup(xmlnode_get_attrib(tag, "cid"));
73
 
        data->type = g_strdup(xmlnode_get_attrib(tag, "type"));
74
 
        
 
65
                purple_debug_error("jabber", "Invalid data element\n");
 
66
                return NULL;
 
67
        }
 
68
 
 
69
        cid = xmlnode_get_attrib(tag, "cid");
 
70
        type = xmlnode_get_attrib(tag, "type");
 
71
 
 
72
        if (!cid || !type) {
 
73
                purple_debug_error("jabber", "cid or type missing\n");
 
74
                return NULL;
 
75
        }
 
76
 
75
77
        raw_data = xmlnode_get_data(tag);
76
 
        data->data = purple_base64_decode(raw_data, &size);
77
 
        data->size = size;
78
 
 
 
78
 
 
79
        if (raw_data == NULL || *raw_data == '\0') {
 
80
                purple_debug_error("jabber", "data element was empty");
 
81
                g_free(raw_data);
 
82
                return NULL;
 
83
        }
 
84
 
 
85
        data = g_new0(JabberData, 1);
 
86
        data->data = purple_base64_decode(raw_data, &data->size);
79
87
        g_free(raw_data);
80
88
 
 
89
        if (data->data == NULL) {
 
90
                purple_debug_error("jabber", "Malformed base64 data\n");
 
91
                g_free(data);
 
92
                return NULL;
 
93
        }
 
94
 
 
95
        data->cid = g_strdup(cid);
 
96
        data->type = g_strdup(type);
 
97
 
81
98
        return data;
82
99
}
83
100
 
176
193
jabber_data_find_remote_by_cid(const gchar *cid)
177
194
{
178
195
        purple_debug_info("jabber", "lookup remote smiley with cid = %s\n", cid);
179
 
        
 
196
 
180
197
        return g_hash_table_lookup(remote_data_by_cid, cid);
181
198
}
182
199
 
186
203
        purple_debug_info("jabber", "associating local smiley\n alt = %s, cid = %s\n",
187
204
                alt, jabber_data_get_cid(data));
188
205
        g_hash_table_insert(local_data_by_alt, g_strdup(alt), data);
189
 
        g_hash_table_insert(local_data_by_cid, g_strdup(jabber_data_get_cid(data)), 
 
206
        g_hash_table_insert(local_data_by_cid, g_strdup(jabber_data_get_cid(data)),
190
207
                data);
191
208
}
192
209
 
195
212
{
196
213
        purple_debug_info("jabber", "associating remote smiley, cid = %s\n",
197
214
                jabber_data_get_cid(data));
198
 
        g_hash_table_insert(remote_data_by_cid, g_strdup(jabber_data_get_cid(data)), 
 
215
        g_hash_table_insert(remote_data_by_cid, g_strdup(jabber_data_get_cid(data)),
199
216
                data);
200
217
}
201
218
 
202
219
void
203
 
jabber_data_parse(JabberStream *js, xmlnode *packet)
 
220
jabber_data_parse(JabberStream *js, const char *who, JabberIqType type,
 
221
                  const char *id, xmlnode *data_node)
204
222
{
205
223
        JabberIq *result = NULL;
206
 
        const char *who = xmlnode_get_attrib(packet, "from");
207
 
        xmlnode *data_node = xmlnode_get_child(packet, "data");
208
 
        const JabberData *data =
209
 
                jabber_data_find_local_by_cid(xmlnode_get_attrib(data_node, "cid"));
 
224
        const char *cid = xmlnode_get_attrib(data_node, "cid");
 
225
        const JabberData *data = cid ? jabber_data_find_local_by_cid(cid) : NULL;
210
226
 
211
227
        if (!data) {
212
228
                xmlnode *item_not_found = xmlnode_new("item-not-found");
213
229
 
214
230
                result = jabber_iq_new(js, JABBER_IQ_ERROR);
215
 
                xmlnode_set_attrib(result->node, "to", who);
216
 
                xmlnode_set_attrib(result->node, "id", xmlnode_get_attrib(packet, "id"));
 
231
                if (who)
 
232
                        xmlnode_set_attrib(result->node, "to", who);
 
233
                xmlnode_set_attrib(result->node, "id", id);
217
234
                xmlnode_insert_child(result->node, item_not_found);
218
235
        } else {
219
236
                result = jabber_iq_new(js, JABBER_IQ_RESULT);
220
 
                xmlnode_set_attrib(result->node, "to", who);
221
 
                xmlnode_set_attrib(result->node, "id", xmlnode_get_attrib(packet, "id"));
 
237
                if (who)
 
238
                        xmlnode_set_attrib(result->node, "to", who);
 
239
                xmlnode_set_attrib(result->node, "id", id);
222
240
                xmlnode_insert_child(result->node,
223
241
                                                         jabber_data_get_xml_definition(data));
224
242
        }
235
253
                g_free, jabber_data_delete);
236
254
        remote_data_by_cid = g_hash_table_new_full(g_str_hash, g_str_equal,
237
255
                g_free, jabber_data_delete);
 
256
 
 
257
        jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse);
238
258
}
239
259
 
240
260
void
244
264
        g_hash_table_destroy(local_data_by_alt);
245
265
        g_hash_table_destroy(local_data_by_cid);
246
266
        g_hash_table_destroy(remote_data_by_cid);
 
267
        local_data_by_alt = local_data_by_cid = remote_data_by_cid = NULL;
247
268
}