Changed include/yaz/diagbib1.h and added include/yaz/diagsrw.h with
[yaz-moved-to-github.git] / src / soap.c
index ebcf158..3de5e29 100644 (file)
@@ -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 <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)
     {
@@ -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 =
         "<?xml version=\"1.0\"?>\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;
+}
+