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