X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsoap.c;h=3de5e292673833f4de0dad6d66d8997edfe0e83f;hp=ebcf158aff73ba65635a52efbfccbfc6cf21e294;hb=84d7b06c13daa609e93f353e655c4b02f936d65c;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9 diff --git a/src/soap.c b/src/soap.c index ebcf158..3de5e29 100644 --- a/src/soap.c +++ b/src/soap.c @@ -1,8 +1,15 @@ /* - * 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 @@ -14,26 +21,11 @@ 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) { @@ -111,6 +103,12 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, 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) @@ -118,7 +116,7 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, 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; @@ -157,7 +155,8 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, 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; @@ -204,12 +203,26 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, 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; @@ -229,9 +242,10 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, 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 = "\n" @@ -253,6 +267,15 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, 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) @@ -260,3 +283,19 @@ int z_soap_codec(ODR o, Z_SOAP **pp, 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; +} +