1 /*
2  * Portions of this file Copyright 1999-2005 University of Chicago
3  * Portions of this file Copyright 1999-2005 The University of Southern California.
4  *
5  * This file or a portion of this file is licensed under the
6  * terms of the Globus Toolkit Public License, found at
7  * http://www.globus.org/toolkit/download/license.html.
8  * If you redistribute this file, with or without
9  * modifications, you must include this notice in the file.
10  */
11
12
13 #include "xsd_anyType.h"
14 #include "globus_soap_message.h"
15 #include "globus_soap_message_utils.h"
16 #include "globus_i_soap_message.h"
17 #include "globus_i_soap_message_wildcards.h"
18 #include "globus_xml_buffer.h"
19 #include "globus_i_xsd.h"
20
21 GLOBUS_I_XSD_DEFINE_QNAME(xsd, anyType);
22 0 GLOBUS_I_XSD_DEFINE_TYPE_INIT_ARRAY(xsd_anyType);
23 0 GLOBUS_I_XSD_DEFINE_TYPE_DESTROY_ARRAY(xsd_anyType);
24 0 GLOBUS_I_XSD_DEFINE_TYPE_COPY_ARRAY(xsd_anyType);
25 0 GLOBUS_I_XSD_DEFINE_TYPE_SERIALIZE_ARRAY(xsd_anyType);
26 0 GLOBUS_I_XSD_DEFINE_TYPE_DESERIALIZE_ARRAY(xsd_anyType);
27 0 GLOBUS_I_XSD_DEFINE_TYPE_ARRAY_PUSH(xsd_anyType);
28 0 GLOBUS_I_XSD_DEFINE_TYPE_INIT(xsd_anyType);
29 12 GLOBUS_I_XSD_DEFINE_TYPE_DESTROY(xsd_anyType);
30 0 GLOBUS_I_XSD_DEFINE_TYPE_COPY(xsd_anyType);
31 0 GLOBUS_I_XSD_DEFINE_INIT_CONTENTS_GENERIC(xsd_anyType);
32
33 globus_result_t
34 xsd_anyType_serialize_wrapper(
35     xsd_QName *                         element_qname,
36     void *                              instance,
37     globus_soap_message_handle_t        message_handle,
38     globus_xsd_element_options_t        options)
39 {
40 0     return xsd_anyType_serialize(
41         element_qname,
42         (xsd_anyType *) instance,
43         message_handle, options);
44 }
45
46 globus_result_t
47 xsd_anyType_deserialize_pointer_wrapper(
48     xsd_QName *                         element_qname,
49     void **                             ip,
50     globus_soap_message_handle_t        message_handle,
51     globus_xsd_element_options_t        options)
52 0 {
53 0     return xsd_anyType_deserialize_pointer(
54         element_qname,
55         (xsd_anyType **) ip,
56         message_handle, options);
57 }
58
59 struct globus_xsd_type_info_s xsd_anyType_info =
60 {
61     &xsd_anyType_qname,
62     xsd_anyType_serialize_wrapper,
63     xsd_anyType_deserialize_pointer_wrapper,
64     xsd_anyType_init_wrapper,
65     xsd_anyType_destroy_wrapper,
66     xsd_anyType_copy_wrapper,
67     xsd_anyType_init_contents_wrapper,
68     xsd_anyType_destroy_contents_wrapper,
69     xsd_anyType_copy_contents_wrapper,
70     sizeof(xsd_anyType),
71     NULL,
72     NULL,
73     NULL
74 };
75
76 struct globus_xsd_type_info_s xsd_anyType_array_info =
77 {
78     &xsd_anyType_qname,
79     xsd_anyType_array_serialize_wrapper,
80     xsd_anyType_array_deserialize_wrapper,
81     xsd_anyType_array_init_wrapper,
82     xsd_anyType_array_destroy_wrapper,
83     xsd_anyType_array_copy_wrapper,
84     xsd_anyType_array_init_contents_wrapper,
85     xsd_anyType_array_destroy_contents_wrapper,
86     xsd_anyType_array_copy_contents_wrapper,
87     sizeof(xsd_anyType),
88     xsd_anyType_array_push_wrapper,
89     NULL,
90     NULL
91 };
92
93 struct globus_xsd_type_info_s xsd_anyType_contents_info =
94 {
95     &xsd_anyType_qname,
96     xsd_anyType_serialize_wrapper,
97     xsd_anyType_deserialize_pointer_wrapper,
98     xsd_anyType_init_wrapper,
99     xsd_anyType_destroy_wrapper,
100     xsd_anyType_copy_wrapper,
101     xsd_anyType_init_contents_wrapper,
102     xsd_anyType_destroy_contents_wrapper,
103     xsd_anyType_copy_contents_wrapper,
104     sizeof(xsd_anyType),
105     NULL,
106     NULL,
107     NULL
108 };
109
110 void
111 xsd_anyType_destroy_contents(
112     xsd_anyType *                       instance)
113 0 {
114 0     GlobusFuncName(xsd_anyType_destroy_contents);
115 0     GlobusSoapMessageDebugEnter();
116
117 0     if(instance && instance->value && instance->any_info)
118     {
119 0         instance->any_info->destroy(instance->value);
120 0         instance->value = NULL;
121     }
122
123 0     GlobusSoapMessageDebugExit();
124 }
125
126 globus_result_t
127 xsd_anyType_copy_contents(
128     xsd_anyType *                       dest,
129     const xsd_anyType *                 src)
130 0 {
131 0     globus_result_t                     result = GLOBUS_SUCCESS;
132 0     GlobusFuncName(xsd_anyType_copy_contents);
133 0     GlobusSoapMessageDebugEnter();
134
135 0     if(dest && src)
136     {
137 0         *dest = *src;
138 0         if(src->value && src->any_info)
139         {
140 0             result = src->any_info->copy(&dest->value, src->value);
141         }
142     }
143
144 0     GlobusSoapMessageDebugExit();
145 0     return result;
146 }
147
148 globus_result_t
149 xsd_anyType_serialize(
150     xsd_QName *                         element_qname,
151     xsd_anyType *                       anyinst,
152     globus_soap_message_handle_t        message_handle,
153     globus_xsd_element_options_t        options)
154 0 {
155 0     globus_result_t                     result = GLOBUS_SUCCESS;
156 0     GlobusFuncName(xsd_anyType_serialize);
157 0     GlobusSoapMessageDebugEnter();
158
159     /* serialize contents of type */
160 0     result = anyinst->any_info->serialize(
161         element_qname,
162         anyinst->value,
163         message_handle,
164         options | GLOBUS_XSD_ELEMENT_TYPE_ATTR);
165 0     if(result != GLOBUS_SUCCESS)
166     {
167 0         result = GlobusSoapMessageErrorSerializeFailed(
168             result,
169             "Serialization of xsd:any failed",
170             element_qname);
171         goto exit;
172     }
173
174  exit:
175
176 0     GlobusSoapMessageDebugExit();
177 0     return result;
178 }
179
180 globus_result_t
181 xsd_anyType_deserialize(
182     xsd_QName *                         element_qname,
183     xsd_anyType *                       instance,
184     globus_soap_message_handle_t        message_handle,
185     globus_xsd_element_options_t        options)
186 0 {
187 0     globus_result_t                     result = GLOBUS_SUCCESS;
188 0     GlobusFuncName(xsd_anyType_deserialize);
189 0     GlobusSoapMessageDebugEnter();
190
191 0     result = globus_soap_message_deserialize_element(
192         message_handle, element_qname);
193 0     if(result != GLOBUS_SUCCESS)
194     {
195 0         if(GlobusSoapMessageStatusFailedWithTextCheck(result))
196         {
197 0             result = GLOBUS_SUCCESS;
198         }
199 0         else if(!GlobusSoapMessageStatusCheck(result))
200         {
201 0             result = GlobusSoapMessageErrorDeserializeFailed(
202                 result, element_qname);
203 0             goto exit;
204         }
205         else
206         {
207 0             goto exit;
208         }
209     }
210
211 0     if(!(options & GLOBUS_XSD_ELEMENT_CONTENTS_ONLY))
212     {
213 0         globus_soap_message_deserialize_push_element(message_handle);
214     }
215
216 0     GlobusSoapMessageDebugPrintf(
217         GLOBUS_SOAP_MESSAGE_DEBUG_WILDCARDS, 
218         ("\n\nDeserializing xsd:anyType\n"));
219
220 0     result = globus_i_xsd_deserialize_from_xsi_type(
221         &instance->any_info,
222         instance->registry,
223         message_handle);
224 0     if(result != GLOBUS_SUCCESS)
225     {
226 0         result = GlobusSoapMessageErrorDeserializeFailed(
227             result, element_qname);
228 0         goto exit;
229     }
230
231 0     if(!instance->any_info)
232     {
233 0         instance->any_info = (&globus_xml_buffer_contents_info);
234     }
235
236 0     GlobusSoapMessageDebugPrintf(
237         GLOBUS_SOAP_MESSAGE_DEBUG_WILDCARDS, 
238         ("Using any info: {%s}%s\n",
239          instance->any_info->type->Namespace,
240          instance->any_info->type->local));
241
242 0     result = instance->any_info->deserialize(
243         element_qname,
244         &instance->value,
245         message_handle,
246         options);
247 0     if(result != GLOBUS_SUCCESS)
248     {
249 0         result = GlobusSoapMessageErrorDeserializeFailed(
250             result, instance->any_info->type);
251         goto exit;
252     }
253
254 /*     if(options & GLOBUS_XSD_ELEMENT_CONTENTS_ONLY) */
255 /*     { */
256 /*         globus_soap_message_deserialize_push_element(message_handle); */
257 /*     } */
258
259  exit:
260
261 0     if(result != GLOBUS_SUCCESS)
262     {
263 0         xsd_anyType_destroy_contents(instance);
264     }
265
266 0     GlobusSoapMessageDebugExit();
267 0     return result;
268 }
269
270 globus_result_t
271 xsd_anyType_deserialize_pointer(
272     xsd_QName *                         element_qname,
273     xsd_anyType **                      ip,
274     globus_soap_message_handle_t        message_handle,
275     globus_xsd_element_options_t        options)
276 3 {
277 3     xsd_anyType *                       instance = NULL;
278 3     globus_result_t                     result = GLOBUS_SUCCESS;
279 3     GlobusFuncName(xsd_any_deserialize_pointer);
280 3     GlobusSoapMessageDebugEnter();
281
282 3     result = globus_soap_message_deserialize_element(
283         message_handle, element_qname);
284 3     if(result != GLOBUS_SUCCESS)
285     {
286 3         if(GlobusSoapMessageStatusElementNotFoundCheck(result) ||
287            GlobusSoapMessageStatusFailedElementCheck(result))
288         {
289 3             *ip = NULL;
290 3             result = GLOBUS_SUCCESS;
291 3             goto exit;
292         }
293
294 0         if(!GlobusSoapMessageStatusCheck(result))
295         {
296 0             result = GlobusSoapMessageErrorDeserializeFailed(
297                 result, element_qname);
298 0             goto exit;
299         }
300 0         goto exit;
301     }
302
303
304 0     GlobusSoapMessageDebugPrintf(
305         GLOBUS_SOAP_MESSAGE_DEBUG_WILDCARDS, 
306         ("\n\nDeserializing xsd:anyType\n"));
307
308 0     result = xsd_anyType_init(&instance);
309 0     if(result != GLOBUS_SUCCESS)
310     {
311 0         result = GlobusSoapMessageErrorDeserializeFailed(
312             result, &xsd_anyType_qname);
313 0         goto exit;
314     }
315
316 0     result = globus_i_xsd_deserialize_from_xsi_type(
317         &instance->any_info,
318         instance->registry,
319         message_handle);
320 0     if(result != GLOBUS_SUCCESS)
321     {
322 0         result = GlobusSoapMessageErrorDeserializeFailed(
323             result, element_qname);
324 0         goto exit;
325     }
326
327 0     if(!instance->any_info)
328     {
329 0         result = GlobusSoapMessageErrorNoXSITypeAttr();
330 0         goto exit;
331     }
332
333 0     globus_soap_message_deserialize_push_element(message_handle);
334
335 0     GlobusSoapMessageDebugPrintf(
336         GLOBUS_SOAP_MESSAGE_DEBUG_WILDCARDS, 
337         ("Using any info: {%s}%s\n",
338          instance->any_info->type->Namespace,
339          instance->any_info->type->local));
340
341 0     result = instance->any_info->deserialize(
342         element_qname,
343         &instance->value,
344         message_handle,
345         options);
346 0     if(result != GLOBUS_SUCCESS)
347     {
348 0         result = GlobusSoapMessageErrorDeserializeFailed(
349             result, instance->any_info->type);
350 0         goto exit;
351     }
352
353 0     *ip = instance;
354
355  exit:
356
357 3     if(result != GLOBUS_SUCCESS && instance)
358     {
359 0         xsd_anyType_destroy(instance);
360     }
361
362 3     GlobusSoapMessageDebugExit();
363 3     return result;