libpurple/xmlnode.c

Fri, 19 Oct 2007 18:27:12 +0000

author
Luke Schierer <lschiere@pidgin.im>
date
Fri, 19 Oct 2007 18:27:12 +0000
branch
release-2.2.2
changeset 20224
d4b827c606db
parent 20147
66f05a854eee
child 20228
ce019944d765
permissions
-rw-r--r--

applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
through 525a410c03e7e16535f3fe683f9651283109265d

applied changes from 525a410c03e7e16535f3fe683f9651283109265d
through d4b316d73ebaf93803ca2642e78b8821c3b5d5c7

7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
1 /**
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
2 * @file xmlnode.c XML DOM functions
20147
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19897
diff changeset
3 */
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19897
diff changeset
4
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19897
diff changeset
5 /* purple
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
6 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15609
diff changeset
7 * Purple is the legal property of its developers, whose names are too numerous
8046
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7642
diff changeset
8 * to list here. Please refer to the COPYRIGHT file distributed with this
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7642
diff changeset
9 * source distribution.
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
10 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
11 * This program is free software; you can redistribute it and/or modify
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
13 * the Free Software Foundation; either version 2 of the License, or
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
14 * (at your option) any later version.
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
15 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
16 * This program is distributed in the hope that it will be useful,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
19 * GNU General Public License for more details.
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
20 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
22 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 19821
diff changeset
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
24 */
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
25
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
26 /* A lot of this code at least resembles the code in libxode, but since
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
27 * libxode uses memory pools that we simply have no need for, I decided to
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
28 * write my own stuff. Also, re-writing this lets me be as lightweight
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
29 * as I want to be. Thank you libxode for giving me a good starting point */
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
30
15977
057b184c15d9 Don't advertise that we support the adverts, invite and translate
Mark Doliner <markdoliner@pidgin.im>
parents: 15884
diff changeset
31 #include "debug.h"
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
32 #include "internal.h"
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
33
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
34 #include <libxml/parser.h>
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
35 #include <string.h>
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
36 #include <glib.h>
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
37
14386
5563ea640401 [gaim-migrate @ 17019]
Nathan Walp <nwalp@pidgin.im>
parents: 14384
diff changeset
38 #include "dbus-maybe.h"
14233
4f5fe687b21d [gaim-migrate @ 16821]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14097
diff changeset
39 #include "util.h"
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
40 #include "xmlnode.h"
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
41
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
42 #ifdef _WIN32
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
43 # define NEWLINE_S "\r\n"
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
44 #else
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
45 # define NEWLINE_S "\n"
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
46 #endif
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
47
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
48 static xmlnode*
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
49 new_node(const char *name, XMLNodeType type)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
50 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
51 xmlnode *node = g_new0(xmlnode, 1);
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
52
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
53 node->name = g_strdup(name);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
54 node->type = type;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
55
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15609
diff changeset
56 PURPLE_DBUS_REGISTER_POINTER(node, xmlnode);
14386
5563ea640401 [gaim-migrate @ 17019]
Nathan Walp <nwalp@pidgin.im>
parents: 14384
diff changeset
57
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
58 return node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
59 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
60
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
61 xmlnode*
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
62 xmlnode_new(const char *name)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
63 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
64 g_return_val_if_fail(name != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
65
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
66 return new_node(name, XMLNODE_TYPE_TAG);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
67 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
68
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
69 xmlnode *
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
70 xmlnode_new_child(xmlnode *parent, const char *name)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
71 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
72 xmlnode *node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
73
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
74 g_return_val_if_fail(parent != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
75 g_return_val_if_fail(name != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
76
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
77 node = new_node(name, XMLNODE_TYPE_TAG);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
78
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
79 xmlnode_insert_child(parent, node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
80
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
81 return node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
82 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
83
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
84 void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
85 xmlnode_insert_child(xmlnode *parent, xmlnode *child)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
86 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
87 g_return_if_fail(parent != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
88 g_return_if_fail(child != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
89
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
90 child->parent = parent;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
91
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
92 if(parent->lastchild) {
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
93 parent->lastchild->next = child;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
94 } else {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
95 parent->child = child;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
96 }
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
97
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
98 parent->lastchild = child;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
99 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
100
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
101 void
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
102 xmlnode_insert_data(xmlnode *node, const char *data, gssize size)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
103 {
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
104 xmlnode *child;
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
105 gsize real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
106
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
107 g_return_if_fail(node != NULL);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
108 g_return_if_fail(data != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
109 g_return_if_fail(size != 0);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
110
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
111 real_size = size == -1 ? strlen(data) : size;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
112
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
113 child = new_node(NULL, XMLNODE_TYPE_DATA);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
114
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
115 child->data = g_memdup(data, real_size);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
116 child->data_sz = real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
117
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
118 xmlnode_insert_child(node, child);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
119 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
120
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
121 void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
122 xmlnode_remove_attrib(xmlnode *node, const char *attr)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
123 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
124 xmlnode *attr_node, *sibling = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
125
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
126 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
127 g_return_if_fail(attr != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
128
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
129 for(attr_node = node->child; attr_node; attr_node = attr_node->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
130 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
131 if(attr_node->type == XMLNODE_TYPE_ATTRIB &&
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
132 !strcmp(attr_node->name, attr))
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
133 {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
134 if(node->child == attr_node) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
135 node->child = attr_node->next;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
136 } else {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
137 sibling->next = attr_node->next;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
138 }
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
139 if (node->lastchild == attr_node) {
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
140 node->lastchild = sibling;
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
141 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
142 xmlnode_free(attr_node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
143 return;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
144 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
145 sibling = attr_node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
146 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
147 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
148
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
149 /* Compare two nullable xmlns strings.
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
150 * They are considered equal if they're both NULL or the strings are equal
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
151 */
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
152 static gboolean _xmlnode_compare_xmlns(const char *xmlns1, const char *xmlns2) {
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
153 gboolean equal = FALSE;
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
154
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
155 if (xmlns1 == NULL && xmlns2 == NULL)
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
156 equal = TRUE;
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
157 else if (xmlns1 != NULL && xmlns2 != NULL && !strcmp(xmlns1, xmlns2))
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
158 equal = TRUE;
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
159
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
160 return equal;
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
161 }
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
162
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
163 void
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
164 xmlnode_remove_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns)
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
165 {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
166 xmlnode *attr_node, *sibling = NULL;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
167
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
168 g_return_if_fail(node != NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
169 g_return_if_fail(attr != NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
170
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
171 for(attr_node = node->child; attr_node; attr_node = attr_node->next)
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
172 {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
173 if(attr_node->type == XMLNODE_TYPE_ATTRIB &&
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
174 !strcmp(attr_node->name, attr) &&
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
175 _xmlnode_compare_xmlns(xmlns, attr_node->xmlns))
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
176 {
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
177 if(node->child == attr_node) {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
178 node->child = attr_node->next;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
179 } else {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
180 sibling->next = attr_node->next;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
181 }
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
182 if (node->lastchild == attr_node) {
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
183 node->lastchild = sibling;
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
184 }
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
185 xmlnode_free(attr_node);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
186 return;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
187 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
188 sibling = attr_node;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
189 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
190 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
191
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
192 void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
193 xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
194 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
195 xmlnode *attrib_node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
196
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
197 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
198 g_return_if_fail(attr != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
199 g_return_if_fail(value != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
200
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
201 xmlnode_remove_attrib(node, attr);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
202
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
203 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
204
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
205 attrib_node->data = g_strdup(value);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
206
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
207 xmlnode_insert_child(node, attrib_node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
208 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
209
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
210 void
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
211 xmlnode_set_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns, const char *value)
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
212 {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
213 xmlnode *attrib_node;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
214
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
215 g_return_if_fail(node != NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
216 g_return_if_fail(attr != NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
217 g_return_if_fail(value != NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
218
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
219 xmlnode_remove_attrib_with_namespace(node, attr, xmlns);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
220
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
221 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
222
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
223 attrib_node->data = g_strdup(value);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
224 attrib_node->xmlns = g_strdup(xmlns);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
225
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
226 xmlnode_insert_child(node, attrib_node);
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
227 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
228
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
229 const char *
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
230 xmlnode_get_attrib(xmlnode *node, const char *attr)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
231 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
232 xmlnode *x;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
233
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
234 g_return_val_if_fail(node != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
235
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
236 for(x = node->child; x; x = x->next) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
237 if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
238 return x->data;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
239 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
240 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
241
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
242 return NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
243 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
244
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
245 const char *
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
246 xmlnode_get_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns)
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
247 {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
248 xmlnode *x;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
249
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
250 g_return_val_if_fail(node != NULL, NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
251
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
252 for(x = node->child; x; x = x->next) {
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
253 if(x->type == XMLNODE_TYPE_ATTRIB &&
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
254 !strcmp(attr, x->name) &&
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
255 _xmlnode_compare_xmlns(xmlns, x->xmlns)) {
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
256 return x->data;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
257 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
258 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
259
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
260 return NULL;
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
261 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
262
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
263
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
264 void xmlnode_set_namespace(xmlnode *node, const char *xmlns)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
265 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
266 g_return_if_fail(node != NULL);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
267
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
268 g_free(node->xmlns);
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
269 node->xmlns = g_strdup(xmlns);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
270 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
271
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
272 const char *xmlnode_get_namespace(xmlnode *node)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
273 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
274 g_return_val_if_fail(node != NULL, NULL);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
275
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
276 return node->xmlns;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
277 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
278
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
279 void
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
280 xmlnode_free(xmlnode *node)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
281 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
282 xmlnode *x, *y;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
283
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
284 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
285
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
286 /* if we're part of a tree, remove ourselves from the tree first */
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
287 if(NULL != node->parent) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
288 if(node->parent->child == node) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
289 node->parent->child = node->next;
19568
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
290 if (node->parent->lastchild == node)
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
291 node->parent->lastchild = node->next;
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
292 } else {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
293 xmlnode *prev = node->parent->child;
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
294 while(prev && prev->next != node) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
295 prev = prev->next;
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
296 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
297 if(prev) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
298 prev->next = node->next;
19568
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
299 if (node->parent->lastchild == node)
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
300 node->parent->lastchild = prev;
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
301 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
302 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
303 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
304
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
305 /* now free our children */
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
306 x = node->child;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
307 while(x) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
308 y = x->next;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
309 xmlnode_free(x);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
310 x = y;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
311 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
312
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
313 /* now dispose of ourselves */
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
314 g_free(node->name);
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
315 g_free(node->data);
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
316 g_free(node->xmlns);
14386
5563ea640401 [gaim-migrate @ 17019]
Nathan Walp <nwalp@pidgin.im>
parents: 14384
diff changeset
317
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15609
diff changeset
318 PURPLE_DBUS_UNREGISTER_POINTER(node);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
319 g_free(node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
320 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
321
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
322 xmlnode*
10736
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
323 xmlnode_get_child(const xmlnode *parent, const char *name)
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
324 {
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
325 return xmlnode_get_child_with_namespace(parent, name, NULL);
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
326 }
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
327
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
328 xmlnode *
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
329 xmlnode_get_child_with_namespace(const xmlnode *parent, const char *name, const char *ns)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
330 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
331 xmlnode *x, *ret = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
332 char **names;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
333 char *parent_name, *child_name;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
334
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
335 g_return_val_if_fail(parent != NULL, NULL);
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
336 g_return_val_if_fail(name != NULL, NULL);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
337
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
338 names = g_strsplit(name, "/", 2);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
339 parent_name = names[0];
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
340 child_name = names[1];
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
341
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
342 for(x = parent->child; x; x = x->next) {
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
343 /* XXX: Is it correct to ignore the namespace for the match if none was specified? */
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
344 const char *xmlns = NULL;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
345 if(ns)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
346 xmlns = xmlnode_get_namespace(x);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
347
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
348 if(x->type == XMLNODE_TYPE_TAG && name && !strcmp(parent_name, x->name)
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
349 && (!ns || (xmlns && !strcmp(ns, xmlns)))) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
350 ret = x;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
351 break;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
352 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
353 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
354
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
355 if(child_name && ret)
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
356 ret = xmlnode_get_child(ret, child_name);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
357
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
358 g_strfreev(names);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
359 return ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
360 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
361
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
362 char *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
363 xmlnode_get_data(xmlnode *node)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
364 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
365 GString *str = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
366 xmlnode *c;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
367
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
368 g_return_val_if_fail(node != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
369
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
370 for(c = node->child; c; c = c->next) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
371 if(c->type == XMLNODE_TYPE_DATA) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
372 if(!str)
18131
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
373 str = g_string_new_len(c->data, c->data_sz);
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
374 else
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
375 str = g_string_append_len(str, c->data, c->data_sz);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
376 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
377 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
378
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
379 if (str == NULL)
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
380 return NULL;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
381
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
382 return g_string_free(str, FALSE);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
383 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
384
18131
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
385 char *
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
386 xmlnode_get_data_unescaped(xmlnode *node)
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
387 {
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
388 char *escaped = xmlnode_get_data(node);
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
389
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
390 char *unescaped = escaped ? purple_unescape_html(escaped) : NULL;
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
391
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
392 g_free(escaped);
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
393
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
394 return unescaped;
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
395 }
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
396
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
397 static char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
398 xmlnode_to_str_helper(xmlnode *node, int *len, gboolean formatting, int depth)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
399 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
400 GString *text = g_string_new("");
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
401 xmlnode *c;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
402 char *node_name, *esc, *esc2, *tab = NULL;
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
403 gboolean need_end = FALSE, pretty = formatting;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
404
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
405 g_return_val_if_fail(node != NULL, NULL);
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
406
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
407 if(pretty && depth) {
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
408 tab = g_strnfill(depth, '\t');
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
409 text = g_string_append(text, tab);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
410 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
411
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
412 node_name = g_markup_escape_text(node->name, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
413 g_string_append_printf(text, "<%s", node_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
414
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
415 if (node->xmlns) {
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
416 if(!node->parent || !node->parent->xmlns || strcmp(node->xmlns, node->parent->xmlns))
15184
869df04993d3 [gaim-migrate @ 17908]
Nathan Walp <nwalp@pidgin.im>
parents: 14690
diff changeset
417 {
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
418 char *xmlns = g_markup_escape_text(node->xmlns, -1);
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
419 g_string_append_printf(text, " xmlns='%s'", xmlns);
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
420 g_free(xmlns);
15184
869df04993d3 [gaim-migrate @ 17908]
Nathan Walp <nwalp@pidgin.im>
parents: 14690
diff changeset
421 }
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
422 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
423 for(c = node->child; c; c = c->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
424 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
425 if(c->type == XMLNODE_TYPE_ATTRIB) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
426 esc = g_markup_escape_text(c->name, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
427 esc2 = g_markup_escape_text(c->data, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
428 g_string_append_printf(text, " %s='%s'", esc, esc2);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
429 g_free(esc);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
430 g_free(esc2);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
431 } else if(c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) {
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
432 if(c->type == XMLNODE_TYPE_DATA)
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
433 pretty = FALSE;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
434 need_end = TRUE;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
435 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
436 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
437
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
438 if(need_end) {
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
439 g_string_append_printf(text, ">%s", pretty ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
440
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
441 for(c = node->child; c; c = c->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
442 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
443 if(c->type == XMLNODE_TYPE_TAG) {
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
444 int esc_len;
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
445 esc = xmlnode_to_str_helper(c, &esc_len, pretty, depth+1);
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
446 text = g_string_append_len(text, esc, esc_len);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
447 g_free(esc);
12198
5a756a6c5c35 [gaim-migrate @ 14500]
Nathan Walp <nwalp@pidgin.im>
parents: 12041
diff changeset
448 } else if(c->type == XMLNODE_TYPE_DATA && c->data_sz > 0) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
449 esc = g_markup_escape_text(c->data, c->data_sz);
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
450 text = g_string_append(text, esc);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
451 g_free(esc);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
452 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
453 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
454
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
455 if(tab && pretty)
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
456 text = g_string_append(text, tab);
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
457 g_string_append_printf(text, "</%s>%s", node_name, formatting ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
458 } else {
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
459 g_string_append_printf(text, "/>%s", formatting ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
460 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
461
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
462 g_free(node_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
463
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
464 g_free(tab);
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
465
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
466 if(len)
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
467 *len = text->len;
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
468
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
469 return g_string_free(text, FALSE);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
470 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
471
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
472 char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
473 xmlnode_to_str(xmlnode *node, int *len)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
474 {
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
475 return xmlnode_to_str_helper(node, len, FALSE, 0);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
476 }
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
477
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
478 char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
479 xmlnode_to_formatted_str(xmlnode *node, int *len)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
480 {
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
481 char *xml, *xml_with_declaration;
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
482
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
483 g_return_val_if_fail(node != NULL, NULL);
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
484
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
485 xml = xmlnode_to_str_helper(node, len, TRUE, 0);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
486 xml_with_declaration =
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
487 g_strdup_printf("<?xml version='1.0' encoding='UTF-8' ?>" NEWLINE_S NEWLINE_S "%s", xml);
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
488 g_free(xml);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
489
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
490 return xml_with_declaration;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
491 }
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
492
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
493 struct _xmlnode_parser_data {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
494 xmlnode *current;
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
495 gboolean error;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
496 };
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
497
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
498 static void
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
499 xmlnode_parser_element_start_libxml(void *user_data,
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
500 const xmlChar *element_name, const xmlChar *prefix, const xmlChar *xmlns,
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
501 int nb_namespaces, const xmlChar **namespaces,
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
502 int nb_attributes, int nb_defaulted, const xmlChar **attributes)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
503 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
504 struct _xmlnode_parser_data *xpd = user_data;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
505 xmlnode *node;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
506 int i;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
507
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
508 if(!element_name || xpd->error) {
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
509 return;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
510 } else {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
511 if(xpd->current)
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
512 node = xmlnode_new_child(xpd->current, (const char*) element_name);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
513 else
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
514 node = xmlnode_new((const char *) element_name);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
515
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
516 xmlnode_set_namespace(node, (const char *) xmlns);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
517
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
518 for(i=0; i < nb_attributes * 5; i+=5) {
14290
f20819ff8d86 [gaim-migrate @ 16910]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 14254
diff changeset
519 char *txt;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
520 int attrib_len = attributes[i+4] - attributes[i+3];
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
521 char *attrib = g_malloc(attrib_len + 1);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
522 memcpy(attrib, attributes[i+3], attrib_len);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
523 attrib[attrib_len] = '\0';
14290
f20819ff8d86 [gaim-migrate @ 16910]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 14254
diff changeset
524 txt = attrib;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15609
diff changeset
525 attrib = purple_unescape_html(txt);
14233
4f5fe687b21d [gaim-migrate @ 16821]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14097
diff changeset
526 g_free(txt);
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
527 xmlnode_set_attrib(node, (const char*) attributes[i], attrib);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
528 g_free(attrib);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
529 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
530
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
531 xpd->current = node;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
532 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
533 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
534
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
535 static void
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
536 xmlnode_parser_element_end_libxml(void *user_data, const xmlChar *element_name,
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
537 const xmlChar *prefix, const xmlChar *xmlns)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
538 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
539 struct _xmlnode_parser_data *xpd = user_data;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
540
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
541 if(!element_name || !xpd->current || xpd->error)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
542 return;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
543
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
544 if(xpd->current->parent) {
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
545 if(!xmlStrcmp((xmlChar*) xpd->current->name, element_name))
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
546 xpd->current = xpd->current->parent;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
547 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
548 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
549
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
550 static void
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
551 xmlnode_parser_element_text_libxml(void *user_data, const xmlChar *text, int text_len)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
552 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
553 struct _xmlnode_parser_data *xpd = user_data;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
554
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
555 if(!xpd->current || xpd->error)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
556 return;
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
557
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
558 if(!text || !text_len)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
559 return;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
560
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
561 xmlnode_insert_data(xpd->current, (const char*) text, text_len);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
562 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
563
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
564 static void
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
565 xmlnode_parser_error_libxml(void *user_data, const char *msg, ...)
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
566 {
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
567 struct _xmlnode_parser_data *xpd = user_data;
19821
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
568 char errmsg[2048];
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
569 va_list args;
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
570
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
571 xpd->error = TRUE;
19821
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
572
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
573 va_start(args, msg);
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
574 vsnprintf(errmsg, sizeof(errmsg), msg, args);
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
575 va_end(args);
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
576
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
577 purple_debug_error("xmlnode", "Error parsing xml file: %s\n", errmsg);
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
578 }
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
579
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
580 static xmlSAXHandler xmlnode_parser_libxml = {
17550
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
581 NULL, /* internalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
582 NULL, /* isStandalone */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
583 NULL, /* hasInternalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
584 NULL, /* hasExternalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
585 NULL, /* resolveEntity */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
586 NULL, /* getEntity */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
587 NULL, /* entityDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
588 NULL, /* notationDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
589 NULL, /* attributeDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
590 NULL, /* elementDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
591 NULL, /* unparsedEntityDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
592 NULL, /* setDocumentLocator */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
593 NULL, /* startDocument */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
594 NULL, /* endDocument */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
595 NULL, /* startElement */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
596 NULL, /* endElement */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
597 NULL, /* reference */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
598 xmlnode_parser_element_text_libxml, /* characters */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
599 NULL, /* ignorableWhitespace */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
600 NULL, /* processingInstruction */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
601 NULL, /* comment */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
602 NULL, /* warning */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
603 xmlnode_parser_error_libxml, /* error */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
604 NULL, /* fatalError */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
605 NULL, /* getParameterEntity */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
606 NULL, /* cdataBlock */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
607 NULL, /* externalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
608 XML_SAX2_MAGIC, /* initialized */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
609 NULL, /* _private */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
610 xmlnode_parser_element_start_libxml, /* startElementNs */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
611 xmlnode_parser_element_end_libxml, /* endElementNs */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
612 NULL, /* serror */
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
613 };
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
614
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
615 xmlnode *
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
616 xmlnode_from_str(const char *str, gssize size)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
617 {
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
618 struct _xmlnode_parser_data *xpd;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
619 xmlnode *ret;
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
620 gsize real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
621
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
622 g_return_val_if_fail(str != NULL, NULL);
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
623
11705
8200a990caf1 [gaim-migrate @ 13996]
Richard Laager <rlaager@pidgin.im>
parents: 11390
diff changeset
624 real_size = size < 0 ? strlen(str) : size;
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
625 xpd = g_new0(struct _xmlnode_parser_data, 1);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
626
14384
34054e95f8d3 [gaim-migrate @ 17017]
Nathan Walp <nwalp@pidgin.im>
parents: 14290
diff changeset
627 if (xmlSAXUserParseMemory(&xmlnode_parser_libxml, xpd, str, real_size) < 0) {
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
628 while(xpd->current && xpd->current->parent)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
629 xpd->current = xpd->current->parent;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
630 if(xpd->current)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
631 xmlnode_free(xpd->current);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
632 xpd->current = NULL;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
633 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
634 ret = xpd->current;
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
635 if (xpd->error) {
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
636 ret = NULL;
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
637 if (xpd->current)
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
638 xmlnode_free(xpd->current);
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
639 }
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
640
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
641 g_free(xpd);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
642 return ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
643 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
644
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
645 xmlnode *
15609
e432251bd57e sf patch #1647731, from Markus Elfring
Mark Doliner <markdoliner@pidgin.im>
parents: 15435
diff changeset
646 xmlnode_copy(const xmlnode *src)
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
647 {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
648 xmlnode *ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
649 xmlnode *child;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
650 xmlnode *sibling = NULL;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
651
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
652 g_return_val_if_fail(src != NULL, NULL);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
653
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
654 ret = new_node(src->name, src->type);
17825
ced38a45f560 Fixed a bug in xmlnode_copy, it didn't preserve the namespace in the copy.
Andreas Monitzer <am@adiumx.com>
parents: 15979
diff changeset
655 ret->xmlns = g_strdup(src->xmlns);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
656 if(src->data) {
8167
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
657 if(src->data_sz) {
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
658 ret->data = g_memdup(src->data, src->data_sz);
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
659 ret->data_sz = src->data_sz;
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
660 } else {
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
661 ret->data = g_strdup(src->data);
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
662 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
663 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
664
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
665 for(child = src->child; child; child = child->next) {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
666 if(sibling) {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
667 sibling->next = xmlnode_copy(child);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
668 sibling = sibling->next;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
669 } else {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
670 ret->child = xmlnode_copy(child);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
671 sibling = ret->child;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
672 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
673 sibling->parent = ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
674 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
675
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
676 ret->lastchild = sibling;
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
677
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
678 return ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
679 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
680
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
681 xmlnode *
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
682 xmlnode_get_next_twin(xmlnode *node)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
683 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
684 xmlnode *sibling;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
685 const char *ns = xmlnode_get_namespace(node);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
686
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
687 g_return_val_if_fail(node != NULL, NULL);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
688 g_return_val_if_fail(node->type == XMLNODE_TYPE_TAG, NULL);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
689
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
690 for(sibling = node->next; sibling; sibling = sibling->next) {
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
691 /* XXX: Is it correct to ignore the namespace for the match if none was specified? */
8283
407f6ed6715d [gaim-migrate @ 9007]
Daniel Atallah <datallah@pidgin.im>
parents: 8262
diff changeset
692 const char *xmlns = NULL;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
693 if(ns)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
694 xmlns = xmlnode_get_namespace(sibling);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
695
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
696 if(sibling->type == XMLNODE_TYPE_TAG && !strcmp(node->name, sibling->name) &&
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
697 (!ns || (xmlns && !strcmp(ns, xmlns))))
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
698 return sibling;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
699 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
700
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
701 return NULL;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
702 }

mercurial