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 32613 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 4756 {
36 4756 globus_result_t result = GLOBUS_SUCCESS;
37 GlobusFuncName(globus_xml_buffer_copy_contents);
38 4756 GlobusSoapMessageDebugEnter();
39
40 4756 if(dest && src)
41 {
42 4756 dest->length = src->length;
43 4756 dest->buffer = globus_malloc(src->length + 1);
44 4756 if(!dest->buffer)
45 {
46 0 result = GlobusSoapMessageErrorOutOfMemory;
47 }
48 4756 memcpy(dest->buffer, src->buffer, src->length);
49 4756 dest->buffer[src->length] = 0;
50 }
51
52 4756 GlobusSoapMessageDebugExit();
53
54 4756 return result;
55 }
56
57 void
58 globus_xml_buffer_destroy_contents(
59 globus_xml_buffer * instance)
60 7927 {
61 GlobusFuncName(globus_xml_buffer_destroy_contents);
62 7927 GlobusSoapMessageDebugEnter();
63
64 7927 if (instance->buffer != NULL)
65 {
66 7927 free(instance->buffer);
67 7927 instance->buffer = NULL;
68 }
69
70 7927 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 951 {
80 951 int res = 0;
81 951 globus_result_t result = GLOBUS_SUCCESS;
82 GlobusFuncName(globus_xml_buffer_serialize_contents);
83 951 GlobusSoapMessageDebugEnter();
84
85 951 res = xmlTextWriterWriteRawLen(message_handle->writer,
86 (const xmlChar *)buffer_handle->buffer,
87 buffer_handle->length);
88 951 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 951 exit:
98
99 951 GlobusSoapMessageDebugExit();
100 951 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 3115 {
110 3115 globus_result_t result = GLOBUS_SUCCESS;
111 GlobusFuncName(globus_xml_buffer_deserialize_contents);
112 3115 GlobusSoapMessageDebugEnter();
113
114 3115 if(xmlTextReaderNodeType(message_handle->reader) ==
115 XML_READER_TYPE_TEXT)
116 {
117 13 if(xmlTextReaderHasValue(message_handle->reader))
118 {
119 13 buffer_handle->buffer = globus_libc_strdup(
120 xmlTextReaderConstValue(message_handle->reader));
121 13 buffer_handle->length = strlen(buffer_handle->buffer);
122 }
123
124 13 if(message_handle->next_ready)
125 {
126 13 message_handle->next_ready--;
127 }
128 goto exit;
129 }
130
131 3102 if(message_handle->next_ready)
132 {
133 3102 if(!xmlTextReaderIsEmptyElement(message_handle->reader))
134 {
135 3077 message_handle->next_ready--;
136 }
137
138 3102 buffer_handle->buffer = xmlTextReaderReadInnerXml(
139 message_handle->reader);
140 3102 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 3102 buffer_handle->length = strlen(buffer_handle->buffer);
162
163 3115 exit:
164
165 3115 GlobusSoapMessageDebugExit();
166 3115 return result;