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