diff options
-rw-r--r-- | libcsoap/soap-env.c | 633 |
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; } |