28 char **content_buf,
int *content_len,
31 const char *stylesheet)
40 if (!content_buf || !*content_buf || !content_len)
46 doc = xmlParseMemory(*content_buf, *content_len);
49 "Bad XML Document", 0);
51 ptr = xmlDocGetRootElement(doc);
52 if (!ptr || ptr->type != XML_ELEMENT_NODE || !ptr->ns)
56 "No Envelope element", 0);
59 for (i = 0; handlers[i].
ns; i++)
61 const char *hns = handlers[i].
ns;
75 void *handler_data = 0;
78 p_top_tmp.children = ptr;
79 ret = (*handlers[i].
f)(o, &p_top_tmp, &handler_data,
80 handlers[i].client_data,
81 (
const char *)ptr->
ns->href);
83 if (ret || !handler_data)
85 "SOAP Handler returned error", 0);
99 if (xmlStrcmp(ptr->name, BAD_CAST
"Envelope"))
103 "No Envelope element", 0);
108 const char * ns_envelope = (
const char *) ptr->ns->href;
111 else if (!strcmp(ns_envelope,
soap_v1_2))
117 "Bad SOAP version", 0);
121 while(ptr && ptr->type == XML_TEXT_NODE)
123 if (ptr && ptr->type == XML_ELEMENT_NODE &&
124 !xmlStrcmp(ptr->ns->href, BAD_CAST p->
ns) &&
125 !xmlStrcmp(ptr->name, BAD_CAST
"Header"))
128 while(ptr && ptr->type == XML_TEXT_NODE)
132 if (!ptr || ptr->type != XML_ELEMENT_NODE ||
133 xmlStrcmp(ptr->name, BAD_CAST
"Body"))
137 "SOAP Body element not found", 0);
139 if (xmlStrcmp(ptr->ns->href, BAD_CAST p->
ns))
143 "SOAP bad NS for Body element", 0);
147 while (ptr && ptr->type == XML_TEXT_NODE)
149 if (!ptr || ptr->type != XML_ELEMENT_NODE)
153 "SOAP No content for Body", 0);
159 "SOAP No namespace for content", 0);
162 if (!xmlStrcmp(ptr->ns->href, BAD_CAST p->
ns)
163 && !xmlStrcmp(ptr->name, BAD_CAST
"Fault") && ptr->children)
174 if (ptr->children && ptr->children->type == XML_TEXT_NODE)
176 if (!xmlStrcmp(ptr->name, BAD_CAST
"faultcode"))
179 ptr->children->content);
180 if (!xmlStrcmp(ptr->name, BAD_CAST
"faultstring"))
183 ptr->children->content);
184 if (!xmlStrcmp(ptr->name, BAD_CAST
"details"))
187 ptr->children->content);
195 const char *ns = (
const char *) ptr->ns->href;
196 for (i = 0; handlers[i].
ns; i++)
198 if (strchr(handlers[i].ns,
':') &&
204 void *handler_data = 0;
205 ret = (*handlers[i].
f)(o, pptr, &handler_data,
206 handlers[i].client_data, ns);
207 if (ret || !handler_data)
209 "SOAP Handler returned error", 0);
223 "No handler for NS", ns);
233 xmlNodePtr envelope_ptr, body_ptr;
235 xmlDocPtr doc = xmlNewDoc(BAD_CAST
"1.0");
237 envelope_ptr = xmlNewNode(0, BAD_CAST
"Envelope");
238 ns_env = xmlNewNs(envelope_ptr, BAD_CAST p->
ns,
239 BAD_CAST
"SOAP-ENV");
240 xmlSetNs(envelope_ptr, ns_env);
242 body_ptr = xmlNewChild(envelope_ptr, ns_env, BAD_CAST
"Body",
244 xmlDocSetRootElement(doc, envelope_ptr);
249 xmlNodePtr fault_ptr = xmlNewChild(body_ptr, ns_env,
250 BAD_CAST
"Fault", 0);
251 xmlNewChild(fault_ptr, ns_env, BAD_CAST
"faultcode",
253 xmlNewChild(fault_ptr, ns_env, BAD_CAST
"faultstring",
256 xmlNewChild(fault_ptr, ns_env, BAD_CAST
"details",
263 ret = (*handlers[no].
f)(o, body_ptr, &p->
u.
generic->
p,
274 xmlDocSetRootElement(doc, body_ptr->children);
275 body_ptr->children = 0;
276 xmlFreeNode(envelope_ptr);
280 char *content = (
char *)
odr_malloc(o, strlen(stylesheet) + 40);
281 xmlNodePtr pi, ptr = xmlDocGetRootElement(doc);
284 "type=\"text/xsl\" href=\"%s\"", stylesheet);
285 pi = xmlNewPI(BAD_CAST
"xml-stylesheet", BAD_CAST content);
286 xmlAddPrevSibling(ptr, pi);
293 xmlDocDumpMemoryEnc(doc, &buf_out, &len_out, encoding);
295 xmlDocDumpMemory(doc, &buf_out, &len_out);
296 *content_buf = (
char *)
odr_malloc(o, len_out);
297 *content_len = len_out;
298 memcpy(*content_buf, buf_out, len_out);