/*
- * Copyright (c) 2002-2003, Index Data.
+ * Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: soap.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ * $Id: soap.c,v 1.10 2005-01-15 19:47:14 adam Exp $
+ */
+/**
+ * \file soap.c
+ * \brief Implements SOAP
+ *
+ * This implements encoding and decoding of SOAP packages using
+ * Libxml2.
*/
#include <yaz/soap.h>
static const char *soap_v1_1 = "http://schemas.xmlsoap.org/soap/envelope/";
static const char *soap_v1_2 = "http://www.w3.org/2001/06/soap-envelope";
-int z_soap_error(ODR o, Z_SOAP *p,
- const char *fault_code, const char *fault_string,
- const char *details)
-{
- p->which = Z_SOAP_error;
- p->u.soap_error = (Z_SOAP_Fault *)
- odr_malloc(o, sizeof(*p->u.soap_error));
- p->u.soap_error->fault_code = odr_strdup(o, fault_code);
- p->u.soap_error->fault_string = odr_strdup(o, fault_string);
- if (details)
- p->u.soap_error->details = odr_strdup(o, details);
- else
- p->u.soap_error->details = 0;
- return -1;
-}
-
-int z_soap_codec_enc(ODR o, Z_SOAP **pp,
- char **content_buf, int *content_len,
- Z_SOAP_Handler *handlers,
- const char *encoding)
+int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers,
+ const char *encoding,
+ const char *stylesheet)
{
if (o->direction == ODR_DECODE)
{
return z_soap_error(o, p, "SOAP-ENV:Client",
"SOAP No content for Body", 0);
}
+ if (!ptr->ns)
+ {
+ xmlFreeDoc(doc);
+ return z_soap_error(o, p, "SOAP-ENV:Client",
+ "SOAP No namespace for content", 0);
+ }
/* check for fault package */
if (!strcmp(ptr->ns->href, p->ns)
&& !strcmp(ptr->name, "Fault") && ptr->children)
ptr = ptr->children;
p->which = Z_SOAP_fault;
- p->u.fault = odr_malloc(o, sizeof(*p->u.fault));
+ p->u.fault = (Z_SOAP_Fault *) odr_malloc(o, sizeof(*p->u.fault));
p->u.fault->fault_code = 0;
p->u.fault->fault_string = 0;
p->u.fault->details = 0;
else
{
p->which = Z_SOAP_generic;
- p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
+ p->u.generic = (Z_SOAP_Generic *)
+ odr_malloc(o, sizeof(*p->u.generic));
p->u.generic->no = i;
p->u.generic->ns = handlers[i].ns;
p->u.generic->p = handler_data;
handlers[no].client_data,
handlers[no].ns);
if (ret)
+ {
+ xmlFreeDoc(doc);
return ret;
+ }
}
if (p->which == Z_SOAP_generic && !strcmp(p->ns, "SRU"))
{
xmlDocSetRootElement(doc, body_ptr->children);
+ body_ptr->children = 0;
+ xmlFreeNode(envelope_ptr);
}
+ if (stylesheet)
+ {
+ char *content = odr_malloc(o, strlen(stylesheet) + 40);
+
+ xmlNodePtr pi, ptr = xmlDocGetRootElement(doc);
+ sprintf(content, "type=\"text/xsl\" href=\"%s\"", stylesheet);
+ pi = xmlNewPI("xml-stylesheet", content);
+ xmlAddPrevSibling(ptr, pi);
+ }
if (1)
{
xmlChar *buf_out;
return 0;
}
#else
-int z_soap_codec_enc(ODR o, Z_SOAP **pp,
- char **content_buf, int *content_len,
- Z_SOAP_Handler *handlers, const char *encoding)
+int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers, const char *encoding,
+ const char *stylesheet)
{
static char *err_xml =
"<?xml version=\"1.0\"?>\n"
return -1;
}
#endif
+int z_soap_codec_enc(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers,
+ const char *encoding)
+{
+ return z_soap_codec_enc_xsl(o, pp, content_buf, content_len, handlers,
+ encoding, 0);
+}
+
int z_soap_codec(ODR o, Z_SOAP **pp,
char **content_buf, int *content_len,
Z_SOAP_Handler *handlers)
return z_soap_codec_enc(o, pp, content_buf, content_len, handlers, 0);
}
+int z_soap_error(ODR o, Z_SOAP *p,
+ const char *fault_code, const char *fault_string,
+ const char *details)
+{
+ p->which = Z_SOAP_error;
+ p->u.soap_error = (Z_SOAP_Fault *)
+ odr_malloc(o, sizeof(*p->u.soap_error));
+ p->u.soap_error->fault_code = odr_strdup(o, fault_code);
+ p->u.soap_error->fault_string = odr_strdup(o, fault_string);
+ if (details)
+ p->u.soap_error->details = odr_strdup(o, details);
+ else
+ p->u.soap_error->details = 0;
+ return -1;
+}
+