annotate GEMBASSY-1.0.3/gsoap/dom.c @ 0:8300eb051bea draft

Initial upload
author ktnyt
date Fri, 26 Jun 2015 05:19:29 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2 dom.c[pp]
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4 gSOAP DOM implementation v3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6 gSOAP XML Web services tools
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7 Copyright (C) 2000-2012, Robert van Engelen, Genivia, Inc. All Rights Reserved.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8 This part of the software is released under ONE of the following licenses:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9 GPL, or the gSOAP public license, or Genivia's license for commercial use.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11 gSOAP public license.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13 The contents of this file are subject to the gSOAP Public License Version 1.3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14 (the "License"); you may not use this file except in compliance with the
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15 License. You may obtain a copy of the License at
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16 http://www.cs.fsu.edu/~engelen/soaplicense.html
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
17 Software distributed under the License is distributed on an "AS IS" basis,
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
18 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
19 for the specific language governing rights and limitations under the License.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
20
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
21 The Initial Developer of the Original Code is Robert A. van Engelen.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
22 Copyright (C) 2000-2012 Robert A. van Engelen, Genivia inc. All Rights Reserved.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
23 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
24 GPL license.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
25
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
26 This program is free software; you can redistribute it and/or modify it under
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
27 the terms of the GNU General Public License as published by the Free Software
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
28 Foundation; either version 2 of the License, or (at your option) any later
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
29 version.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
30
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
31 This program is distributed in the hope that it will be useful, but WITHOUT ANY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
32 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
33 PARTICULAR PURPOSE. See the GNU General Public License for more details.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
34
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
35 You should have received a copy of the GNU General Public License along with
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
36 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
37 Place, Suite 330, Boston, MA 02111-1307 USA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
38
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
39 Author contact information:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
40 engelen@genivia.com / engelen@acm.org
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
41
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
42 This program is released under the GPL with the additional exemption that
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
43 compiling, linking, and/or using OpenSSL is allowed.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
44 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
45 A commercial use license is available from Genivia, Inc., contact@genivia.com
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
46 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
47 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
48
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
49 #include "stdsoap2.h"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
50
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
51 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyType(struct soap*, struct soap_dom_element const*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
52 SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, soap_walker, soap_walker);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
53 SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
54 SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyType(struct soap*, const struct soap_dom_element *, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
55 SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap*, const char*, int, const struct soap_dom_element *, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
56 SOAP_FMAC3 struct soap_dom_element * SOAP_FMAC4 soap_get_xsd__anyType(struct soap*, struct soap_dom_element *, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
57 SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap*, const char*, struct soap_dom_element *, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
58
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
59 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyAttribute(struct soap*, struct soap_dom_attribute const*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
60 SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, soap_walker, soap_walker);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
61 SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap*, struct soap_dom_attribute *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
62 SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute *, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
63 SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap*, const char*, int, const struct soap_dom_attribute *, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
64 SOAP_FMAC3 struct soap_dom_attribute * SOAP_FMAC4 soap_get_xsd__anyAttribute(struct soap*, struct soap_dom_attribute *, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
65 SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap*, const char*, struct soap_dom_attribute *, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
66
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
67 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
68 extern "C" {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
69 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
70
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
71 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
72 SOAP_FMAC1 void SOAP_FMAC2 soap_markelement(struct soap*, const void*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
73 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
74
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
75 SOAP_FMAC1 int SOAP_FMAC2 soap_putelement(struct soap*, const void*, const char*, int, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
76 SOAP_FMAC1 void *SOAP_FMAC2 soap_getelement(struct soap*, int*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
77
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
78 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
79 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
80 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
81
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
82 /* format string for generating DOM namespace prefixes (<= 16 chars total) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
83 #define SOAP_DOMID_FORMAT "dom%d"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
84
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
85 /* namespace name (URI) lookup and store routines */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
86 static const char *soap_lookup_ns_prefix(struct soap*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
87 static const char *soap_push_ns_prefix(struct soap*, const char*, const char*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
88
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
89 static int out_element(struct soap *soap, const struct soap_dom_element *node, const char *prefix, const char *name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
90 static int out_attribute(struct soap *soap, const char *prefix, const char *name, const char *data, const wchar_t *wide, int flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
91
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
92 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
93 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
94 * DOM custom (de)serializers
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
95 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
96 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
97
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
98 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
99 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
100 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
101 soap_serialize_xsd__anyType(struct soap *soap, const struct soap_dom_element *node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
102 { if (node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
103 { if (node->type && node->node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
104 soap_markelement(soap, node->node, node->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
105 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
106 { const struct soap_dom_element *elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
107 for (elt = node->elts; elt; elt = elt->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
108 soap_serialize_xsd__anyType(soap, elt);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
109 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
110 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
111 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
112
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
113 SOAP_FMAC3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
114 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
115 SOAP_FMAC4
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
116 soap_traverse_xsd__anyType(struct soap *soap, struct soap_dom_element *node, const char *s, soap_walker p, soap_walker q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
117 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
118 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
119
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
120 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
121
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
122 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
123 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
124 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
125 soap_serialize_xsd__anyAttribute(struct soap *soap, const struct soap_dom_attribute *node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
126 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
127 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
128
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
129 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
130 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
131 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
132 soap_traverse_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node, const char *s, soap_walker p, soap_walker q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
133 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
134 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
135
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
136 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
137
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
138 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
139 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
140 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
141 soap_default_xsd__anyType(struct soap *soap, struct soap_dom_element *node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
142 { node->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
143 node->prnt = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
144 node->elts = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
145 node->atts = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
146 node->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
147 node->name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
148 node->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
149 node->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
150 node->node = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
151 node->type = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
152 node->head = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
153 node->tail = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
154 node->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
155 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
156
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
157 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
158
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
159 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
160 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
161 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
162 soap_default_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
163 { node->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
164 node->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
165 node->name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
166 node->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
167 node->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
168 node->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
169 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
170
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
171 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
172
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
173 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
174 out_element(struct soap *soap, const struct soap_dom_element *node, const char *prefix, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
175 { if (node->head && soap_send(soap, node->head))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
176 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
177 if (node->type && node->node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
178 { if (prefix && *prefix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
179 { char *s = (char*)SOAP_MALLOC(soap, strlen(prefix) + strlen(name) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
180 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
181 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
182 sprintf(s, "%s:%s", prefix, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
183 soap_putelement(soap, node->node, s, 0, node->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
184 SOAP_FREE(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
185 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
186 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
187 return soap_putelement(soap, node->node, name, 0, node->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
188 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
189 else if (prefix && *prefix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
190 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
191 if (strlen(prefix) + strlen(name) < sizeof(soap->msgbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
192 s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
193 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
194 { s = (char*)SOAP_MALLOC(soap, strlen(prefix) + strlen(name) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
195 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
196 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
197 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
198 sprintf(s, "%s:%s", prefix, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
199 soap_element(soap, s, 0, NULL); /* element() */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
200 if (s != soap->msgbuf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
201 SOAP_FREE(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
202 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
203 else if (*name != '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
204 { soap_mode m = soap->mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
205 if ((soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
206 soap->mode &= ~SOAP_XML_INDENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
207 soap_element(soap, name, 0, NULL); /* element() */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
208 soap->mode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
209 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
210 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
212
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
213 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
214
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
215 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
216 out_attribute(struct soap *soap, const char *prefix, const char *name, const char *data, const wchar_t *wide, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
217 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
218 const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
219 int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
220 if (wide)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
221 data = soap_wchar2s(soap, wide);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
222 if (!prefix || !*prefix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
223 { if (wide)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
224 return soap_set_attr(soap, name, data, 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
225 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
226 return soap_set_attr(soap, name, data, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
227 return soap_attribute(soap, name, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
228 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
229 t = strchr(name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
230 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
231 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
232 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
233 t = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
234 if (strlen(prefix) + strlen(t) < sizeof(soap->msgbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
235 s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
236 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
237 { s = (char*)SOAP_MALLOC(soap, strlen(prefix) + strlen(t) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
238 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
239 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
240 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
241 sprintf(s, "%s:%s", prefix, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
242 if (wide)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
243 err = soap_set_attr(soap, s, data, 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
244 else if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
245 err = soap_set_attr(soap, s, data, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
246 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
247 err = soap_attribute(soap, s, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
248 if (s != soap->msgbuf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
249 SOAP_FREE(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
250 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
251 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
252
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
253 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
254
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
255 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
256 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
257 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
258 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
259 { if (node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
260 { const char *prefix; /* namespace prefix, if namespace is present */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
261 size_t colon;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
262 if (!(soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
263 { const struct soap_dom_attribute *att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
264 for (att = node->atts; att; att = att->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
265 { if (att->name && att->data && !strncmp(att->name, "xmlns:", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
266 { if (soap_push_namespace(soap, att->name + 6, att->data) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
267 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
268 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
269 else if (att->name && att->data && !strcmp(att->name, "xmlns"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
270 { if (soap_push_namespace(soap, "", att->data) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
271 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
272 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
273 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
274 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
275 if (node->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
276 tag = node->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
277 else if (!tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
278 tag = "-";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
279 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' output at level %u\n", tag, soap->level));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
280 if ((prefix = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
281 { colon = prefix - tag + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
282 if (colon > sizeof(soap->tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
283 colon = sizeof(soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
284 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
285 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
286 colon = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
287 prefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
288 if (node->nstr && *node->nstr && !(soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
289 { if (colon)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
290 { strncpy(soap->tag, tag, colon - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
291 soap->tag[colon - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
292 if ((prefix = soap_push_ns_prefix(soap, soap->tag, node->nstr, 1)) == NULL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
293 || out_element(soap, node, prefix, tag + colon))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
294 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
295 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
296 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
297 { if ((prefix = soap_lookup_ns_prefix(soap, node->nstr)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
298 { if (out_element(soap, node, prefix, tag + colon))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
299 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
300 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
301 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
302 { if ((prefix = soap_push_ns_prefix(soap, NULL, node->nstr, 1)) == NULL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
303 || out_element(soap, node, prefix, tag + colon))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
304 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
305 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
307 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
308 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
309 { colon = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
310 if (out_element(soap, node, NULL, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
311 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
312 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
313 if (!node->type || !node->node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
314 { struct soap_dom_attribute *att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
315 struct soap_dom_element *elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
316 for (att = node->atts; att; att = att->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
317 { if (att->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
318 { if (att->nstr && !(soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
319 { const char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
320 if ((att->nstr == node->nstr || (node->nstr && !strcmp(att->nstr, node->nstr))) && prefix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
321 { if (out_attribute(soap, prefix, att->name, att->data, att->wide, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
322 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
323 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
324 else if ((p = soap_lookup_ns_prefix(soap, att->nstr)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
325 { if (out_attribute(soap, p, att->name, att->data, att->wide, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
326 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
327 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
328 else if (!strncmp(att->name, "xml", 3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
329 { if (out_attribute(soap, NULL, att->name, att->data, att->wide, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
330 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
331 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
332 else if ((p = soap_push_ns_prefix(soap, NULL, att->nstr, 0)) == NULL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
333 || out_attribute(soap, p, att->name, att->data, att->wide, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
334 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
335 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
336 else if (soap_attribute(soap, att->name, att->wide ? soap_wchar2s(soap, att->wide) : att->data))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
337 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
338 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
339 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
340 if ((soap->mode & SOAP_DOM_ASIS) && !node->data && !node->wide && !node->elts && !node->tail)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
341 { soap_mode m = soap->mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
342 soap->mode &= ~SOAP_XML_INDENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
343 if (*tag != '-' && soap_element_start_end_out(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
344 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
345 soap->mode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
347 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
348 { if (*tag != '-' && soap_element_start_end_out(soap, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
349 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
350 if (*tag != '-' && node->data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
351 { if (soap_string_out(soap, node->data, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
352 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
353 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
354 else if (node->data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
355 { if (soap_send(soap, node->data))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
356 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
357 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
358 else if (node->wide)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
359 { if (soap_wstring_out(soap, node->wide, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
360 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
361 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
362 for (elt = node->elts; elt; elt = elt->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
363 { if (soap_out_xsd__anyType(soap, NULL, 0, elt, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
364 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
365 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
366 if (node->tail && soap_send(soap, node->tail))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
367 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
368 if (!prefix || !*prefix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
369 { soap_mode m = soap->mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
370 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of DOM node '%s'\n", tag + colon));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
371 if ((soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
372 soap->mode &= ~SOAP_XML_INDENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
373 if (soap_element_end_out(soap, tag + colon))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
374 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
375 soap->mode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
376 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
377 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
378 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
379 if (strlen(prefix) + strlen(tag + colon) < sizeof(soap->msgbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
380 s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
381 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
382 { s = (char*)SOAP_MALLOC(soap, strlen(prefix) + strlen(tag + colon) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
383 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
384 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
385 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
386 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of DOM node '%s'\n", tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
387 sprintf(s, "%s:%s", prefix, tag + colon);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
388 soap_pop_namespace(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
389 if (soap_element_end_out(soap, s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
390 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
391 if (s != soap->msgbuf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
392 SOAP_FREE(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
393 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
394 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
395 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
396 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
397 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
398 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
399
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
400 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
401
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
402 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
403 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
404 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
405 soap_out_xsd__anyAttribute(struct soap *soap, const char *tag, int id, const struct soap_dom_attribute *node, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
406 { if (!(soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
407 { const struct soap_dom_attribute *att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
408 for (att = node; att; att = att->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
409 { if (att->name && att->data && !strncmp(att->name, "xmlns:", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
410 { if (soap_push_namespace(soap, att->name + 6, att->data) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
411 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
412 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
413 else if (att->name && att->data && !strcmp(att->name, "xmlns"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
414 { if (soap_push_namespace(soap, "", att->data) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
415 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
416 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
417 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
418 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
419 while (node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
420 { if (node->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
421 { if (node->nstr && !(soap->mode & SOAP_DOM_ASIS) && strncmp(node->name, "xml", 3) && !strchr(node->name, ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
422 { const char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
423 p = soap_lookup_ns_prefix(soap, node->nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
424 if (!p && !(p = soap_push_ns_prefix(soap, NULL, node->nstr, 1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
425 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
426 if (out_attribute(soap, p, node->name, node->data, node->wide, 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
427 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
428 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
429 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
430 out_attribute(soap, NULL, node->name, node->data, node->wide, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
432 node = node->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
433 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
434 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
435 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
436
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
437 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
438
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
439 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
440 struct soap_dom_element *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
441 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
442 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
443 { register struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
444 register struct soap_dom_attribute **att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
445 if (soap_peek_element(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
446 { if (soap->error != SOAP_NO_TAG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
447 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
448 if (!node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
449 { if (!(node = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
450 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
451 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
452 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
453 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
454 soap_default_xsd__anyType(soap, node);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
455 if (!(node->data = soap_string_in(soap, 1, -1, -1)) || !*node->data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
456 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
457 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node with cdata\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
458 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
459 return node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
460 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
461 if (!node)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
462 { if (!(node = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
463 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
464 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
465 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
466 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
467 soap_default_xsd__anyType(soap, node);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
468 node->nstr = soap_current_namespace(soap, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
469 if ((soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
470 node->name = soap_strdup(soap, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
471 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
472 { char *s = strchr(soap->tag, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
473 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
474 node->name = soap_strdup(soap, s+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
475 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
476 node->name = soap_strdup(soap, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
477 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
478 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' start xmlns='%s'\n", node->name, node->nstr?node->nstr:""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
479 if ((soap->mode & SOAP_DOM_NODE) || (!(soap->mode & SOAP_DOM_TREE) && *soap->id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
480 { if ((node->node = soap_getelement(soap, &node->type)) && node->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
481 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node contains type %d from xsi:type\n", node->type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
482 return node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
483 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
484 if (soap->error == SOAP_TAG_MISMATCH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
485 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
486 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
487 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
488 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
489 att = &node->atts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
490 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
491 { if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
492 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s'\n", tp->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
493 *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
494 if (!*att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
495 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
496 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
497 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
498 (*att)->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
499 (*att)->nstr = soap_current_namespace(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
500 if ((soap->mode & SOAP_DOM_ASIS) || !strncmp(tp->name, "xml", 3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
501 (*att)->name = soap_strdup(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
502 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
503 { char *s = strchr(tp->name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
504 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
505 (*att)->name = soap_strdup(soap, s+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
506 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
507 (*att)->name = soap_strdup(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
508 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
509 if (tp->visible == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
510 (*att)->data = soap_strdup(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
511 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
512 (*att)->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
513 (*att)->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
514 (*att)->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
515 att = &(*att)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
516 tp->visible = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
517 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
519 soap_element_begin_in(soap, NULL, 1, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
520 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' pulled\n", node->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
521 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
522 { if (!soap_peek_element(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
523 { struct soap_dom_element **elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
524 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has subelements\n", node->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
525 elt = &node->elts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
526 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
527 { if (!(*elt = soap_in_xsd__anyType(soap, NULL, NULL, NULL)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
528 { if (soap->error != SOAP_NO_TAG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
529 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
530 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
531 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
532 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
533 (*elt)->prnt = node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
534 elt = &(*elt)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
535 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
536 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
537 else if (soap->error == SOAP_NO_TAG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
538 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has cdata\n", node->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
539 if ((soap->mode & SOAP_C_UTFSTRING) || (soap->mode & SOAP_C_MBSTRING))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
540 { if (!(node->data = soap_string_in(soap, 1, -1, -1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
541 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
542 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
543 else if (!(node->wide = soap_wstring_in(soap, 1, -1, -1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
544 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
546 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
547 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
548 if (soap_element_end_in(soap, node->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
549 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
550 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node end '%s'\n", node->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
552 return node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
554
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
555 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
556
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
557 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
558 struct soap_dom_attribute *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
559 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
560 soap_in_xsd__anyAttribute(struct soap *soap, const char *tag, struct soap_dom_attribute *node, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
561 { register struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
562 struct soap_dom_attribute *tmp = node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
563 struct soap_dom_attribute *att = node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
564 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
565 { if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
566 { if (!att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
567 { att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
568 if (tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
569 tmp->next = att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
570 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
571 node = att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
572 tmp = att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
573 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
574 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s'\n", tp->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
575 if (!att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
576 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
577 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
578 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
579 att->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
580 att->nstr = soap_current_namespace(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
581 if ((soap->mode & SOAP_DOM_ASIS) || !strncmp(tp->name, "xml", 3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
582 att->name = soap_strdup(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
583 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
584 { char *s = strchr(tp->name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
585 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
586 att->name = soap_strdup(soap, s+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
587 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
588 att->name = soap_strdup(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
589 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
590 if (tp->visible == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
591 att->data = soap_strdup(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
592 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
593 att->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
594 att->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
595 att->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
596 att = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
597 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
598 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
599 return node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
600 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
601
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
602 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
603 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
604 * DOM traversing
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
605 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
606 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
607
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
608 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
609 struct soap_dom_element *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
610 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
611 soap_dom_next_element(struct soap_dom_element *elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
612 { if (elt->elts)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
613 return elt->elts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
614 if (elt->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
615 return elt->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
616 do elt = elt->prnt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
617 while (elt && !elt->next);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
618 if (elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
619 elt = elt->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
620 return elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
621 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
622
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
623 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
624
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
625 struct soap_dom_attribute *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
626 soap_dom_next_attribute(struct soap_dom_attribute *att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
627 { return att->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
628 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
629
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
630 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
631 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
632 * Namespace prefix lookup/store
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
633 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
634 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
635
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
636 static const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
637 soap_lookup_ns_prefix(struct soap *soap, const char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
638 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
639 for (np = soap->nlist; np; np = np->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
640 { if (np->ns && !strcmp(np->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
641 return np->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
643 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
644 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
645
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
646 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
647
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
648 static const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
649 soap_push_ns_prefix(struct soap *soap, const char *id, const char *ns, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
650 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
651 if (!id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
652 { struct Namespace *n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
653 for (n = soap->local_namespaces; n && n->id; n++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
654 { if (n->ns && !strcmp(n->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
655 { id = n->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
656 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
657 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
658 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
659 if (!id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
660 { sprintf(soap->tag, SOAP_DOMID_FORMAT, soap->idnum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
661 id = soap->tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
662 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
663 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
664 /* fix advance generation of xmlns, when element (level) is not output yet */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
665 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
666 soap->level++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
667 np = soap_push_namespace(soap, id, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
668 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
669 soap->level--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
670 if (!np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
671 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
672 if (!np->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
673 { np->ns = soap->local_namespaces[np->index].out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
674 if (!np->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
675 np->ns = soap->local_namespaces[np->index].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
676 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
677 np->index = 0; /* for C14N utilized mark */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
678 if (*np->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
679 { sprintf(soap->msgbuf, "xmlns:%s", np->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
680 out_attribute(soap, NULL, soap->msgbuf, ns, NULL, flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
682 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
683 out_attribute(soap, NULL, "xmlns", ns, NULL, flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
684 return np->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
686
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
687 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
688
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
689 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
690 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
691 * soap_dom_element class
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
692 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
693 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
694
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
695 soap_dom_element::soap_dom_element()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
696 { soap_default_xsd__anyType(NULL, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
697 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
698
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
699 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
700
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
701 soap_dom_element::soap_dom_element(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
702 { soap_default_xsd__anyType(soap, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
703 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
704
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
705 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
706
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
707 soap_dom_element::soap_dom_element(struct soap *soap, const char *nstr, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
708 { soap_default_xsd__anyType(soap, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
709 this->nstr = soap_strdup(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
710 this->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
711 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
712
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
713 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
714
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
715 soap_dom_element::soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
716 { soap_default_xsd__anyType(soap, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
717 this->nstr = soap_strdup(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
718 this->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
719 this->data = soap_strdup(soap, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
720 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
721
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
722 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
723
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
724 soap_dom_element::soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
725 { soap_default_xsd__anyType(soap, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
726 this->nstr = soap_strdup(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
727 this->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
728 this->node = node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
729 this->type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
730 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
731
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
732 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
733
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
734 soap_dom_element::~soap_dom_element()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
735 { }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
736
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
737 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
738
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
739 soap_dom_element &soap_dom_element::set(const char *nstr, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
740 { this->nstr = soap_strdup(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
741 this->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
742 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
743 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
744
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
745 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
746
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
747 soap_dom_element &soap_dom_element::set(const char *data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
748 { this->data = soap_strdup(soap, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
749 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
750 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
751
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
752 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
753
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
754 soap_dom_element &soap_dom_element::set(void *node, int type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
755 { this->node = node;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
756 this->type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
757 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
758 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
759
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
760 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
761
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
762 soap_dom_element &soap_dom_element::add(struct soap_dom_element *elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
763 { elt->prnt = this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
764 for (struct soap_dom_element *e = elts; e; e = e->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
765 { if (!e->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
766 { e->next = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
767 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
768 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
769 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
770 elts = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
771 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
772 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
773
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
774 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
775
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
776 soap_dom_element &soap_dom_element::add(struct soap_dom_element &elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
777 { return add(&elt);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
778 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
779
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
780 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
781
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
782 soap_dom_element &soap_dom_element::add(struct soap_dom_attribute *att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
783 { for (struct soap_dom_attribute *a = atts; a; a = a->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
784 { if (!a->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
785 { a->next = att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
786 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
787 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
788 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
789 atts = att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
790 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
791 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
792
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
793 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
794
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
795 soap_dom_element &soap_dom_element::add(struct soap_dom_attribute &att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
796 { return add(&att);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
797 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
798
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
799 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
800
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
801 soap_dom_element_iterator soap_dom_element::begin()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
802 { soap_dom_element_iterator iter(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
803 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
804 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
805
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
806 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
807
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
808 soap_dom_element_iterator soap_dom_element::end()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
809 { soap_dom_element_iterator iter(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
810 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
811 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
812
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
813 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
814
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
815 soap_dom_element_iterator soap_dom_element::find(const char *nstr, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
816 { soap_dom_element_iterator iter(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
817 iter.nstr = nstr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
818 iter.name = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
819 if (name && soap_tag_cmp(this->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
820 return ++iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
821 if (nstr && this->nstr && soap_tag_cmp(this->nstr, nstr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
822 return ++iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
823 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
824 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
825
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
826 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
827
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
828 soap_dom_element_iterator soap_dom_element::find(int type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
829 { soap_dom_element_iterator iter(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
830 iter.type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
831 if (this->type != type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
832 return ++iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
833 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
834 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
835
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
836 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
837
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
838 void soap_dom_element::unlink()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
839 { soap_unlink(soap, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
840 soap_unlink(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
841 soap_unlink(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
842 soap_unlink(soap, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
843 soap_unlink(soap, wide);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
844 if (elts)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
845 elts->unlink();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
846 if (atts)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
847 atts->unlink();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
848 if (next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
849 next->unlink();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
850 node = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
851 type = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
852 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
853
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
854 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
855 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
856 * soap_dom_attribute class
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
857 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
858 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
859
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
860 soap_dom_attribute::soap_dom_attribute()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
861 { this->soap = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
862 this->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
863 this->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
864 this->name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
865 this->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
866 this->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
867 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
868
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
869 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
870
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
871 soap_dom_attribute::soap_dom_attribute(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
872 { this->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
873 this->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
874 this->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
875 this->name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
876 this->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
877 this->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
878 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
879
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
880 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
881
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
882 soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
883 { this->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
884 this->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
885 this->nstr = soap_strdup(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
886 this->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
887 this->data = soap_strdup(soap, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
888 this->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
889 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
890
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
891 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
892
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
893 soap_dom_attribute::~soap_dom_attribute()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
894 { }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
895
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
896 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
897
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
898 soap_dom_attribute &soap_dom_attribute::set(const char *nstr, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
899 { this->nstr = soap_strdup(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
900 this->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
901 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
902 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
903
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
904 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
905
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
906 soap_dom_attribute &soap_dom_attribute::set(const char *data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
907 { this->data = soap_strdup(soap, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
908 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
909 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
910
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
911 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
912
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
913 soap_dom_attribute_iterator soap_dom_attribute::begin()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
914 { soap_dom_attribute_iterator iter(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
915 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
917
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
918 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
919
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
920 soap_dom_attribute_iterator soap_dom_attribute::end()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
921 { soap_dom_attribute_iterator iter(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
922 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
923 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
924
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
925 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
926
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
927 soap_dom_attribute_iterator soap_dom_attribute::find(const char *nstr, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
928 { soap_dom_attribute_iterator iter(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
929 iter.nstr = nstr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
930 iter.name = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
931 if (name && soap_tag_cmp(this->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
932 return ++iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
933 if (nstr && this->nstr && soap_tag_cmp(this->nstr, nstr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
934 return ++iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
935 return iter;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
936 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
937
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
938 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
939
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
940 void soap_dom_attribute::unlink()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
941 { soap_unlink(soap, this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
942 soap_unlink(soap, nstr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
943 soap_unlink(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
944 soap_unlink(soap, data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
945 soap_unlink(soap, wide);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
946 if (next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
947 next->unlink();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
949
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
950 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
951 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
952 * soap_dom_element_iterator class
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
953 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
954 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
955
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
956 soap_dom_element_iterator::soap_dom_element_iterator()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
957 { elt = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
958 nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
959 name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
960 type = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
961 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
962
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
963 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
964
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
965 soap_dom_element_iterator::soap_dom_element_iterator(struct soap_dom_element *elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
966 { this->elt = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
967 nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
968 name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
969 type = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
970 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
971
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
972 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
973
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
974 soap_dom_element_iterator::~soap_dom_element_iterator()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
975 { }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
976
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
977 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
978
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
979 bool soap_dom_element_iterator::operator==(const soap_dom_element_iterator &iter) const
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
980 { return this->elt == iter.elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
982
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
983 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
984
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
985 bool soap_dom_element_iterator::operator!=(const soap_dom_element_iterator &iter) const
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
986 { return this->elt != iter.elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
987 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
988
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
989 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
990
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
991 struct soap_dom_element &soap_dom_element_iterator::operator*() const
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
992 { return *this->elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
993 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
994
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
995 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
996
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
997 soap_dom_element_iterator &soap_dom_element_iterator::operator++()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
998 { while (elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
999 { elt = soap_dom_next_element(elt);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1000 if (!elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1001 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1002 if (name && elt->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1003 { if (!soap_tag_cmp(elt->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1004 { if (nstr && elt->nstr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1005 { if (!soap_tag_cmp(elt->nstr, nstr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1006 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1007 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1008 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1009 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1010 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1011 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1012 else if (type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1013 { if (elt->type == type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1014 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1015 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1016 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1017 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1019 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1020 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1021
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1022 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1023 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1024 * soap_dom_attribute_iterator class
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1025 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1026 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1027
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1028 soap_dom_attribute_iterator::soap_dom_attribute_iterator()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1029 { att = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1030 nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1031 name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1032 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1033
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1034 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1035
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1036 soap_dom_attribute_iterator::soap_dom_attribute_iterator(struct soap_dom_attribute *att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1037 { this->att = att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1038 nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1039 name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1040 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1041
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1042 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1043
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1044 soap_dom_attribute_iterator::~soap_dom_attribute_iterator()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1045 { }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1046
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1047 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1048
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1049 bool soap_dom_attribute_iterator::operator==(const soap_dom_attribute_iterator &iter) const
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1050 { return this->att == iter.att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1051 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1052
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1053 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1054
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1055 bool soap_dom_attribute_iterator::operator!=(const soap_dom_attribute_iterator &iter) const
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1056 { return this->att != iter.att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1057 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1058
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1059 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1060
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1061 struct soap_dom_attribute &soap_dom_attribute_iterator::operator*() const
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1062 { return *this->att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1063 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1064
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1065 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1066
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1067 soap_dom_attribute_iterator &soap_dom_attribute_iterator::operator++()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1068 { while (att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1069 { att = soap_dom_next_attribute(att);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1070 if (!att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1071 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1072 if (name && att->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1073 { if (!soap_tag_cmp(att->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1074 { if (nstr && att->nstr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1075 { if (!soap_tag_cmp(att->nstr, nstr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1076 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1077 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1078 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1079 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1080 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1081 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1082 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1083 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1084 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1085 return *this;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1086 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1087
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1088 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1089 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1090 * I/O
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1091 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1092 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1093
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1094 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1095
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1096 std::ostream &operator<<(std::ostream &o, const struct soap_dom_element &e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1097 { if (!e.soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1098 { struct soap soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1099 soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_GRAPH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1100 soap_serialize_xsd__anyType(&soap, &e);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1101 soap_begin_send(&soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1102 soap.ns = 2; /* do not dump namespace table */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1103 soap_out_xsd__anyType(&soap, NULL, 0, &e, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1104 soap_end_send(&soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1105 soap_end(&soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1106 soap_done(&soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1107 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1108 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1109 { std::ostream *os = e.soap->os;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1110 e.soap->os = &o;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1111 soap_mode omode = e.soap->omode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1112 soap_set_omode(e.soap, SOAP_XML_GRAPH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1113 soap_serialize_xsd__anyType(e.soap, &e);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1114 soap_begin_send(e.soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1115 e.soap->ns = 2; /* do not dump namespace table */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1116 soap_out_xsd__anyType(e.soap, NULL, 0, &e, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1117 soap_end_send(e.soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1118 e.soap->os = os;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1119 e.soap->omode = omode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1121 return o;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1122 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1123
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1124 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1125
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1126 std::istream &operator>>(std::istream &i, struct soap_dom_element &e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1127 { if (!e.soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1128 e.soap = soap_new();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1129 std::istream *is = e.soap->is;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1130 e.soap->is = &i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1131 if (soap_begin_recv(e.soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1132 || !soap_in_xsd__anyType(e.soap, NULL, &e, NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1133 || soap_end_recv(e.soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1134 { /* handle error? Note: e.soap->error is set and app should check */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1135 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1136 e.soap->is = is;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1137 return i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1138 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1139
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1140 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1141
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1142 #endif