src/xmlnode.c

Fri, 23 Dec 2005 06:48:27 +0000

author
Richard Laager <rlaager@pidgin.im>
date
Fri, 23 Dec 2005 06:48:27 +0000
changeset 12640
1fb40d5d76e7
parent 12233
0570720fee6c
child 13808
411ee56da344
permissions
-rw-r--r--

[gaim-migrate @ 14976]
Yahoo profiles use links of this form:
<a href="http://gaim.sf.net">gaim.sf.net</a>

The Yahoo prpl strips HTML, manipulates the text, then passes it to the core, which passes to the UI, which calls another UI function which calls ...linkify. This leads to these URLs looking quite odd.

The fix is to have the HTML stripping function deal properly with URLs of the above format. With HTTP being the most common type of URL these days, that's probably a good plan anyway.

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
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
3 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
4 * gaim
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
5 *
8046
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7642
diff changeset
6 * Gaim is the legal property of its developers, whose names are too numerous
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7642
diff changeset
7 * 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
8 * source distribution.
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
9 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
10 * This program is free software; you can redistribute it and/or modify
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
11 * 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
12 * the Free Software Foundation; either version 2 of the License, or
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
13 * (at your option) any later version.
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
14 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
18 * GNU General Public License for more details.
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
19 *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
21 * along with this program; if not, write to the Free Software
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
23 */
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 /* 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
26 * 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
27 * 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
28 * 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
29
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
30 #include "internal.h"
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
31
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
32 #include <string.h>
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
33 #include <glib.h>
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
34
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
35 #include "xmlnode.h"
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
36
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
37 #ifdef _WIN32
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
38 # define NEWLINE_S "\r\n"
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
39 #else
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
40 # define NEWLINE_S "\n"
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
41 #endif
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
42
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
43 static xmlnode*
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
44 new_node(const char *name, XMLNodeType type)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
45 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
46 xmlnode *node = g_new0(xmlnode, 1);
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
47
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
48 if(name)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
49 node->name = g_strdup(name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
50 node->type = type;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
51
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
52 return node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
53 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
54
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
55 xmlnode*
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
56 xmlnode_new(const char *name)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
57 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
58 g_return_val_if_fail(name != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
59
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
60 return new_node(name, XMLNODE_TYPE_TAG);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
61 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
62
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
63 xmlnode *
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
64 xmlnode_new_child(xmlnode *parent, const char *name)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
65 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
66 xmlnode *node;
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 g_return_val_if_fail(parent != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
69 g_return_val_if_fail(name != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
70
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
71 node = new_node(name, XMLNODE_TYPE_TAG);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
72
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
73 xmlnode_insert_child(parent, node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
74
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
75 return node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
76 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
77
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
78 void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
79 xmlnode_insert_child(xmlnode *parent, xmlnode *child)
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 g_return_if_fail(parent != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
82 g_return_if_fail(child != NULL);
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 child->parent = parent;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
85
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
86 if(parent->lastchild) {
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
87 parent->lastchild->next = child;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
88 } else {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
89 parent->child = child;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
90 }
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
91
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
92 parent->lastchild = child;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
93 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
94
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
95 void
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
96 xmlnode_insert_data(xmlnode *node, const char *data, gssize size)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
97 {
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
98 xmlnode *child;
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
99 gsize real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
100
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
101 g_return_if_fail(node != NULL);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
102 g_return_if_fail(data != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
103 g_return_if_fail(size != 0);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
104
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
105 real_size = size == -1 ? strlen(data) : size;
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 child = new_node(NULL, XMLNODE_TYPE_DATA);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
108
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
109 child->data = g_memdup(data, real_size);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
110 child->data_sz = real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
111
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
112 xmlnode_insert_child(node, child);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
113 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
114
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
115 void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
116 xmlnode_remove_attrib(xmlnode *node, const char *attr)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
117 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
118 xmlnode *attr_node, *sibling = NULL;
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 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
121 g_return_if_fail(attr != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
122
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
123 for(attr_node = node->child; attr_node; attr_node = attr_node->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
124 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
125 if(attr_node->type == XMLNODE_TYPE_ATTRIB &&
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
126 !strcmp(attr_node->name, attr)) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
127 if(node->child == attr_node) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
128 node->child = attr_node->next;
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
129 } else if (node->lastchild == attr_node) {
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
130 node->lastchild = sibling;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
131 } else {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
132 sibling->next = attr_node->next;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
133 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
134 xmlnode_free(attr_node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
135 return;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
136 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
137 sibling = attr_node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
138 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
139 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
140
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
141 void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
142 xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
143 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
144 xmlnode *attrib_node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
145
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
146 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
147 g_return_if_fail(attr != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
148 g_return_if_fail(value != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
149
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
150 xmlnode_remove_attrib(node, attr);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
151
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
152 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
153
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
154 attrib_node->data = g_strdup(value);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
155
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
156 xmlnode_insert_child(node, attrib_node);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
157 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
158
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
159 const char *
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
160 xmlnode_get_attrib(xmlnode *node, const char *attr)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
161 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
162 xmlnode *x;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
163
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
164 g_return_val_if_fail(node != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
165
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
166 for(x = node->child; x; x = x->next) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
167 if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
168 return x->data;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
169 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
170 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
171
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
172 return NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
173 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
174
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
175 void
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
176 xmlnode_free(xmlnode *node)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
177 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
178 xmlnode *x, *y;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
179
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
180 g_return_if_fail(node != NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
181
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
182 x = node->child;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
183 while(x) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
184 y = x->next;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
185 xmlnode_free(x);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
186 x = y;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
187 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
188
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
189 if(node->name)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
190 g_free(node->name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
191 if(node->data)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
192 g_free(node->data);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
193 g_free(node);
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
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
196 xmlnode*
10736
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
197 xmlnode_get_child(const xmlnode *parent, const char *name)
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
198 {
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
199 return xmlnode_get_child_with_namespace(parent, name, NULL);
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
200 }
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
201
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
202 xmlnode *
fb529f29c25c [gaim-migrate @ 12338]
Mark Doliner <markdoliner@pidgin.im>
parents: 10425
diff changeset
203 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
204 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
205 xmlnode *x, *ret = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
206 char **names;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
207 char *parent_name, *child_name;
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 g_return_val_if_fail(parent != NULL, NULL);
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
210 g_return_val_if_fail(name != NULL, NULL);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
211
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
212 names = g_strsplit(name, "/", 2);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
213 parent_name = names[0];
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
214 child_name = names[1];
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
215
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
216 for(x = parent->child; x; x = x->next) {
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
217 const char *xmlns = NULL;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
218 if(ns)
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
219 xmlns = xmlnode_get_attrib(x, "xmlns");
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
220
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
221 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
222 && (!ns || (xmlns && !strcmp(ns, xmlns)))) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
223 ret = x;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
224 break;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
225 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
226 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
227
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
228 if(child_name && ret)
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
229 ret = xmlnode_get_child(ret, child_name);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
230
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
231 g_strfreev(names);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
232 return ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
233 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
234
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
235 char *
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
236 xmlnode_get_data(xmlnode *node)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
237 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
238 GString *str = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
239 xmlnode *c;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
240
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
241 g_return_val_if_fail(node != NULL, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
242
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
243 for(c = node->child; c; c = c->next) {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
244 if(c->type == XMLNODE_TYPE_DATA) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
245 if(!str)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
246 str = g_string_new("");
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
247 str = g_string_append_len(str, c->data, c->data_sz);
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 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
250
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
251 if (str == NULL)
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
252 return NULL;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
253
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
254 return g_string_free(str, FALSE);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
255 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
256
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
257 static char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
258 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
259 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
260 GString *text = g_string_new("");
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
261 xmlnode *c;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
262 char *node_name, *esc, *esc2, *tab = NULL;
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
263 gboolean need_end = FALSE, pretty = formatting;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
264
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
265 g_return_val_if_fail(node != NULL, NULL);
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
266
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
267 if(pretty && depth) {
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
268 tab = g_strnfill(depth, '\t');
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
269 text = g_string_append(text, tab);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
270 }
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
271
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
272 node_name = g_markup_escape_text(node->name, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
273 g_string_append_printf(text, "<%s", node_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
274
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
275 for(c = node->child; c; c = c->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
276 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
277 if(c->type == XMLNODE_TYPE_ATTRIB) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
278 esc = g_markup_escape_text(c->name, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
279 esc2 = g_markup_escape_text(c->data, -1);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
280 g_string_append_printf(text, " %s='%s'", esc, esc2);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
281 g_free(esc);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
282 g_free(esc2);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
283 } 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
284 if(c->type == XMLNODE_TYPE_DATA)
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
285 pretty = FALSE;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
286 need_end = TRUE;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
287 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
288 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
289
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
290 if(need_end) {
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
291 g_string_append_printf(text, ">%s", pretty ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
292
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
293 for(c = node->child; c; c = c->next)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
294 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
295 if(c->type == XMLNODE_TYPE_TAG) {
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
296 int esc_len;
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
297 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
298 text = g_string_append_len(text, esc, esc_len);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
299 g_free(esc);
12198
5a756a6c5c35 [gaim-migrate @ 14500]
Nathan Walp <nwalp@pidgin.im>
parents: 12041
diff changeset
300 } else if(c->type == XMLNODE_TYPE_DATA && c->data_sz > 0) {
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
301 esc = g_markup_escape_text(c->data, c->data_sz);
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
302 text = g_string_append(text, esc);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
303 g_free(esc);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
304 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
305 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
306
9838
7320c7b02aac [gaim-migrate @ 10715]
Nathan Walp <nwalp@pidgin.im>
parents: 9837
diff changeset
307 if(tab && pretty)
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
308 text = g_string_append(text, tab);
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
309 g_string_append_printf(text, "</%s>%s", node_name, formatting ? NEWLINE_S : "");
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
310 } else {
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
311 g_string_append_printf(text, "/>%s", formatting ? NEWLINE_S : "");
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
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
314 g_free(node_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
315
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
316 if(tab)
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
317 g_free(tab);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
318
7642
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
319 if(len)
4e1735a499f5 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7131
diff changeset
320 *len = text->len;
10331
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
321
9955b6f7c998 [gaim-migrate @ 11538]
Mark Doliner <markdoliner@pidgin.im>
parents: 9838
diff changeset
322 return g_string_free(text, FALSE);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
323 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
324
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
325 char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
326 xmlnode_to_str(xmlnode *node, int *len)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
327 {
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
328 return xmlnode_to_str_helper(node, len, FALSE, 0);
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
329 }
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
330
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
331 char *
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
332 xmlnode_to_formatted_str(xmlnode *node, int *len)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
333 {
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10424
diff changeset
334 char *xml, *xml_with_declaration;
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
335
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
336 g_return_val_if_fail(node != NULL, NULL);
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
337
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
338 xml = xmlnode_to_str_helper(node, len, TRUE, 0);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
339 xml_with_declaration =
12041
a297893ebdbd [gaim-migrate @ 14334]
Daniel Atallah <datallah@pidgin.im>
parents: 11705
diff changeset
340 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
341 g_free(xml);
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
342
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10331
diff changeset
343 return xml_with_declaration;
9837
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
344 }
789d33edcda8 [gaim-migrate @ 10714]
Nathan Walp <nwalp@pidgin.im>
parents: 8283
diff changeset
345
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
346 struct _xmlnode_parser_data {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
347 xmlnode *current;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
348 };
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
349
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
350 static void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
351 xmlnode_parser_element_start(GMarkupParseContext *context,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
352 const char *element_name, const char **attrib_names,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
353 const char **attrib_values, gpointer user_data, GError **error)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
354 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
355 struct _xmlnode_parser_data *xpd = user_data;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
356 xmlnode *node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
357 int i;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
358
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
359 if(!element_name) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
360 return;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
361 } else {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
362 if(xpd->current)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
363 node = xmlnode_new_child(xpd->current, element_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
364 else
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
365 node = xmlnode_new(element_name);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
366
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
367 for(i=0; attrib_names[i]; i++)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
368 xmlnode_set_attrib(node, attrib_names[i], attrib_values[i]);
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 xpd->current = node;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
371 }
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
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
374 static void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
375 xmlnode_parser_element_end(GMarkupParseContext *context,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
376 const char *element_name, gpointer user_data, GError **error)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
377 {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
378 struct _xmlnode_parser_data *xpd = user_data;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
379
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
380 if(!element_name || !xpd->current)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
381 return;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
382
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
383 if(xpd->current->parent) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
384 if(!strcmp(xpd->current->name, element_name))
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
385 xpd->current = xpd->current->parent;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
386 }
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 static void
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
390 xmlnode_parser_element_text(GMarkupParseContext *context, const char *text,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
391 gsize text_len, gpointer user_data, GError **error)
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 struct _xmlnode_parser_data *xpd = user_data;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
394
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
395 if(!xpd->current)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
396 return;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
397
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
398 if(!text || !text_len)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
399 return;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
400
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
401 xmlnode_insert_data(xpd->current, text, text_len);
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
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
404 static GMarkupParser xmlnode_parser = {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
405 xmlnode_parser_element_start,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
406 xmlnode_parser_element_end,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
407 xmlnode_parser_element_text,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
408 NULL,
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
409 NULL
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
410 };
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
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
413 xmlnode *
10848
43c8f0954e21 [gaim-migrate @ 12520]
Nathan Walp <nwalp@pidgin.im>
parents: 10736
diff changeset
414 xmlnode_from_str(const char *str, gssize size)
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
415 {
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
416 struct _xmlnode_parser_data *xpd;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
417 xmlnode *ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
418 GMarkupParseContext *context;
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
419 gsize real_size;
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
420
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
421 g_return_val_if_fail(str != NULL, NULL);
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
422
11705
8200a990caf1 [gaim-migrate @ 13996]
Richard Laager <rlaager@pidgin.im>
parents: 11390
diff changeset
423 real_size = size < 0 ? strlen(str) : size;
11390
6cc6ea4e45e3 [gaim-migrate @ 13618]
Nathan Walp <nwalp@pidgin.im>
parents: 10848
diff changeset
424 xpd = g_new0(struct _xmlnode_parser_data, 1);
7131
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
425 context = g_markup_parse_context_new(&xmlnode_parser, 0, xpd, NULL);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
426
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
427 if(!g_markup_parse_context_parse(context, str, real_size, NULL)) {
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
428 while(xpd->current && xpd->current->parent)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
429 xpd->current = xpd->current->parent;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
430 if(xpd->current)
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
431 xmlnode_free(xpd->current);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
432 xpd->current = NULL;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
433 }
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
434 g_markup_parse_context_free(context);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
435
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
436 ret = xpd->current;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
437 g_free(xpd);
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
438 return ret;
bde45b2e6bf3 [gaim-migrate @ 7698]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
439 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
440
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
441 xmlnode *
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
442 xmlnode_copy(xmlnode *src)
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
443 {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
444 xmlnode *ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
445 xmlnode *child;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
446 xmlnode *sibling = NULL;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
447
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
448 g_return_val_if_fail(src != NULL, NULL);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
449
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
450 ret = new_node(src->name, src->type);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
451 if(src->data) {
8167
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
452 if(src->data_sz) {
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
453 ret->data = g_memdup(src->data, src->data_sz);
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
454 ret->data_sz = src->data_sz;
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
455 } else {
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
456 ret->data = g_strdup(src->data);
deae0da446a9 [gaim-migrate @ 8880]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
457 }
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
458 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
459
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
460 for(child = src->child; child; child = child->next) {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
461 if(sibling) {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
462 sibling->next = xmlnode_copy(child);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
463 sibling = sibling->next;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
464 } else {
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
465 ret->child = xmlnode_copy(child);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
466 sibling = ret->child;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
467 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
468 sibling->parent = ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
469 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
470
12233
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
471 ret->lastchild = sibling;
0570720fee6c [gaim-migrate @ 14535]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 12198
diff changeset
472
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
473 return ret;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
474 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
475
10423
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
476 xmlnode *
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
477 xmlnode_get_next_twin(xmlnode *node)
4663a8238def [gaim-migrate @ 11675]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
478 {
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
479 xmlnode *sibling;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
480 const char *ns = xmlnode_get_attrib(node, "xmlns");
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
481
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
482 g_return_val_if_fail(node != NULL, NULL);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
483 g_return_val_if_fail(node->type == XMLNODE_TYPE_TAG, NULL);
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
484
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
485 for(sibling = node->next; sibling; sibling = sibling->next) {
8283
407f6ed6715d [gaim-migrate @ 9007]
Daniel Atallah <datallah@pidgin.im>
parents: 8262
diff changeset
486 const char *xmlns = NULL;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
487 if(ns)
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
488 xmlns = xmlnode_get_attrib(sibling, "xmlns");
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
489
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
490 if(sibling->type == XMLNODE_TYPE_TAG && !strcmp(node->name, sibling->name) &&
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8167
diff changeset
491 (!ns || (xmlns && !strcmp(ns, xmlns))))
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
492 return sibling;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
493 }
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
494
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
495 return NULL;
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8046
diff changeset
496 }

mercurial