annotate mcabber/libjabber/xstream.c @ 1469:1f7990dd416b

Update UK help files (Myhailo Danylenko)
author Mikael Berthe <mikael@lilotux.net>
date Sun, 13 Apr 2008 08:33:50 +0200
parents 0aa9015f06df
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2 * This program is free software; you can redistribute it and/or modify
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3 * it under the terms of the GNU General Public License as published by
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
4 * the Free Software Foundation; either version 2 of the License, or
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 * (at your option) any later version.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 * This program is distributed in the hope that it will be useful,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 * GNU General Public License for more details.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
12 * You should have received a copy of the GNU General Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13 * along with this program; if not, write to the Free Software
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
16 * Copyrights
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
17 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
18 * Portions created by or assigned to Jabber.com, Inc. are
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
19 * Copyright (c) 1999-2002 Jabber.com, Inc. All Rights Reserved. Contact
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
20 * information for Jabber.com, Inc. is available at http://www.jabber.com/.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
21 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
22 * Portions Copyright (c) 1998-1999 Jeremie Miller.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
23 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
24 * Acknowledgements
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
25 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
26 * Special thanks to the Jabber Open Source Contributors for their
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
27 * suggestions and support of Jabber.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
28 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
29 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
30
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
31 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
32 * @file xstream.c
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
33 * @brief handling of incoming XML stream based events
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
34 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
35 * xstream is a way to have a consistent method of handling incoming XML stream based events ...
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
36 * it doesn't handle the generation of an XML stream, but provides some facilities to help doing that
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 25
diff changeset
39 #include <time.h>
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40 #include <libxode.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
42 /* ========== internal expat callbacks =========== */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
44 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
45 * internal expat callback for read start tags of an element
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
46 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47 void _xstream_startElement(xstream xs, const char* name, const char** atts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 pool p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51 /* if xstream is bad, get outa here */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52 if(xs->status > XSTREAM_NODE) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54 if(xs->node == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56 p = pool_heap(5*1024); /* 5k, typically 1-2k each plus copy of self and workspace */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 xs->node = xmlnode_new_tag_pool(p,name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 xmlnode_put_expat_attribs(xs->node, atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
60 if(xs->status == XSTREAM_ROOT)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62 xs->status = XSTREAM_NODE; /* flag status that we're processing nodes now */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63 (xs->f)(XSTREAM_ROOT, xs->node, xs->arg); /* send the root, f must free all nodes */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 xs->node = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66 }else{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
67 xs->node = xmlnode_insert_tag(xs->node, name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
68 xmlnode_put_expat_attribs(xs->node, atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 /* depth check */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 xs->depth++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 if(xs->depth > XSTREAM_MAXDEPTH)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 xs->status = XSTREAM_ERR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
77 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
78 * internal expat callback for read end tags of an element
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
79 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80 void _xstream_endElement(xstream xs, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82 xmlnode parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84 /* if xstream is bad, get outa here */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85 if(xs->status > XSTREAM_NODE) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 /* if it's already NULL we've received </stream>, tell the app and we're outta here */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 if(xs->node == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 xs->status = XSTREAM_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 (xs->f)(XSTREAM_CLOSE, NULL, xs->arg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 }else{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93 parent = xmlnode_get_parent(xs->node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 /* we are the top-most node, feed to the app who is responsible to delete it */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96 if(parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97 (xs->f)(XSTREAM_NODE, xs->node, xs->arg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99 xs->node = parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 xs->depth--;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
104 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
105 * internal expat callback for read CDATA
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
106 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 void _xstream_charData(xstream xs, const char *str, int len)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 /* if xstream is bad, get outa here */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110 if(xs->status > XSTREAM_NODE) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112 if(xs->node == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
113 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114 /* we must be in the root of the stream where CDATA is irrelevant */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 xmlnode_insert_cdata(xs->node, str, len);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
121 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
122 * internal function to be registered as pool cleaner, frees a stream if the associated memory pool is freed
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
123 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
124 * @param pointer to the xstream to free
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
125 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126 void _xstream_cleanup(void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 xstream xs = (xstream)arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 xmlnode_free(xs->node); /* cleanup anything left over */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131 XML_ParserFree(xs->parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
135 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
136 * creates a new xstream with given pool, xstream will be cleaned up w/ pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
137 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
138 * @param p the memory pool to use for the stream
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
139 * @param f function pointer to the event handler function
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
140 * @param arg parameter to pass to the event handler function
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
141 * @return the created xstream
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
142 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143 xstream xstream_new(pool p, xstream_onNode f, void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 xstream newx;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
146
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 if(p == NULL || f == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149 fprintf(stderr,"Fatal Programming Error: xstream_new() was improperly called with NULL.\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153 newx = pmalloco(p, sizeof(_xstream));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
154 newx->p = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
155 newx->f = f;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 newx->arg = arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 /* create expat parser and ensure cleanup */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 newx->parser = XML_ParserCreate(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 XML_SetUserData(newx->parser, (void *)newx);
883
0aa9015f06df Remove some more libjabber warnings
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
161 XML_SetElementHandler(newx->parser,
0aa9015f06df Remove some more libjabber warnings
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
162 (XML_StartElementHandler)_xstream_startElement,
0aa9015f06df Remove some more libjabber warnings
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
163 (XML_EndElementHandler)_xstream_endElement);
0aa9015f06df Remove some more libjabber warnings
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
164 XML_SetCharacterDataHandler(newx->parser,
0aa9015f06df Remove some more libjabber warnings
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
165 (XML_CharacterDataHandler)_xstream_charData);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 pool_cleanup(p, _xstream_cleanup, (void *)newx);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 return newx;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
171 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
172 * attempts to parse the buff onto this stream firing events to the handler
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
173 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
174 * @param xs the xstream to parse the data on
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
175 * @param buff the new data
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
176 * @param len length of the data
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
177 * @return last known xstream status
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
178 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179 int xstream_eat(xstream xs, char *buff, int len)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181 char *err;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182 xmlnode xerr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 static char maxerr[] = "maximum node size reached";
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184 static char deeperr[] = "maximum node depth reached";
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186 if(xs == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 fprintf(stderr,"Fatal Programming Error: xstream_eat() was improperly called with NULL.\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 return XSTREAM_ERR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 if(len == 0 || buff == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193 return xs->status;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 if(len == -1) /* easy for hand-fed eat calls */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196 len = strlen(buff);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198 if(!XML_Parse(xs->parser, buff, len, 0))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 err = (char *)XML_ErrorString(XML_GetErrorCode(xs->parser));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 xs->status = XSTREAM_ERR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202 }else if(pool_size(xmlnode_pool(xs->node)) > XSTREAM_MAXNODE || xs->cdata_len > XSTREAM_MAXNODE){
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
203 err = maxerr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
204 xs->status = XSTREAM_ERR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205 }else if(xs->status == XSTREAM_ERR){ /* set within expat handlers */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206 err = deeperr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209 /* fire parsing error event, make a node containing the error string */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 if(xs->status == XSTREAM_ERR)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 xerr = xmlnode_new_tag("error");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 xmlnode_insert_cdata(xerr,err,-1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 (xs->f)(XSTREAM_ERR, xerr, xs->arg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 return xs->status;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 /* STREAM CREATION UTILITIES */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
223 /** give a standard template xmlnode to work from
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
224 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
225 * @param namespace ("jabber:client", "jabber:server", ...)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
226 * @param to where the stream is sent to
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
227 * @param from where we are (source of the stream)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
228 * @return the xmlnode that has been generated as the template
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
229 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 xmlnode xstream_header(char *namespace, char *to, char *from)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 xmlnode x;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
233 char id[11];
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 sprintf(id,"%X",(int)time(NULL));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 x = xmlnode_new_tag("stream:stream");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 xmlnode_put_attrib(x, "xmlns:stream", "http://etherx.jabber.org/streams");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 xmlnode_put_attrib(x, "id", id);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 if(namespace != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241 xmlnode_put_attrib(x, "xmlns", namespace);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 if(to != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243 xmlnode_put_attrib(x, "to", to);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 if(from != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 xmlnode_put_attrib(x, "from", from);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 return x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
250 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
251 * trim the xmlnode to only the opening header :)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
252 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
253 * @note NO CHILDREN ALLOWED
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
254 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
255 * @param x the xmlnode
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
256 * @return string representation of the start tag
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
257 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258 char *xstream_header_char(xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260 spool s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 char *fixr, *head;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
263 if(xmlnode_has_children(x)) {
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264 fprintf(stderr,"Fatal Programming Error: xstream_header_char() was sent a header with children!\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 s = spool_new(xmlnode_pool(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 spooler(s,"<?xml version='1.0'?>",xmlnode2str(x),s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 head = spool_print(s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 fixr = strstr(head,"/>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 *fixr = '>';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 ++fixr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 *fixr = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276 return head;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278