libpurple/xmlnode.c

Sat, 28 Jun 2008 06:55:30 +0000

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Sat, 28 Jun 2008 06:55:30 +0000
branch
cpw.qulogic.msn
changeset 23821
283d616f7f29
parent 22083
d562c88d8327
child 23962
3ce62da60970
child 24639
609d4605c8db
child 26095
0eea4b8fd48c
permissions
-rw-r--r--

Make sure xmlnode_copy also copies the prefix and namespace_map from
the source xmlnode.

This should fix operations on MSN member role lists. That means
blocking and unblocking should work now. And removing new buddies from
the pending list too, so you shouldn't get asked to add them every time
you log in.

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 {
20228
ce019944d765 applied changes from 9d35dde0c779cca73548172223ba557f27d61882
Luke Schierer <lschiere@pidgin.im>
parents: 20224
diff changeset
134 if(sibling == NULL) {
7131
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 {
20228
ce019944d765 applied changes from 9d35dde0c779cca73548172223ba557f27d61882
Luke Schierer <lschiere@pidgin.im>
parents: 20224
diff changeset
177 if(sibling == NULL) {
15265
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 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
221
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
222 attrib_node->data = g_strdup(value);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
223 attrib_node->xmlns = g_strdup(xmlns);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
224
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
225 xmlnode_insert_child(node, attrib_node);
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
226 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
227
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
228 void
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
229 xmlnode_set_attrib_with_prefix(xmlnode *node, const char *attr, const char *prefix, const char *value)
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
230 {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
231 xmlnode *attrib_node;
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
232
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
233 g_return_if_fail(node != NULL);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
234 g_return_if_fail(attr != NULL);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
235 g_return_if_fail(value != NULL);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
236
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
237 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
238
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
239 attrib_node->data = g_strdup(value);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
240 attrib_node->prefix = g_strdup(prefix);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
241
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
242 xmlnode_insert_child(node, attrib_node);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
243 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
244
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
245
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
246 const char *
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
247 xmlnode_get_attrib(xmlnode *node, const char *attr)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
248 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
249 xmlnode *x;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
250
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
251 g_return_val_if_fail(node != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
252
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
253 for(x = node->child; x; x = x->next) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
254 if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
255 return x->data;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
256 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
257 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
258
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
259 return NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
260 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
261
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
262 const char *
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
263 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
264 {
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
265 xmlnode *x;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
266
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
267 g_return_val_if_fail(node != NULL, NULL);
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
268
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
269 for(x = node->child; x; x = x->next) {
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
270 if(x->type == XMLNODE_TYPE_ATTRIB &&
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
271 !strcmp(attr, x->name) &&
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
272 _xmlnode_compare_xmlns(xmlns, x->xmlns)) {
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
273 return x->data;
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
274 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
275 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
276
15277
7f9e97dffc4f [gaim-migrate @ 18005]
Mark Doliner <markdoliner@pidgin.im>
parents: 15265
diff changeset
277 return NULL;
15265
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
278 }
a5b0ab58b05d [gaim-migrate @ 17993]
Sean Egan <seanegan@pidgin.im>
parents: 15238
diff changeset
279
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
280
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
281 void xmlnode_set_namespace(xmlnode *node, const char *xmlns)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
282 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
283 g_return_if_fail(node != NULL);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
284
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
285 g_free(node->xmlns);
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
286 node->xmlns = g_strdup(xmlns);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
287 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
288
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
289 const char *xmlnode_get_namespace(xmlnode *node)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
290 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
291 g_return_val_if_fail(node != NULL, NULL);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
292
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
293 return node->xmlns;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
294 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
295
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
296 void xmlnode_set_prefix(xmlnode *node, const char *prefix)
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
297 {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
298 g_return_if_fail(node != NULL);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
299
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
300 g_free(node->prefix);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
301 node->prefix = g_strdup(prefix);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
302 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
303
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
304 const char *xmlnode_get_prefix(xmlnode *node)
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
305 {
21720
235394d5c7f4 Pull a bunch of bugfix only changes to im.pidgin.pidgin.2.3.1,
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 21487
diff changeset
306 g_return_val_if_fail(node != NULL, NULL);
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
307 return node->prefix;
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
308 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
309
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
310 void
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
311 xmlnode_free(xmlnode *node)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
312 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
313 xmlnode *x, *y;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
314
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
315 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
316
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
317 /* 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
318 if(NULL != node->parent) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
319 if(node->parent->child == node) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
320 node->parent->child = node->next;
19568
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
321 if (node->parent->lastchild == node)
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
322 node->parent->lastchild = node->next;
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
323 } else {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
324 xmlnode *prev = node->parent->child;
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
325 while(prev && prev->next != node) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
326 prev = prev->next;
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
327 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
328 if(prev) {
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
329 prev->next = node->next;
19568
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
330 if (node->parent->lastchild == node)
1daa0179da7b xmlnode bugfix patch from Mauro Brasil
Sean Egan <seanegan@pidgin.im>
parents: 18315
diff changeset
331 node->parent->lastchild = prev;
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
332 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
333 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
334 }
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
335
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
336 /* now free our children */
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
337 x = node->child;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
338 while(x) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
339 y = x->next;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
340 xmlnode_free(x);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
341 x = y;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
342 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
343
18315
10dbbd7540b8 fix a buddy icon bug in jabber
Nathan Walp <nwalp@pidgin.im>
parents: 18131
diff changeset
344 /* now dispose of ourselves */
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
345 g_free(node->name);
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
346 g_free(node->data);
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
347 g_free(node->xmlns);
22061
32b0036ef621 fix a leak
Ka-Hing Cheung <khc@pidgin.im>
parents: 21720
diff changeset
348 g_free(node->prefix);
14386
5563ea640401 [gaim-migrate @ 17019]
Nathan Walp <nwalp@pidgin.im>
parents: 14384
diff changeset
349
21720
235394d5c7f4 Pull a bunch of bugfix only changes to im.pidgin.pidgin.2.3.1,
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 21487
diff changeset
350 if(node->namespace_map)
235394d5c7f4 Pull a bunch of bugfix only changes to im.pidgin.pidgin.2.3.1,
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 21487
diff changeset
351 g_hash_table_destroy(node->namespace_map);
235394d5c7f4 Pull a bunch of bugfix only changes to im.pidgin.pidgin.2.3.1,
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 21487
diff changeset
352
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15609
diff changeset
353 PURPLE_DBUS_UNREGISTER_POINTER(node);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
354 g_free(node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
355 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
356
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
357 xmlnode*
10736
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
358 xmlnode_get_child(const xmlnode *parent, const char *name)
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
359 {
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
360 return xmlnode_get_child_with_namespace(parent, name, NULL);
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
361 }
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
362
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
363 xmlnode *
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
364 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
365 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
366 xmlnode *x, *ret = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
367 char **names;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
368 char *parent_name, *child_name;
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 g_return_val_if_fail(parent != NULL, NULL);
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
371 g_return_val_if_fail(name != NULL, NULL);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
372
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
373 names = g_strsplit(name, "/", 2);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
374 parent_name = names[0];
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
375 child_name = names[1];
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 for(x = parent->child; x; x = x->next) {
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
378 /* 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
379 const char *xmlns = NULL;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
380 if(ns)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
381 xmlns = xmlnode_get_namespace(x);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
382
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
383 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
384 && (!ns || (xmlns && !strcmp(ns, xmlns)))) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
385 ret = x;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
386 break;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
387 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
388 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
389
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
390 if(child_name && ret)
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
391 ret = xmlnode_get_child(ret, child_name);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
392
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
393 g_strfreev(names);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
394 return ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
395 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
396
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
397 char *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
398 xmlnode_get_data(xmlnode *node)
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 *str = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
401 xmlnode *c;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
402
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
403 g_return_val_if_fail(node != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
404
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
405 for(c = node->child; c; c = c->next) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
406 if(c->type == XMLNODE_TYPE_DATA) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
407 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
408 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
409 else
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
410 str = g_string_append_len(str, c->data, c->data_sz);
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 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
413
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
414 if (str == NULL)
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
415 return NULL;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
416
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
417 return g_string_free(str, FALSE);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
418 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
419
18131
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
420 char *
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
421 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
422 {
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
423 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
424
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
425 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
426
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
427 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
428
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
429 return unescaped;
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
430 }
7127441da3ba add xmlnode_get_data_unescaped(), and got rid of an unecessary realloc
Nathan Walp <nwalp@pidgin.im>
parents: 17550
diff changeset
431
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
432 static void
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
433 xmlnode_to_str_foreach_append_ns(const char *key, const char *value,
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
434 GString *buf)
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
435 {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
436 if (*key) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
437 g_string_append_printf(buf, " xmlns:%s='%s'", key, value);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
438 } else {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
439 g_string_append_printf(buf, " xmlns='%s'", value);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
440 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
441 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
442
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
443 static char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
444 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
445 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
446 GString *text = g_string_new("");
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
447 const char *prefix;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
448 xmlnode *c;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
449 char *node_name, *esc, *esc2, *tab = NULL;
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
450 gboolean need_end = FALSE, pretty = formatting;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
451
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
452 g_return_val_if_fail(node != NULL, NULL);
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
453
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
454 if(pretty && depth) {
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
455 tab = g_strnfill(depth, '\t');
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
456 text = g_string_append(text, tab);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
457 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
458
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
459 node_name = g_markup_escape_text(node->name, -1);
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
460 prefix = xmlnode_get_prefix(node);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
461
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
462 if (prefix) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
463 g_string_append_printf(text, "<%s:%s", prefix, node_name);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
464 } else {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
465 g_string_append_printf(text, "<%s", node_name);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
466 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
467
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
468 if (node->namespace_map) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
469 g_hash_table_foreach(node->namespace_map,
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
470 (GHFunc)xmlnode_to_str_foreach_append_ns, text);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
471 } else if (node->xmlns) {
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
472 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
473 {
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
474 char *xmlns = g_markup_escape_text(node->xmlns, -1);
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
475 g_string_append_printf(text, " xmlns='%s'", xmlns);
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
476 g_free(xmlns);
15184
869df04993d3 [gaim-migrate @ 17908]
Nathan Walp <nwalp@pidgin.im>
parents: 14690
diff changeset
477 }
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
478 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
479 for(c = node->child; c; c = c->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
480 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
481 if(c->type == XMLNODE_TYPE_ATTRIB) {
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
482 const char *aprefix = xmlnode_get_prefix(c);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
483 esc = g_markup_escape_text(c->name, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
484 esc2 = g_markup_escape_text(c->data, -1);
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
485 if (aprefix) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
486 g_string_append_printf(text, " %s:%s='%s'", aprefix, esc, esc2);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
487 } else {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
488 g_string_append_printf(text, " %s='%s'", esc, esc2);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
489 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
490 g_free(esc);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
491 g_free(esc2);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
492 } 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
493 if(c->type == XMLNODE_TYPE_DATA)
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
494 pretty = FALSE;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
495 need_end = TRUE;
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 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
498
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
499 if(need_end) {
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
500 g_string_append_printf(text, ">%s", pretty ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
501
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
502 for(c = node->child; c; c = c->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
503 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
504 if(c->type == XMLNODE_TYPE_TAG) {
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
505 int esc_len;
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
506 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
507 text = g_string_append_len(text, esc, esc_len);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
508 g_free(esc);
12198
5a756a6c5c35 [gaim-migrate @ 14500]
Nathan Walp <nwalp@pidgin.im>
parents: 12041
diff changeset
509 } else if(c->type == XMLNODE_TYPE_DATA && c->data_sz > 0) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
510 esc = g_markup_escape_text(c->data, c->data_sz);
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
511 text = g_string_append(text, esc);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
512 g_free(esc);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
513 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
514 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
515
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
516 if(tab && pretty)
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
517 text = g_string_append(text, tab);
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
518 if (prefix) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
519 g_string_append_printf(text, "</%s:%s>%s", prefix, node_name, formatting ? NEWLINE_S : "");
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
520 } else {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
521 g_string_append_printf(text, "</%s>%s", node_name, formatting ? NEWLINE_S : "");
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
522 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
523 } else {
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
524 g_string_append_printf(text, "/>%s", formatting ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
525 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
526
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
527 g_free(node_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
528
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
529 g_free(tab);
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
530
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
531 if(len)
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
532 *len = text->len;
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
533
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
534 return g_string_free(text, FALSE);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
535 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
536
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
537 char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
538 xmlnode_to_str(xmlnode *node, int *len)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
539 {
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
540 return xmlnode_to_str_helper(node, len, FALSE, 0);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
541 }
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
542
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
543 char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
544 xmlnode_to_formatted_str(xmlnode *node, int *len)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
545 {
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
546 char *xml, *xml_with_declaration;
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
547
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
548 g_return_val_if_fail(node != NULL, NULL);
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
549
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
550 xml = xmlnode_to_str_helper(node, len, TRUE, 0);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
551 xml_with_declaration =
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
552 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
553 g_free(xml);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
554
22083
d562c88d8327 Patch from QuLogic to correctly set the length. Closes #4515.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 22061
diff changeset
555 if (len)
d562c88d8327 Patch from QuLogic to correctly set the length. Closes #4515.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 22061
diff changeset
556 *len += sizeof("<?xml version='1.0' encoding='UTF-8' ?>" NEWLINE_S NEWLINE_S) - 1;
d562c88d8327 Patch from QuLogic to correctly set the length. Closes #4515.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 22061
diff changeset
557
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
558 return xml_with_declaration;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
559 }
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
560
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
561 struct _xmlnode_parser_data {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
562 xmlnode *current;
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
563 gboolean error;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
564 };
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
565
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
566 static void
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
567 xmlnode_parser_element_start_libxml(void *user_data,
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
568 const xmlChar *element_name, const xmlChar *prefix, const xmlChar *xmlns,
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
569 int nb_namespaces, const xmlChar **namespaces,
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
570 int nb_attributes, int nb_defaulted, const xmlChar **attributes)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
571 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
572 struct _xmlnode_parser_data *xpd = user_data;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
573 xmlnode *node;
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
574 int i, j;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
575
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
576 if(!element_name || xpd->error) {
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
577 return;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
578 } else {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
579 if(xpd->current)
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
580 node = xmlnode_new_child(xpd->current, (const char*) element_name);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
581 else
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
582 node = xmlnode_new((const char *) element_name);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
583
15238
e52522b871ee [gaim-migrate @ 17963]
Mark Doliner <markdoliner@pidgin.im>
parents: 15184
diff changeset
584 xmlnode_set_namespace(node, (const char *) xmlns);
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
585 xmlnode_set_prefix(node, (const char *)prefix);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
586
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
587 if (nb_namespaces != 0) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
588 node->namespace_map = g_hash_table_new_full(
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
589 g_str_hash, g_str_equal, g_free, g_free);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
590
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
591 for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
592 const char *key = (const char *)namespaces[j];
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
593 const char *val = (const char *)namespaces[j + 1];
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
594 g_hash_table_insert(node->namespace_map,
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
595 g_strdup(key ? key : ""), g_strdup(val ? val : ""));
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
596 }
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
597 }
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
598
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
599 for(i=0; i < nb_attributes * 5; i+=5) {
21487
f355ec220186 Explicitly cast from xmlChar (== unsigned char) to char, squishing a warning.
Will Thompson <resiak@pidgin.im>
parents: 21454
diff changeset
600 const char *prefix = (const char *)attributes[i + 1];
14290
f20819ff8d86 [gaim-migrate @ 16910]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 14254
diff changeset
601 char *txt;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
602 int attrib_len = attributes[i+4] - attributes[i+3];
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
603 char *attrib = g_malloc(attrib_len + 1);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
604 memcpy(attrib, attributes[i+3], attrib_len);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
605 attrib[attrib_len] = '\0';
14290
f20819ff8d86 [gaim-migrate @ 16910]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 14254
diff changeset
606 txt = attrib;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15609
diff changeset
607 attrib = purple_unescape_html(txt);
14233
4f5fe687b21d [gaim-migrate @ 16821]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14097
diff changeset
608 g_free(txt);
21454
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
609 if (prefix && *prefix) {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
610 xmlnode_set_attrib_with_prefix(node, (const char*) attributes[i], prefix, attrib);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
611 } else {
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
612 xmlnode_set_attrib(node, (const char*) attributes[i], attrib);
2ca06ee152ac make our xmlnode preserve prefixes
Ka-Hing Cheung <khc@pidgin.im>
parents: 20228
diff changeset
613 }
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
614 g_free(attrib);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
615 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
616
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
617 xpd->current = node;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
618 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
619 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
620
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
621 static void
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13833
diff changeset
622 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
623 const xmlChar *prefix, const xmlChar *xmlns)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
624 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
625 struct _xmlnode_parser_data *xpd = user_data;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
626
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
627 if(!element_name || !xpd->current || xpd->error)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
628 return;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
629
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
630 if(xpd->current->parent) {
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
631 if(!xmlStrcmp((xmlChar*) xpd->current->name, element_name))
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
632 xpd->current = xpd->current->parent;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
633 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
634 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
635
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
636 static void
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
637 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
638 {
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
639 struct _xmlnode_parser_data *xpd = user_data;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
640
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
641 if(!xpd->current || xpd->error)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
642 return;
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
643
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
644 if(!text || !text_len)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
645 return;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
646
14690
9287ecc4adb1 [gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents: 14498
diff changeset
647 xmlnode_insert_data(xpd->current, (const char*) text, text_len);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
648 }
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
649
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
650 static void
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
651 xmlnode_parser_error_libxml(void *user_data, const char *msg, ...)
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
652 {
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
653 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
654 char errmsg[2048];
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
655 va_list args;
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
656
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
657 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
658
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
659 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
660 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
661 va_end(args);
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
662
c044ef20e299 Print an error when there was a problem parsing some XML
Mark Doliner <markdoliner@pidgin.im>
parents: 19568
diff changeset
663 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
664 }
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
665
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
666 static xmlSAXHandler xmlnode_parser_libxml = {
17550
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
667 NULL, /* internalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
668 NULL, /* isStandalone */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
669 NULL, /* hasInternalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
670 NULL, /* hasExternalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
671 NULL, /* resolveEntity */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
672 NULL, /* getEntity */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
673 NULL, /* entityDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
674 NULL, /* notationDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
675 NULL, /* attributeDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
676 NULL, /* elementDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
677 NULL, /* unparsedEntityDecl */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
678 NULL, /* setDocumentLocator */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
679 NULL, /* startDocument */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
680 NULL, /* endDocument */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
681 NULL, /* startElement */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
682 NULL, /* endElement */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
683 NULL, /* reference */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
684 xmlnode_parser_element_text_libxml, /* characters */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
685 NULL, /* ignorableWhitespace */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
686 NULL, /* processingInstruction */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
687 NULL, /* comment */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
688 NULL, /* warning */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
689 xmlnode_parser_error_libxml, /* error */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
690 NULL, /* fatalError */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
691 NULL, /* getParameterEntity */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
692 NULL, /* cdataBlock */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
693 NULL, /* externalSubset */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
694 XML_SAX2_MAGIC, /* initialized */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
695 NULL, /* _private */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
696 xmlnode_parser_element_start_libxml, /* startElementNs */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
697 xmlnode_parser_element_end_libxml, /* endElementNs */
d67724d3a606 Kill a C99 struct initialization.
Richard Laager <rlaager@pidgin.im>
parents: 15979
diff changeset
698 NULL, /* serror */
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
699 };
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
700
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
701 xmlnode *
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
702 xmlnode_from_str(const char *str, gssize size)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
703 {
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
704 struct _xmlnode_parser_data *xpd;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
705 xmlnode *ret;
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
706 gsize real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
707
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
708 g_return_val_if_fail(str != NULL, NULL);
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
709
11705
8200a990caf1 [gaim-migrate @ 13996]
Richard Laager <rlaager@pidgin.im>
parents: 11390
diff changeset
710 real_size = size < 0 ? strlen(str) : size;
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
711 xpd = g_new0(struct _xmlnode_parser_data, 1);
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
712
14384
34054e95f8d3 [gaim-migrate @ 17017]
Nathan Walp <nwalp@pidgin.im>
parents: 14290
diff changeset
713 if (xmlSAXUserParseMemory(&xmlnode_parser_libxml, xpd, str, real_size) < 0) {
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
714 while(xpd->current && xpd->current->parent)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
715 xpd->current = xpd->current->parent;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
716 if(xpd->current)
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
717 xmlnode_free(xpd->current);
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
718 xpd->current = NULL;
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
719 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
720 ret = xpd->current;
15412
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
721 if (xpd->error) {
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
722 ret = NULL;
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
723 if (xpd->current)
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
724 xmlnode_free(xpd->current);
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
725 }
def58941bcb9 [gaim-migrate @ 18143]
Sean Egan <seanegan@pidgin.im>
parents: 15277
diff changeset
726
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
727 g_free(xpd);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
728 return ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
729 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
730
23821
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
731 static void
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
732 xmlnode_copy_foreach_ns(gpointer key, gpointer value, gpointer user_data)
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
733 {
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
734 GHashTable *ret = (GHashTable *)user_data;
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
735 g_hash_table_insert(ret, g_strdup(key), g_strdup(value));
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
736 }
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
737
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
738 xmlnode *
15609
e432251bd57e sf patch #1647731, from Markus Elfring
Mark Doliner <markdoliner@pidgin.im>
parents: 15435
diff changeset
739 xmlnode_copy(const xmlnode *src)
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
740 {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
741 xmlnode *ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
742 xmlnode *child;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
743 xmlnode *sibling = NULL;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
744
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
745 g_return_val_if_fail(src != NULL, NULL);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
746
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
747 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
748 ret->xmlns = g_strdup(src->xmlns);
23821
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
749 if (src->data) {
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
750 if (src->data_sz) {
8167
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
751 ret->data = g_memdup(src->data, src->data_sz);
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
752 ret->data_sz = src->data_sz;
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
753 } else {
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
754 ret->data = g_strdup(src->data);
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
755 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
756 }
23821
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
757 ret->prefix = g_strdup(src->prefix);
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
758 if (src->namespace_map) {
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
759 ret->namespace_map = g_hash_table_new_full(g_str_hash, g_str_equal,
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
760 g_free, g_free);
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
761 g_hash_table_foreach(src->namespace_map, xmlnode_copy_foreach_ns, ret->namespace_map);
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
762 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
763
23821
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
764 for (child = src->child; child; child = child->next) {
283d616f7f29 Make sure xmlnode_copy also copies the prefix and namespace_map from
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22083
diff changeset
765 if (sibling) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
766 sibling->next = xmlnode_copy(child);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
767 sibling = sibling->next;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
768 } else {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
769 ret->child = xmlnode_copy(child);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
770 sibling = ret->child;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
771 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
772 sibling->parent = ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
773 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
774
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
775 ret->lastchild = sibling;
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
776
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
777 return ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
778 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
779
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
780 xmlnode *
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
781 xmlnode_get_next_twin(xmlnode *node)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
782 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
783 xmlnode *sibling;
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
784 const char *ns = xmlnode_get_namespace(node);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
785
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
786 g_return_val_if_fail(node != NULL, NULL);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
787 g_return_val_if_fail(node->type == XMLNODE_TYPE_TAG, NULL);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
788
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
789 for(sibling = node->next; sibling; sibling = sibling->next) {
20224
d4b827c606db applied changes from 4d50bf3b08569aa2108a9f5da47fb1548d0c7dd9
Luke Schierer <lschiere@pidgin.im>
parents: 20147
diff changeset
790 /* 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
791 const char *xmlns = NULL;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
792 if(ns)
13808
411ee56da344 [gaim-migrate @ 16229]
Sean Egan <seanegan@pidgin.im>
parents: 12233
diff changeset
793 xmlns = xmlnode_get_namespace(sibling);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
794
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
795 if(sibling->type == XMLNODE_TYPE_TAG && !strcmp(node->name, sibling->name) &&
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
796 (!ns || (xmlns && !strcmp(ns, xmlns))))
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
797 return sibling;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
798 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
799
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
800 return NULL;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
801 }

mercurial