From edef31d0626a510400b9025c559c7d46fb036514 Mon Sep 17 00:00:00 2001 From: snowdrop Date: Tue, 8 Jun 2004 12:54:09 +0000 Subject: added soap_env_add_custom() --- libcsoap/Makefile.am | 2 +- libcsoap/soap-env.c | 103 +++++++++++++++++++++++++++++++++++++++++++++------ libcsoap/soap-env.h | 27 +++++++++++++- 3 files changed, 119 insertions(+), 13 deletions(-) diff --git a/libcsoap/Makefile.am b/libcsoap/Makefile.am index bccb8f9..4bb9415 100644 --- a/libcsoap/Makefile.am +++ b/libcsoap/Makefile.am @@ -26,7 +26,7 @@ INCLUDES = -I$(top_srcdir) $(LIBXML_CFLAGS) lib_LTLIBRARIES= libcsoap-1.0.la libcsoap_1_0_la_SOURCES= $(h_sources) $(cc_sources) #libexamplelib_1_0_la_LIBADD= sub/libsub.la -libcsoap_1_0_la_LDFLAGS= -version-info $(GENERIC_LIBRARY_VERSION) -release $(GENERIC_RELEASE) -L$(top_builddir)/nanohttp -lnanohttp-$(GENERIC_API_VERSION) +libcsoap_1_0_la_LDFLAGS= -version-info $(GENERIC_LIBRARY_VERSION) -release $(GENERIC_RELEASE) -L$(top_builddir)/nanohttp -lnanohttp-$(GENERIC_API_VERSION) $(LIBXML_LIBS) #libcsoap_1_0_la_CFLAGS= @LIBXML_CCFLAGS@ diff --git a/libcsoap/soap-env.c b/libcsoap/soap-env.c index 265295b..1e5c8dc 100644 --- a/libcsoap/soap-env.c +++ b/libcsoap/soap-env.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-env.c,v 1.2 2004/02/03 08:59:22 snowdrop Exp $ + * $Id: soap-env.c,v 1.3 2004/06/08 12:54:09 snowdrop Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -23,7 +23,7 @@ ******************************************************************/ #include #include - +#include static char *soap_env_ns = "http://schemas.xmlsoap.org/soap/envelope/"; static char *soap_env_enc = "http://schemas.xmlsoap.org/soap/encoding/"; @@ -51,6 +51,23 @@ static char *soap_xsd_ns = "http://www.w3.org/1999/XMLSchema"; "" +/* ---------------------------------------------------------------------------- */ +/* XML Serializers (implemented at the and of this document) */ +/* ---------------------------------------------------------------------------- */ +struct XmlNodeHolder { xmlNodePtr node; }; + +static +void xmlbuilder_start_element(const char* element_name, int attr_count, + char **keys, char **values, void* userData); + +static +void xmlbuilder_characters(const char* element_name, + const char* chars, void* userData); + +static +void xmlbuilder_end_element(const char* element_name, void* userData); + +/* ---------------------------------------------------------------------------- */ SoapEnv *soap_env_new_with_fault(fault_code_t faultcode, const char *faultstring, @@ -99,8 +116,7 @@ SoapEnv *soap_env_new_with_response(SoapEnv* request) SoapEnv *soap_env_new_with_method(const char *urn, const char *method) { - xmlNodePtr env; - xmlNodePtr node; + xmlDocPtr env; SoapEnv *call; char buffer[1054]; @@ -152,7 +168,6 @@ soap_env_add_itemf(SoapEnv *call, const char *type, va_list ap; char buffer[1054]; - xmlNodePtr newnode; va_start(ap, format); @@ -163,6 +178,22 @@ soap_env_add_itemf(SoapEnv *call, const char *type, } +void +soap_env_add_custom(SoapEnv *call, void *obj, XmlSerializerCallback cb, + const char *type, const char *name) +{ + struct XmlNodeHolder holder; + + holder.node = soap_env_get_method(call); + + cb(obj, name, + xmlbuilder_start_element, + xmlbuilder_characters, + xmlbuilder_end_element, &holder); + +} + + xmlNodePtr soap_env_push_item(SoapEnv *call, const char *type, const char *name) @@ -238,7 +269,7 @@ SoapEnv *soap_env_new_from_buffer(const char* buffer) if (buffer == NULL) return NULL; - doc = xmlParseDoc(buffer); + doc = xmlParseDoc((xmlChar*)buffer); if (doc == NULL) return NULL; env = soap_env_new_from_doc(doc); @@ -300,11 +331,9 @@ soap_env_get_method(SoapEnv* env) xmlNodePtr _soap_env_get_body(SoapEnv* env) { - xmlNodePtr node, body; + xmlNodePtr body; xmlNodeSetPtr nodeset; xmlXPathObjectPtr xpathobj; - char *urn; - char methodname[150]; if (env == NULL) { log_error1("env object is NULL"); @@ -330,17 +359,20 @@ _soap_env_get_body(SoapEnv* env) nodeset = xpathobj->nodesetval; if (!nodeset) { log_error1("No Body (nodeset)!"); + xmlXPathFreeObject(xpathobj); return NULL; } if (nodeset->nodeNr < 1) { log_error1("No Body (nodeNr)!"); - xmlXPathFreeObject(nodeset); + xmlXPathFreeNodeSet (nodeset); + xmlXPathFreeObject(xpathobj); return NULL; } body = nodeset->nodeTab[0]; /* body is */ - xmlXPathFreeObject(nodeset); + xmlXPathFreeNodeSet (nodeset); + xmlXPathFreeObject(xpathobj); return body; } @@ -402,3 +434,52 @@ int soap_env_find_methodname(SoapEnv *env, char *method) return 1; } + + + +/* ------------------------------------------------------------------ */ +/* XML serializers */ +/* ------------------------------------------------------------------ */ + + +static +void xmlbuilder_start_element(const char* element_name, int attr_count, char **keys, char **values, void* userData) +{ + struct XmlNodeHolder *holder = (struct XmlNodeHolder*)userData; + xmlNodePtr parent = NULL; + + if (holder == NULL) return; + parent = holder->node; + if (parent == NULL) return; + + holder->node = xmlNewChild(parent, NULL, element_name, NULL); + +} + +static +void xmlbuilder_characters(const char* element_name, const char* chars, void* userData) +{ + struct XmlNodeHolder *holder = (struct XmlNodeHolder*)userData; + xmlNodePtr parent = NULL; + + if (holder == NULL) return; + parent = holder->node; + if (parent == NULL) return; + + xmlNewTextChild(parent, NULL, element_name, chars); +} + +static +void xmlbuilder_end_element(const char* element_name, void* userData) +{ + + struct XmlNodeHolder *holder = (struct XmlNodeHolder*)userData; + xmlNodePtr parent = NULL; + + if (holder == NULL) return; + parent = holder->node; + if (parent == NULL) return; + + holder->node = parent->parent; +} + diff --git a/libcsoap/soap-env.h b/libcsoap/soap-env.h index 5cb0f57..5f29c14 100644 --- a/libcsoap/soap-env.h +++ b/libcsoap/soap-env.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-env.h,v 1.4 2004/05/14 09:27:52 snowdrop Exp $ + * $Id: soap-env.h,v 1.5 2004/06/08 12:54:09 snowdrop Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -158,6 +158,17 @@ SoapEnv *soap_env_new_from_doc(xmlDocPtr doc); SoapEnv *soap_env_new_from_buffer(const char* buffer); +/* --------------------------------------------------- */ +/* XML Serializer functions and typedefs */ +/* --------------------------------------------------- */ + +typedef void (*XmlSerializerCallback) + (void* /*obj*/, const char * /*root_element_name*/, + void (*OnStartElement)(const char* element_name, int attr_count, char **keys, char **values, void* userData), + void (*OnCharacters)(const char* element_name, const char* chars, void* userData), + void (*OnEndElement)(const char* element_name, void* userData), + void* /* userdata*/); + /* ------------------------------------------------------ */ /* XML build and stack function */ @@ -186,6 +197,17 @@ soap_env_add_item(SoapEnv* env, const char *type, const char *name, const char *value); +/** + Serialize and adds obj to the envelope. + TODO: Document this function ! +
+ Important: + + */ +void +soap_env_add_custom(SoapEnv* env, void *obj, XmlSerializerCallback cb, + const char *type, const char *name); + /** Same as soap_env_add_item() with c style arguments like in printf(). "value" is the format string. @@ -284,6 +306,9 @@ int soap_env_find_methodname(SoapEnv *env, char *methodname); + + + #endif -- cgit v1.1-32-gdbae