summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libcsoap/soap-env.c633
1 files changed, 299 insertions, 334 deletions
diff --git a/libcsoap/soap-env.c b/libcsoap/soap-env.c
index 9c28f73..25a8c3c 100644
--- a/libcsoap/soap-env.c
+++ b/libcsoap/soap-env.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: soap-env.c,v 1.6 2004/09/19 07:05:03 snowdrop Exp $
+* $Id: soap-env.c,v 1.5.2.1 2004/10/08 13:28:56 snowdrop Exp $
*
* CSOAP Project: A SOAP client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -24,7 +24,9 @@
#include <libcsoap/soap-env.h>
#include <stdarg.h>
#include <string.h>
+#ifdef __WIN32__
#include <libxml/xmlstring.h>
+#endif
static char *soap_env_ns = "http://schemas.xmlsoap.org/soap/envelope/";
static char *soap_env_enc = "http://schemas.xmlsoap.org/soap/encoding/";
@@ -55,423 +57,394 @@ Parameters:
/* ---------------------------------------------------------------------------- */
/* XML Serializers (implemented at the and of this document) */
/* ---------------------------------------------------------------------------- */
-struct XmlNodeHolder
-{
- xmlNodePtr node;
-};
+struct XmlNodeHolder { xmlNodePtr node; };
static
- void xmlbuilder_start_element (const xmlChar * element_name, int attr_count,
- xmlChar ** keys, xmlChar ** values,
- void *userData);
+void xmlbuilder_start_element(const xmlChar* element_name, int attr_count,
+ xmlChar **keys, xmlChar **values, void* userData);
static
- void xmlbuilder_characters (const xmlChar * element_name,
- const xmlChar * chars, void *userData);
+void xmlbuilder_characters(const xmlChar* element_name,
+ const xmlChar* chars, void* userData);
static
- void xmlbuilder_end_element (const xmlChar * element_name, void *userData);
+void xmlbuilder_end_element(const xmlChar* element_name, void* userData);
/* ---------------------------------------------------------------------------- */
-SoapEnv *
-soap_env_new_with_fault (fault_code_t faultcode,
- const char *faultstring,
- const char *faultactor, const char *detail)
+SoapEnv *soap_env_new_with_fault(fault_code_t faultcode,
+ const char *faultstring,
+ const char *faultactor,
+ const char *detail)
{
- xmlDocPtr doc;
- doc = soap_fault_build (faultcode, faultstring, faultactor, detail);
- if (doc == NULL)
- return NULL;
- return soap_env_new_from_doc (doc);
+ xmlDocPtr doc;
+ doc = soap_fault_build(faultcode, faultstring,
+ faultactor, detail);
+ if (doc == NULL) return NULL;
+ return soap_env_new_from_doc(doc);
}
-SoapEnv *
-soap_env_new_with_response (SoapEnv * request)
+SoapEnv *soap_env_new_with_response(SoapEnv* request)
{
- char urn[100];
- char methodname[150];
- char methodname2[150];
-
- if (request == NULL)
- {
- log_error1 ("request object is NULL");
- return NULL;
- }
-
- if (request->root == NULL)
- {
- log_error1 ("request has no xml");
- return NULL;
- }
-
- if (!soap_env_find_methodname (request, methodname))
- {
- return NULL;
- }
-
- if (!soap_env_find_urn (request, urn))
- {
-
- /* here we have no chance to find out the namespace */
- /* try to continue without namespace (urn) */
- urn[0] = '\0';
- }
-
- sprintf (methodname2, "%sResponse", methodname);
- return soap_env_new_with_method (urn, methodname2);
-}
+ char urn[100];
+ char methodname[150];
+ char methodname2[150];
+ if (request == NULL) {
+ log_error1("request object is NULL");
+ return NULL;
+ }
-SoapEnv *
-soap_env_new_with_method (const char *urn, const char *method)
-{
- xmlDocPtr env;
- SoapEnv *call;
- xmlChar buffer[1054];
+ if (request->root == NULL) {
+ log_error1("request has no xml");
+ return NULL;
+ }
+
+ if (!soap_env_find_methodname(request, methodname)) {
+ return NULL;
+ }
+
+ if (!soap_env_find_urn(request, urn)) {
+
+ /* here we have no chance to find out the namespace */
+ /* try to continue without namespace (urn) */
+ urn[0] = '\0';
+ }
+ sprintf(methodname2, "%sResponse", methodname);
+ return soap_env_new_with_method(urn, methodname2);
+}
- log_verbose2 ("URN = '%s'", urn);
- log_verbose2 ("Method = '%s'", method);
- xmlStrPrintf (buffer, 1054, BAD_CAST _SOAP_MSG_TEMPLATE_,
- soap_env_ns, soap_env_enc, soap_xsi_ns,
+SoapEnv *soap_env_new_with_method(const char *urn, const char *method)
+{
+ xmlDocPtr env;
+
+ SoapEnv *call;
+#ifdef __WIN32__
+ xmlChar buffer[1054];
+#else
+ char buffer[1054];
+#endif
+
+
+ log_verbose2("URN = '%s'", urn);
+ log_verbose2("Method = '%s'",method);
+#ifdef __WIN32__
+ xmlStrPrintf(buffer, 1054, BAD_CAST _SOAP_MSG_TEMPLATE_,
+ soap_env_ns, soap_env_enc, soap_xsi_ns,
soap_xsd_ns, BAD_CAST method, BAD_CAST urn, BAD_CAST method);
+#else
+ sprintf(buffer, _SOAP_MSG_TEMPLATE_,
+ soap_env_ns, soap_env_enc, soap_xsi_ns,
+ soap_xsd_ns, method, urn, method);
+
+#endif
- env = xmlParseDoc (buffer);
- call = soap_env_new_from_doc (env);
+ env = xmlParseDoc(buffer);
+ call = soap_env_new_from_doc(env);
- return call;
+ return call;
}
xmlNodePtr
-soap_env_add_item (SoapEnv * call, const char *type,
- const char *name, const char *value)
+soap_env_add_item(SoapEnv *call, const char *type,
+ const char *name, const char *value)
{
- xmlNodePtr newnode;
+ xmlNodePtr newnode;
- newnode = xmlNewTextChild (call->cur, NULL, BAD_CAST name, BAD_CAST value);
+ newnode = xmlNewTextChild(call->cur, NULL, BAD_CAST name, BAD_CAST value);
- if (newnode == NULL)
- {
- log_error1 ("Can not create new xml node");
- return NULL;
- }
+ if (newnode == NULL) {
+ log_error1("Can not create new xml node");
+ return NULL;
+ }
- if (type)
- {
- if (!xmlNewProp (newnode, BAD_CAST "xsi:type", BAD_CAST type))
- {
- log_error1 ("Can not create new xml attribute");
- return NULL;
- }
- }
+ if (type) {
+ if (!xmlNewProp(newnode, BAD_CAST "xsi:type", BAD_CAST type)) {
+ log_error1("Can not create new xml attribute");
+ return NULL;
+ }
+ }
- return newnode;
+ return newnode;
}
xmlNodePtr
-soap_env_add_itemf (SoapEnv * call, const char *type,
- const char *name, const char *format, ...)
+soap_env_add_itemf(SoapEnv *call, const char *type,
+ const char *name, const char *format, ...)
{
- va_list ap;
- char buffer[1054];
+ va_list ap;
+ char buffer[1054];
- va_start (ap, format);
- vsprintf (buffer, format, ap);
- va_end (ap);
+ va_start(ap, format);
+ vsprintf(buffer, format, ap);
+ va_end(ap);
- return soap_env_add_item (call, type, name, buffer);
+ return soap_env_add_item(call, type, name, buffer);
}
void
-soap_env_add_custom (SoapEnv * call, void *obj, XmlSerializerCallback cb,
- const char *type, const char *name)
+soap_env_add_custom(SoapEnv *call, void *obj, XmlSerializerCallback cb,
+ const char *type, const char *name)
{
- struct XmlNodeHolder holder;
+ struct XmlNodeHolder holder;
- holder.node = soap_env_get_method (call);
+ holder.node = soap_env_get_method(call);
- cb (obj, BAD_CAST name,
- xmlbuilder_start_element,
- xmlbuilder_characters, xmlbuilder_end_element, &holder);
+ cb(obj, BAD_CAST name,
+ xmlbuilder_start_element,
+ xmlbuilder_characters,
+ xmlbuilder_end_element, &holder);
}
xmlNodePtr
-soap_env_push_item (SoapEnv * call, const char *type, const char *name)
+soap_env_push_item(SoapEnv *call, const char *type,
+ const char *name)
{
- xmlNodePtr node;
+ xmlNodePtr node;
- node = soap_env_add_item (call, type, name, "");
+ node = soap_env_add_item(call, type, name, "");
- if (node)
- {
- call->cur = node;
- }
+ if (node) {
+ call->cur = node;
+ }
- return node;
+ return node;
}
void
-soap_env_pop_item (SoapEnv * call)
+soap_env_pop_item(SoapEnv *call)
{
- call->cur = call->cur->parent;
+ call->cur = call->cur->parent;
}
-void
-soap_env_free (SoapEnv * env)
+void soap_env_free(SoapEnv *env)
{
- if (env)
- {
- if (env->root)
- {
- xmlFreeDoc (env->root->doc);
- }
- free (env);
- }
+ if (env) {
+ if (env->root) {
+ xmlFreeDoc(env->root->doc);
+ }
+ free(env);
+ }
}
-SoapEnv *
-soap_env_new_from_doc (xmlDocPtr doc)
+SoapEnv *soap_env_new_from_doc(xmlDocPtr doc)
{
- SoapEnv *env;
- xmlNodePtr node;
-
- if (doc == NULL)
- {
- log_error1 ("Can not create xml document!");
- return NULL;
- }
-
- node = xmlDocGetRootElement (doc);
- if (node == NULL)
- {
- log_error1 ("xml document is empty!");
- return NULL;
- }
-
- env = (SoapEnv *) malloc (sizeof (SoapEnv));
-
- /* set root */
- env->root = node;
-
- /* set method root
- set call->cur (current node) to <method>.
- xpath: //Envelope/Body/
- */
- node = soap_xml_get_children (env->root);
- env->cur = soap_xml_get_children (node);
-
- return env;
+ SoapEnv *env;
+ xmlNodePtr node;
+
+ if (doc == NULL) {
+ log_error1("Can not create xml document!");
+ return NULL;
+ }
+
+ node = xmlDocGetRootElement(doc);
+ if (node == NULL) {
+ log_error1("xml document is empty!");
+ return NULL;
+ }
+
+ env = (SoapEnv*)malloc(sizeof(SoapEnv));
+
+ /* set root */
+ env->root = node;
+
+ /* set method root
+ set call->cur (current node) to <method>.
+ xpath: //Envelope/Body/
+ */
+ node = soap_xml_get_children(env->root);
+ env->cur = soap_xml_get_children(node);
+
+ return env;
}
-SoapEnv *
-soap_env_new_from_buffer (const char *buffer)
+SoapEnv *soap_env_new_from_buffer(const char* buffer)
{
- xmlDocPtr doc;
- SoapEnv *env;
+ xmlDocPtr doc;
+ SoapEnv *env;
- if (buffer == NULL)
- return NULL;
+ if (buffer == NULL) return NULL;
- doc = xmlParseDoc (BAD_CAST buffer);
- if (doc == NULL)
- return NULL;
+ doc = xmlParseDoc(BAD_CAST buffer);
+ if (doc == NULL) return NULL;
- env = soap_env_new_from_doc (doc);
- if (env == NULL)
- {
- xmlFreeDoc (doc);
- return NULL;
- }
+ env = soap_env_new_from_doc(doc);
+ if (env == NULL) {
+ xmlFreeDoc(doc);
+ return NULL;
+ }
- return env;
+ return env;
}
xmlNodePtr
-soap_env_get_body (SoapEnv * env)
+soap_env_get_body(SoapEnv* env)
{
- xmlNodePtr node;
-
- if (env == NULL)
- {
- log_error1 ("env object is NULL");
- return NULL;
- }
-
- if (env->root == NULL)
- {
- log_error1 ("env has no xml");
- return NULL;
- }
-
- node = soap_xml_get_children (env->root);
-
- while (node != NULL)
- {
- if (!xmlStrcmp (node->name, BAD_CAST "Body"))
- return node;
- node = soap_xml_get_next (node);
- }
-
- log_error1 ("Node Body tag found!");
- return NULL;
+ xmlNodePtr node;
+
+ if (env == NULL) {
+ log_error1("env object is NULL");
+ return NULL;
+ }
+
+ if (env->root == NULL) {
+ log_error1("env has no xml");
+ return NULL;
+ }
+
+ node = soap_xml_get_children(env->root);
+
+ while (node != NULL) {
+ if (!xmlStrcmp(node->name, BAD_CAST "Body"))
+ return node;
+ node = soap_xml_get_next(node);
+ }
+
+ log_error1("Node Body tag found!");
+ return NULL;
}
xmlNodePtr
-soap_env_get_method (SoapEnv * env)
+soap_env_get_method(SoapEnv* env)
{
- xmlNodePtr body;
+ xmlNodePtr body;
- body = soap_env_get_body (env);
- if (body == NULL)
- {
- log_verbose1 ("body is NULL");
- return NULL;
- }
+ body = soap_env_get_body(env);
+ if (body == NULL) {
+ log_verbose1("body is NULL");
+ return NULL;
+ }
- /* mehtod is the first child */
- return soap_xml_get_children (body);
+ /* mehtod is the first child */
+ return soap_xml_get_children(body);
}
xmlNodePtr
-_soap_env_get_body (SoapEnv * env)
+_soap_env_get_body(SoapEnv* env)
{
- xmlNodePtr body;
- xmlNodeSetPtr nodeset;
- xmlXPathObjectPtr xpathobj;
-
- if (env == NULL)
- {
- log_error1 ("env object is NULL");
- return NULL;
- }
-
- if (env->root == NULL)
- {
- log_error1 ("env has no xml");
- return NULL;
- }
-
- /*
- find <Body> tag find out namespace
- xpath: //Envelope/Body/
- */
- xpathobj = soap_xpath_eval (env->root->doc, "//Envelope/Body");
-
- if (!xpathobj)
- {
- log_error1 ("No Body (xpathobj)!");
- return NULL;
- }
-
- nodeset = xpathobj->nodesetval;
- if (!nodeset)
- {
- log_error1 ("No Body (nodeset)!");
- xmlXPathFreeObject (xpathobj);
- return NULL;
- }
-
- if (nodeset->nodeNr < 1)
- {
- log_error1 ("No Body (nodeNr)!");
- xmlXPathFreeObject (xpathobj);
- return NULL;
- }
-
- body = nodeset->nodeTab[0]; /* body is <Body> */
- xmlXPathFreeObject (xpathobj);
- return body;
+ xmlNodePtr body;
+ xmlNodeSetPtr nodeset;
+ xmlXPathObjectPtr xpathobj;
+
+ if (env == NULL) {
+ log_error1("env object is NULL");
+ return NULL;
+ }
+
+ if (env->root == NULL) {
+ log_error1("env has no xml");
+ return NULL;
+ }
+
+ /*
+ find <Body> tag find out namespace
+ xpath: //Envelope/Body/
+ */
+ xpathobj = soap_xpath_eval(env->root->doc, "//Envelope/Body");
+
+ if (!xpathobj) {
+ log_error1("No Body (xpathobj)!");
+ return NULL;
+ }
+
+ nodeset = xpathobj->nodesetval;
+ if (!nodeset) {
+ log_error1("No Body (nodeset)!");
+ xmlXPathFreeObject(xpathobj);
+ return NULL;
+ }
+
+ if (nodeset->nodeNr < 1) {
+ log_error1("No Body (nodeNr)!");
+ xmlXPathFreeObject(xpathobj);
+ return NULL;
+ }
+
+ body = nodeset->nodeTab[0]; /* body is <Body> */
+ xmlXPathFreeObject(xpathobj);
+ return body;
}
-int
-soap_env_find_urn (SoapEnv * env, char *urn)
+int soap_env_find_urn(SoapEnv *env, char *urn)
{
- xmlNsPtr ns;
- xmlNodePtr body, node;
-
- body = soap_env_get_body (env);
- if (body == NULL)
- {
- log_verbose1 ("body is NULL");
- return 0;
- }
-
- /* node is the first child */
- node = soap_xml_get_children (body);
-
- if (node == NULL)
- {
- log_error1 ("No namespace found");
- return 0;
- }
-
- if (node->ns && node->ns->prefix)
- {
- ns = xmlSearchNs (body->doc, node, node->ns->prefix);
- if (ns != NULL)
- {
- strcpy (urn, (char *) ns->href);
- return 1; /* namespace found! */
- }
- }
-
- log_error1 ("No namespace found. Returning 0");
- return 0;
+ xmlNsPtr ns;
+ xmlNodePtr body, node;
+
+ body = soap_env_get_body(env);
+ if (body == NULL) {
+ log_verbose1("body is NULL");
+ return 0;
+ }
+
+ /* node is the first child */
+ node = soap_xml_get_children(body);
+
+ if (node == NULL) {
+ log_error1("No namespace found");
+ return 0;
+ }
+
+ if (node->ns && node->ns->prefix) {
+ ns = xmlSearchNs(body->doc, node, node->ns->prefix);
+ if (ns != NULL) {
+ strcpy(urn, (char*)ns->href);
+ return 1; /* namespace found! */
+ }
+ }
+
+ log_error1("No namespace found. Returning 0");
+ return 0;
}
-int
-soap_env_find_methodname (SoapEnv * env, char *method)
+int soap_env_find_methodname(SoapEnv *env, char *method)
{
- xmlNodePtr body, node;
+ xmlNodePtr body, node;
- body = soap_env_get_body (env);
- if (body == NULL)
- return 0;
+ body = soap_env_get_body(env);
+ if (body == NULL) return 0;
- node = soap_xml_get_children (body); /* node is the first child */
+ node = soap_xml_get_children(body); /* node is the first child */
- if (node == NULL)
- {
- log_error1 ("No method found");
- return 0;
- }
+ if (node == NULL) {
+ log_error1("No method found");
+ return 0;
+ }
- if (node->name == NULL)
- {
- log_error1 ("No methodname found");
- return 0;
+ if (node->name == NULL) {
+ log_error1("No methodname found");
+ return 0;
- }
+ }
- strcpy (method, (const char *) node->name);
+ strcpy(method, (const char *)node->name);
- return 1;
+ return 1;
}
@@ -481,51 +454,43 @@ soap_env_find_methodname (SoapEnv * env, char *method)
/* ------------------------------------------------------------------ */
-static void
-xmlbuilder_start_element (const xmlChar * element_name, int attr_count,
- xmlChar ** keys, xmlChar ** values, void *userData)
+static
+void xmlbuilder_start_element(const xmlChar* element_name, int attr_count, xmlChar **keys, xmlChar **values, void* userData)
{
- struct XmlNodeHolder *holder = (struct XmlNodeHolder *) userData;
- xmlNodePtr parent = NULL;
+ struct XmlNodeHolder *holder = (struct XmlNodeHolder*)userData;
+ xmlNodePtr parent = NULL;
- if (holder == NULL)
- return;
- parent = holder->node;
- if (parent == NULL)
- return;
+ if (holder == NULL) return;
+ parent = holder->node;
+ if (parent == NULL) return;
- holder->node = xmlNewChild (parent, NULL, element_name, NULL);
+ holder->node = xmlNewChild(parent, NULL, element_name, NULL);
}
-static void
-xmlbuilder_characters (const xmlChar * element_name, const xmlChar * chars,
- void *userData)
+static
+void xmlbuilder_characters(const xmlChar* element_name, const xmlChar* chars, void* userData)
{
- struct XmlNodeHolder *holder = (struct XmlNodeHolder *) userData;
- xmlNodePtr parent = NULL;
+ struct XmlNodeHolder *holder = (struct XmlNodeHolder*)userData;
+ xmlNodePtr parent = NULL;
- if (holder == NULL)
- return;
- parent = holder->node;
- if (parent == NULL)
- return;
+ if (holder == NULL) return;
+ parent = holder->node;
+ if (parent == NULL) return;
- xmlNewTextChild (parent, NULL, element_name, chars);
+ xmlNewTextChild(parent, NULL, element_name, chars);
}
-static void
-xmlbuilder_end_element (const xmlChar * element_name, void *userData)
+static
+void xmlbuilder_end_element(const xmlChar * element_name, void* userData)
{
- struct XmlNodeHolder *holder = (struct XmlNodeHolder *) userData;
- xmlNodePtr parent = NULL;
+ struct XmlNodeHolder *holder = (struct XmlNodeHolder*)userData;
+ xmlNodePtr parent = NULL;
- if (holder == NULL)
- return;
- parent = holder->node;
- if (parent == NULL)
- return;
+ if (holder == NULL) return;
+ parent = holder->node;
+ if (parent == NULL) return;
- holder->node = parent->parent;
+ holder->node = parent->parent;
}