1 /*
2 * Copyright 1999-2006 University of Chicago
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18 #include "globus_soap_message.h"
19 #include "xsd_QName.h"
20
21 void
22 xsd_QName_destroy_contents(
23 xsd_QName * instance)
24 19681050 {
25 GlobusFuncName(xsd_QName_destroy_contents);
26 19681050 GlobusSoapMessageDebugEnter();
27
28 19681050 if(instance)
29 {
30 19681050 if(instance->Namespace)
31 {
32 16972816 free(instance->Namespace);
33 16972816 instance->Namespace = 0;
34 }
35 19681050 if(instance->local)
36 {
37 16976468 free(instance->local);
38 16976468 instance->local = 0;
39 }
40 }
41
42 19681050 GlobusSoapMessageDebugExit();
43 19681050 }
44 /* xsd_QName_destroy_contents() */
45
46 globus_result_t
47 xsd_QName_copy_contents(
48 xsd_QName * dest,
49 const xsd_QName * src)
50 12087934 {
51 12087934 globus_result_t result = GLOBUS_SUCCESS;
52 GlobusFuncName(xsd_QName_copy_contents);
53 12087934 GlobusSoapMessageDebugEnter();
54
55 12087934 if(dest && src)
56 {
57 12087934 if(src->Namespace)
58 {
59 12086699 dest->Namespace = globus_libc_strdup(src->Namespace);
60 12086699 if (dest->Namespace == NULL)
61 {
62 0 result = GlobusSoapMessageErrorOutOfMemory;
63 0 goto error;
64 }
65 }
66 else
67 {
68 1235 dest->Namespace = NULL;
69 }
70
71 12087934 if (src->local)
72 {
73 12087934 dest->local = globus_libc_strdup(src->local);
74 12087934 if (dest->local == NULL)
75 {
76 0 result = GlobusSoapMessageErrorOutOfMemory;
77 0 goto free_ns_error;
78 }
79 }
80 else
81 {
82 0 dest->local = NULL;
83 }
84 }
85
86 12087934 free_ns_error:
87 12087934 if (result != GLOBUS_SUCCESS)
88 {
89 0 free(dest->Namespace);
90 0 dest->Namespace = NULL;
91 }
92 12087934 error:
93 12087934 GlobusSoapMessageDebugExit();
94 12087934 return result;
95 }
96 /* xsd_QName_copy_contents() */
97
98 globus_result_t
99 xsd_QName_serialize(
100 const xsd_QName * element_qname,
101 const xsd_QName * instance,
102 globus_soap_message_handle_t message_handle,
103 globus_xsd_element_options_t options)
104 2627719 {
105 2627719 globus_result_t result = GLOBUS_SUCCESS;
106 2627719 xsd_QName * type_attr = NULL;
107 2627719 char * type_value = NULL;
108 2627719 char * prefix = NULL;
109 2627719 char * type_attr_prefix = NULL;
110
111 GlobusFuncName(xsd_QName_serialize);
112 2627719 GlobusSoapMessageDebugEnter();
113
114 2627719 if(!(options & GLOBUS_XSD_ELEMENT_CONTENTS_ONLY))
115 {
116 /* serialize xsd_QName element */
117 2627326 result = globus_soap_message_element_ns_set(
118 message_handle,
119 element_qname,
120 element_qname->Namespace,
121 &options);
122 2627326 if(result != GLOBUS_SUCCESS)
123 {
124 0 result = GlobusSoapMessageErrorSerializeFailed(
125 result, NULL, element_qname);
126 0 goto exit;
127 }
128 2627326 result = globus_soap_message_attribute_ns_set(
129 message_handle,
130 element_qname,
131 instance->Namespace,
132 &options);
133 2627326 if (result != GLOBUS_SUCCESS)
134 {
135 0 result = GlobusSoapMessageErrorSerializeFailed(
136 result, NULL, element_qname);
137 0 goto exit;
138 }
139
140 2627326 if((options & GLOBUS_XSD_ELEMENT_TYPE_ATTR) &&
141 !globus_soap_message_serialize_is_c14n_subset(message_handle))
142 {
143 6 result = globus_soap_message_attribute_ns_set(
144 message_handle,
145 element_qname,
146 "http://www.w3.org/2001/XMLSchema-instance",
147 &options);
148 6 if(result != GLOBUS_SUCCESS)
149 {
150 0 result = GlobusSoapMessageErrorSerializeFailed(
151 result, NULL, element_qname);
152 0 goto exit;
153 }
154
155 6 result = globus_soap_message_attribute_ns_set(
156 message_handle,
157 element_qname,
158 xsd_QName_qname.Namespace,
159 &options);
160 6 if(result != GLOBUS_SUCCESS)
161 {
162 0 result = GlobusSoapMessageErrorSerializeFailed(
163 result, NULL, element_qname);
164 0 goto exit;
165 }
166 }
167
168 2627326 result = globus_soap_message_serialize_element(
169 message_handle,
170 element_qname,
171 options,
172 &xsd_QName_qname);
173 2627326 if(result != GLOBUS_SUCCESS)
174 {
175 0 result = GlobusSoapMessageErrorSerializeFailed(
176 result, NULL, element_qname);
177 0 goto exit;
178 }
179
180 2627326 if((options & GLOBUS_XSD_ELEMENT_TYPE_ATTR) &&
181 !globus_soap_message_serialize_is_c14n_subset(message_handle))
182 {
183 6 xsd_QName_init(&type_attr);
184
185 6 type_attr->local = globus_libc_strdup("type");
186 6 type_attr->Namespace = globus_libc_strdup(XSI_NS);
187
188 6 if(prefix)
189 {
190 0 type_value = globus_common_create_string(
191 "%s:%s", type_attr_prefix,
192 xsd_QName_qname.local);
193 }
194 else
195 {
196 6 type_value = globus_libc_strdup(xsd_QName_qname.local);
197 }
198 }
199
200 /* serialize namespaces */
201 2627326 result = globus_soap_message_element_ns_add(
202 message_handle,
203 element_qname,
204 element_qname->Namespace,
205 &options);
206 2627326 if(result != GLOBUS_SUCCESS)
207 {
208 0 result = GlobusSoapMessageErrorSerializeFailed(
209 result, NULL, element_qname);
210 0 goto exit;
211 }
212 2627326 result = globus_soap_message_attribute_ns_add(
213 message_handle,
214 element_qname,
215 instance->Namespace,
216 &options);
217 2627326 if(result != GLOBUS_SUCCESS)
218 {
219 0 result = GlobusSoapMessageErrorSerializeFailed(
220 result, NULL, instance);
221 0 goto exit;
222 }
223 2627326 if(options & GLOBUS_XSD_ELEMENT_TYPE_ATTR &&
224 !globus_soap_message_serialize_is_c14n_subset(message_handle))
225 {
226 xsd_QName type_attr;
227 6 type_attr.local = "type";
228 6 type_attr.Namespace = "http://www.w3.org/2001/XMLSchema-instance";
229
230 6 result = globus_soap_message_attribute_ns_add(
231 message_handle,
232 element_qname,
233 type_attr.Namespace,
234 &options);
235 6 if(result != GLOBUS_SUCCESS)
236 {
237 0 result = GlobusSoapMessageErrorSerializeFailed(
238 result, NULL, element_qname);
239 0 goto exit;
240 }
241
242 6 result = globus_soap_message_attribute_ns_add(
243 message_handle,
244 element_qname,
245 xsd_QName_qname.Namespace,
246 &options);
247 6 if(result != GLOBUS_SUCCESS)
248 {
249 0 result = GlobusSoapMessageErrorSerializeFailed(
250 result, NULL, element_qname);
251 0 goto exit;
252 }
253
254 6 result = globus_soap_message_serialize_QName_attribute(
255 message_handle,
256 &type_attr,
257 &xsd_QName_qname);
258 6 if(result != GLOBUS_SUCCESS)
259 {
260 0 result = GlobusSoapMessageErrorSerializeFailed(
261 result, NULL, element_qname);
262 0 goto exit;
263 }
264 }
265
266 2627326 result = globus_soap_message_serialize_element_begin_close(
267 message_handle, element_qname);
268 2627326 if(result != GLOBUS_SUCCESS)
269 {
270 0 result = GlobusSoapMessageErrorSerializeFailed(
271 result, NULL, element_qname);
272 0 goto exit;
273 }
274 }
275
276
277 2627719 result = xsd_QName_serialize_contents(
278 element_qname,
279 instance,
280 message_handle,
281 options);
282
283 2627719 if(result != GLOBUS_SUCCESS)
284 {
285 0 result = GlobusSoapMessageErrorSerializeFailed(
286 result, NULL, element_qname);
287 0 goto exit;
288 }
289 2627719 if(!(options & GLOBUS_XSD_ELEMENT_CONTENTS_ONLY))
290 {
291 /* add end element */
292 2627326 result = globus_soap_message_serialize_element_end(
293 message_handle,
294 element_qname,
295 options,
296 &xsd_QName_qname);
297 2627326 if(result != GLOBUS_SUCCESS)
298 {
299 0 result = GlobusSoapMessageErrorSerializeFailed(
300 result, NULL, element_qname);
301 0 goto exit;
302 }
303
304 2627326 globus_soap_message_element_ns_remove(
305 message_handle,
306 element_qname->Namespace,
307 &options);
308
309 2627326 globus_soap_message_attribute_ns_remove(
310 message_handle, instance->Namespace, &options);
311
312 2627326 if(options & GLOBUS_XSD_ELEMENT_TYPE_ATTR &&
313 !globus_soap_message_serialize_is_c14n_subset(message_handle))
314 {
315 6 globus_soap_message_attribute_ns_remove(
316 message_handle,
317 "http://www.w3.org/2001/XMLSchema-instance",
318 &options);
319
320 6 globus_soap_message_attribute_ns_remove(
321 message_handle, xsd_QName_qname.Namespace, &options);
322 }
323
324 2627326 globus_soap_message_element_ns_remove(
325 message_handle, element_qname->Namespace, &options);
326 }
327 2627719 exit:
328
329 2627719 GlobusSoapMessageDebugExit();
330 2627719 return result;
331 }