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_utils.h"
19 #include "globus_i_soap_message.h"
20 #include "globus_soap_message_handle.h"
21 #include "xsd_QName.h"
22 #include "globus_xsd_type_info.h"
23 #include "globus_xml_buffer.h"
24 #include "globus_i_xsd.h"
25
26 xsd_QName                               globus_xml_buffer_qname =
27 {
28     "GLOBUS_XML_BUFFER",
29     "GLOBUS_XML_BUFFER"
30 };
31
32 102336 GLOBUS_I_XSD_DEFINE_TYPE_FUNCTIONS(globus_xml_buffer);
33 GLOBUS_I_XSD_DEFINE_TYPE_INFO(globus_xml_buffer);
34 0 GLOBUS_I_XSD_DEFINE_INIT_CONTENTS_GENERIC(globus_xml_buffer);
35
36 globus_result_t
37 globus_xml_buffer_copy_contents(
38     globus_xml_buffer *                 dest,
39     const globus_xml_buffer *           src)
40 {
41 8222     globus_result_t                     result = GLOBUS_SUCCESS;
42 8222     GlobusFuncName(globus_xml_buffer_copy_contents);
43 8222     GlobusSoapMessageDebugEnter();
44     
45 8222     if(dest && src)
46     {
47 8222         dest->length = src->length;
48 8222         dest->buffer = globus_malloc(src->length + 1);
49 8222         if(!dest->buffer)
50         {
51 0             result = GlobusSoapMessageErrorOutOfMemory;
52         }
53 8222         memcpy(dest->buffer, src->buffer, src->length);
54 8222         dest->buffer[src->length] = 0;
55     }
56     
57 8222     GlobusSoapMessageDebugExit();
58     
59 8222     return result;
60 }
61
62 void
63 globus_xml_buffer_destroy_contents(
64     globus_xml_buffer *                 instance)
65 11591 {
66 11591     GlobusFuncName(globus_xml_buffer_destroy_contents);
67 11591     GlobusSoapMessageDebugEnter();
68     
69 11591     if (instance->buffer != NULL)
70     {
71 11591         free(instance->buffer);
72 11591         instance->buffer = NULL;
73     }
74
75 11591     GlobusSoapMessageDebugExit();
76 }
77
78 globus_result_t
79 globus_xml_buffer_serialize_contents(
80     const xsd_QName *                   element,
81     const globus_xml_buffer *           buffer_handle,
82     globus_soap_message_handle_t        message_handle,
83     globus_xsd_element_options_t        options)
84 995 {
85 995     int                                 res = 0;
86 995     globus_result_t                     result = GLOBUS_SUCCESS;
87 995     GlobusFuncName(globus_xml_buffer_serialize_contents);
88 995     GlobusSoapMessageDebugEnter();
89
90 995     res = xmlTextWriterWriteRawLen(message_handle->writer, 
91                                    (const xmlChar *)buffer_handle->buffer,
92                                    buffer_handle->length);
93 995     if(res < 0)
94     {
95 0         result = GlobusSoapMessageErrorSerializeFailed(
96             message_handle->result, 
97             "Failed to serialize xml buffer", 
98             &globus_xml_buffer_qname);
99         goto exit;
100     }
101
102  exit:
103
104 995     GlobusSoapMessageDebugExit();
105 995     return result;
106 }
107
108 globus_result_t
109 globus_xml_buffer_deserialize_contents(
110     const xsd_QName *                   eqn,
111     globus_xml_buffer *                 buffer_handle,
112     globus_soap_message_handle_t        message_handle,
113     globus_xsd_element_options_t        options)
114 3358 {
115 3358     globus_result_t                     result = GLOBUS_SUCCESS;
116 3358     GlobusFuncName(globus_xml_buffer_deserialize_contents);
117 3358     GlobusSoapMessageDebugEnter();
118
119 3358     if(xmlTextReaderNodeType(message_handle->reader) ==
120        XML_READER_TYPE_TEXT)
121     {
122 35 if(xmlTextReaderHasValue(message_handle->reader))
123 {
124 35     buffer_handle->buffer = globus_libc_strdup(
125 (char *) xmlTextReaderConstValue(message_handle->reader));
126 35     buffer_handle->length = strlen(buffer_handle->buffer);
127 }
128     
129 35 if(message_handle->next_ready)
130 {
131 35     message_handle->next_ready--;
132 }
133 35         goto exit;
134     }
135     
136 3323     if(message_handle->next_ready)
137     {
138         /* The element was pushed back, so we apparently want to include
139          * it in the xml buffer
140          */
141 3269 if(!xmlTextReaderIsEmptyElement(message_handle->reader))
142 {
143 3244     message_handle->next_ready--;
144 }
145
146 3269 buffer_handle->buffer = (char *) xmlTextReaderReadOuterXml(
147     message_handle->reader);
148 3269 if(!buffer_handle->buffer)
149 {
150 0     result = GlobusSoapMessageErrorDeserializeFailed(
151 message_handle->result, 
152 &globus_xml_buffer_qname);
153 0     goto exit;
154 }
155 3269         xmlTextReaderSkip(message_handle->reader, 0);
156     }
157     else
158     {
159 54 buffer_handle->buffer = (char *) xmlTextReaderReadInnerXml(
160     message_handle->reader);
161 54 if(!buffer_handle->buffer)
162 {
163 0     result = GlobusSoapMessageErrorDeserializeFailed(
164 message_handle->result, 
165 &globus_xml_buffer_qname);
166 0     goto exit;
167 }
168 54         xmlTextReaderSkip(message_handle->reader, 0);
169         /* Push the  element end back */
170 54         globus_soap_message_deserialize_push_element(message_handle);
171     }
172
173 3323     buffer_handle->length = strlen(buffer_handle->buffer);
174
175  exit:
176     
177 3358     GlobusSoapMessageDebugExit();
178 3358     return result;