annotate libpurple/protocols/jabber/parser.c @ 29006:e1c01f236674

Correctly parse "<br>" in an XML attribute. Closes #11318. If nobody has objections, I intend to add purple_unescape_text() to util.[ch] for 2.7.0.
author Paul Aurich <paul@darkrain42.org>
date Wed, 10 Feb 2010 03:32:29 +0000
parents d558d141aaae
children 05d727f76ca9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
1 /*
15822
32c366eeeb99 sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@gmail.com>
parents: 15634
diff changeset
2 * purple - Jabber XML parser stuff
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
3 *
28048
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27137
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27137
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27137
diff changeset
6 * source distribution.
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
7 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
11 * (at your option) any later version.
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
12 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
16 * GNU General Public License for more details.
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
17 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
19681
44b4e8bd759b The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 15822
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
21 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
22 */
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
23 #include "internal.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
24
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
25 #include <libxml/parser.h>
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
26
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
27 #include "connection.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
28 #include "debug.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
29 #include "jabber.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
30 #include "parser.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
31 #include "util.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
32 #include "xmlnode.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
33
29006
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
34 static char *purple_unescape_text(const char *in)
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
35 {
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
36 GString *ret;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
37 const char *c = in;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
38
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
39 if (in == NULL)
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
40 return NULL;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
41
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
42 ret = g_string_new("");
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
43 while (*c) {
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
44 int len;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
45 const char *ent;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
46
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
47 if ((ent = purple_markup_unescape_entity(c, &len)) != NULL) {
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
48 g_string_append(ret, ent);
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
49 c += len;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
50 } else {
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
51 g_string_append_c(ret, *c);
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
52 c++;
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
53 }
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
54 }
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
55
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
56 return g_string_free(ret, FALSE);
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
57 }
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
58
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
59 static void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
60 jabber_parser_element_start_libxml(void *user_data,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
61 const xmlChar *element_name, const xmlChar *prefix, const xmlChar *namespace,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
62 int nb_namespaces, const xmlChar **namespaces,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
63 int nb_attributes, int nb_defaulted, const xmlChar **attributes)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
64 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
65 JabberStream *js = user_data;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
66 xmlnode *node;
24853
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
67 int i, j;
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
68
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
69 if(!element_name) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
70 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
71 } else if(!xmlStrcmp(element_name, (xmlChar*) "stream")) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
72 js->protocol_version = JABBER_PROTO_0_9;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
73 for(i=0; i < nb_attributes * 5; i += 5) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
74 int attrib_len = attributes[i+4] - attributes[i+3];
28726
f6f35d5960e9 Use g_strndup() for great justice.
Paul Aurich <paul@darkrain42.org>
parents: 28681
diff changeset
75 char *attrib = g_strndup((gchar *)attributes[i+3], attrib_len);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
76
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
77 if(!xmlStrcmp(attributes[i], (xmlChar*) "version")
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
78 && !strcmp(attrib, "1.0")) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
79 js->protocol_version = JABBER_PROTO_1_0;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
80 g_free(attrib);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
81 } else if(!xmlStrcmp(attributes[i], (xmlChar*) "id")) {
15634
baec42670246 Patch from MatsMattsson (Adium Trac #6429) which fixes a leak of attrib for any attribute that isn't 'id' or 'version'.
Evan Schoenberg <evan.s@dreskin.net>
parents: 15497
diff changeset
82 g_free(js->stream_id);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
83 js->stream_id = attrib;
15634
baec42670246 Patch from MatsMattsson (Adium Trac #6429) which fixes a leak of attrib for any attribute that isn't 'id' or 'version'.
Evan Schoenberg <evan.s@dreskin.net>
parents: 15497
diff changeset
84 } else {
24853
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
85 g_free(attrib);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
86 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
87 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
88 } else {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
89
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
90 if(js->current)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
91 node = xmlnode_new_child(js->current, (const char*) element_name);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
92 else
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
93 node = xmlnode_new((const char*) element_name);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
94 xmlnode_set_namespace(node, (const char*) namespace);
24853
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
95 xmlnode_set_prefix(node, (const char *)prefix);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
96
24853
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
97 if (nb_namespaces != 0) {
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
98 node->namespace_map = g_hash_table_new_full(
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
99 g_str_hash, g_str_equal, g_free, g_free);
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
100
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
101 for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
102 const char *key = (const char *)namespaces[j];
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
103 const char *val = (const char *)namespaces[j + 1];
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
104 g_hash_table_insert(node->namespace_map,
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
105 g_strdup(key ? key : ""), g_strdup(val ? val : ""));
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
106 }
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24480
diff changeset
107 }
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
108 for(i=0; i < nb_attributes * 5; i+=5) {
26180
b03430dae08e Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 25476
diff changeset
109 const char *name = (const char *)attributes[i];
b03430dae08e Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 25476
diff changeset
110 const char *prefix = (const char *)attributes[i+1];
25476
b096f7fb6899 Don't set an attribute prefix on the node, and remove an unnecessary call
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 24926
diff changeset
111 const char *attrib_ns = (const char *)attributes[i+2];
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
112 char *txt;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
113 int attrib_len = attributes[i+4] - attributes[i+3];
28726
f6f35d5960e9 Use g_strndup() for great justice.
Paul Aurich <paul@darkrain42.org>
parents: 28681
diff changeset
114 char *attrib = g_strndup((gchar *)attributes[i+3], attrib_len);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
115
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
116 txt = attrib;
29006
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 28744
diff changeset
117 attrib = purple_unescape_text(txt);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
118 g_free(txt);
26180
b03430dae08e Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 25476
diff changeset
119 xmlnode_set_attrib_full(node, name, attrib_ns, prefix, attrib);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
120 g_free(attrib);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
121 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
122
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
123 js->current = node;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
124 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
125 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
126
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
127 static void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
128 jabber_parser_element_end_libxml(void *user_data, const xmlChar *element_name,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
129 const xmlChar *prefix, const xmlChar *namespace)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
130 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
131 JabberStream *js = user_data;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
132
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
133 if(!js->current)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
134 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
135
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
136 if(js->current->parent) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
137 if(!xmlStrcmp((xmlChar*) js->current->name, element_name))
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
138 js->current = js->current->parent;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
139 } else {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
140 xmlnode *packet = js->current;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
141 js->current = NULL;
17894
bbd92ee894f2 Fixed a bug in the XMPP parser involving event handlers that replace the xmlnode packet. This caused double frees in this situation. The replacing function must free the xmlnode, since multiple event handlers could do this, and the intermediate xml trees would leak otherwise.
Andreas Monitzer <pidgin@monitzer.com>
parents: 17879
diff changeset
142 jabber_process_packet(js, &packet);
24480
7cf760f3560e Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers
Will Thompson <will.thompson@collabora.co.uk>
parents: 24474
diff changeset
143 if (packet != NULL)
7cf760f3560e Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers
Will Thompson <will.thompson@collabora.co.uk>
parents: 24474
diff changeset
144 xmlnode_free(packet);
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
145 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
146 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
147
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
148 static void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
149 jabber_parser_element_text_libxml(void *user_data, const xmlChar *text, int text_len)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
150 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
151 JabberStream *js = user_data;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
152
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
153 if(!js->current)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
154 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
155
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
156 if(!text || !text_len)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
157 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
158
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
159 xmlnode_insert_data(js->current, (const char*) text, text_len);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
160 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
161
23424
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
162 static void
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
163 jabber_parser_structured_error_handler(void *user_data, xmlErrorPtr error)
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
164 {
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
165 JabberStream *js = user_data;
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
166
24471
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
167 if (error->level == XML_ERR_WARNING && error->message != NULL
28681
f043c5a07042 Use g_str_equal()
Paul Aurich <paul@darkrain42.org>
parents: 28652
diff changeset
168 && g_str_equal(error->message, "xmlns: URI vcard-temp is not absolute\n"))
24471
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
169 /*
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
170 * This message happens when parsing vcards, and is normal, so don't
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
171 * bother logging it because people scare easily.
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
172 */
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
173 return;
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
174
28727
6ebacc1710b2 jabber: Use the error code instead of string matching.
Paul Aurich <paul@darkrain42.org>
parents: 28726
diff changeset
175 if (error->level == XML_ERR_FATAL && error->code == XML_ERR_DOCUMENT_END)
28652
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
176 /*
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
177 * This is probably more annoying than the vcard-temp error; it occurs
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
178 * because we disconnect in most cases without waiting for the receiving
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
179 * </stream:stream> (limitations of libpurple)
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
180 */
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
181 return;
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
182
23424
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
183 purple_debug_error("jabber", "XML parser error for JabberStream %p: "
24471
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23954
diff changeset
184 "Domain %i, code %i, level %i: %s",
23424
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
185 js,
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
186 error->domain, error->code, error->level,
24474
8de8ca65e1d9 I know Mark was trying to save newlines, but I had one to spare.
Richard Laager <rlaager@wiktel.com>
parents: 24471
diff changeset
187 (error->message ? error->message : "(null)\n"));
23424
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
188 }
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
189
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
190 static xmlSAXHandler jabber_parser_libxml = {
22912
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
191 NULL, /*internalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
192 NULL, /*isStandalone*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
193 NULL, /*hasInternalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
194 NULL, /*hasExternalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
195 NULL, /*resolveEntity*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
196 NULL, /*getEntity*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
197 NULL, /*entityDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
198 NULL, /*notationDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
199 NULL, /*attributeDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
200 NULL, /*elementDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
201 NULL, /*unparsedEntityDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
202 NULL, /*setDocumentLocator*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
203 NULL, /*startDocument*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
204 NULL, /*endDocument*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
205 NULL, /*startElement*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
206 NULL, /*endElement*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
207 NULL, /*reference*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
208 jabber_parser_element_text_libxml, /*characters*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
209 NULL, /*ignorableWhitespace*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
210 NULL, /*processingInstruction*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
211 NULL, /*comment*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
212 NULL, /*warning*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
213 NULL, /*error*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
214 NULL, /*fatalError*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
215 NULL, /*getParameterEntity*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
216 NULL, /*cdataBlock*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
217 NULL, /*externalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
218 XML_SAX2_MAGIC, /*initialized*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
219 NULL, /*_private*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
220 jabber_parser_element_start_libxml, /*startElementNs*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
221 jabber_parser_element_end_libxml, /*endElementNs*/
23424
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22912
diff changeset
222 jabber_parser_structured_error_handler /*serror*/
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
223 };
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
224
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
225 void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
226 jabber_parser_setup(JabberStream *js)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
227 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
228 /* This seems backwards, but it makes sense. The libxml code creates
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
229 * the parser context when you try to use it (this way, it can figure
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
230 * out the encoding at creation time. So, setting up the parser is
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
231 * just a matter of destroying any current parser. */
17876
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15822
diff changeset
232 jabber_parser_free(js);
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15822
diff changeset
233 }
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15822
diff changeset
234
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15822
diff changeset
235 void jabber_parser_free(JabberStream *js) {
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
236 if (js->context) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
237 xmlParseChunk(js->context, NULL,0,1);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
238 xmlFreeParserCtxt(js->context);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
239 js->context = NULL;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
240 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
241 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
242
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
243 void jabber_parser_process(JabberStream *js, const char *buf, int len)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
244 {
23425
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23424
diff changeset
245 int ret;
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23424
diff changeset
246
23427
76dbcdd86fe2 Whitespace fix
Evan Schoenberg <evan.s@dreskin.net>
parents: 23426
diff changeset
247 if (js->context == NULL) {
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
248 /* libxml inconsistently starts parsing on creating the
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
249 * parser, so do a ParseChunk right afterwards to force it. */
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
250 js->context = xmlCreatePushParserCtxt(&jabber_parser_libxml, js, buf, len, NULL);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
251 xmlParseChunk(js->context, "", 0, 0);
23425
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23424
diff changeset
252 } else if ((ret = xmlParseChunk(js->context, buf, len, 0)) != XML_ERR_OK) {
23954
08c50482d5a2 Only disconnect xmpp connections during xml parsing if the error is an
Stu Tomlinson <stu@nosnilmot.com>
parents: 23427
diff changeset
253 xmlError *err = xmlCtxtGetLastError(js->context);
25586
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
254 /*
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
255 * libxml2 uses a global setting to determine whether or not to store
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
256 * warnings. Other libraries may set this, which causes err to be
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
257 * NULL. See #8136 for details.
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
258 */
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
259 xmlErrorLevel level = XML_ERR_WARNING;
23425
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23424
diff changeset
260
25586
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
261 if (err)
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
262 level = err->level;
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
263
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25476
diff changeset
264 switch (level) {
24926
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
265 case XML_ERR_NONE:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
266 purple_debug_info("jabber", "xmlParseChunk returned info %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
267 break;
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
268 case XML_ERR_WARNING:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
269 purple_debug_warning("jabber", "xmlParseChunk returned warning %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
270 break;
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
271 case XML_ERR_ERROR:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
272 purple_debug_error("jabber", "xmlParseChunk returned error %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
273 break;
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
274 case XML_ERR_FATAL:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
275 purple_debug_error("jabber", "xmlParseChunk returned fatal %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
276 purple_connection_error_reason (js->gc,
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
277 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
278 _("XML Parse error"));
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24853
diff changeset
279 break;
23426
ce361cc8e43b Drop and then recover from XML messages which trigger invalid character
Evan Schoenberg <evan.s@dreskin.net>
parents: 23425
diff changeset
280 }
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
281 }
28327
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
282
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
283 if (js->protocol_version == JABBER_PROTO_0_9 && !js->gc->disconnect_timeout &&
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
284 (js->state == JABBER_STREAM_INITIALIZING ||
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
285 js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION)) {
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
286 /*
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
287 * Legacy servers don't advertise features, so if we've just gotten
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
288 * the opening <stream:stream> and there was no version, we need to
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
289 * immediately start legacy IQ auth.
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
290 */
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
291 jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents: 28327
diff changeset
292 jabber_auth_start_old(js);
28327
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
293 }
15373
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
294 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
295