diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/csoap.c | 37 | ||||
-rw-r--r-- | src/csoap.h | 55 | ||||
-rw-r--r-- | src/csoapbody.c | 96 | ||||
-rw-r--r-- | src/csoapbody.h | 58 | ||||
-rw-r--r-- | src/csoapcall.c | 225 | ||||
-rw-r--r-- | src/csoapcall.h | 90 | ||||
-rw-r--r-- | src/csoapenv.c | 168 | ||||
-rw-r--r-- | src/csoapenv.h | 86 | ||||
-rw-r--r-- | src/csoaperror.h | 47 | ||||
-rw-r--r-- | src/csoapfault.c | 140 | ||||
-rw-r--r-- | src/csoapfault.h | 124 | ||||
-rw-r--r-- | src/csoaphttp.c | 153 | ||||
-rw-r--r-- | src/csoaphttp.h | 45 | ||||
-rw-r--r-- | src/csoaplog.c | 65 | ||||
-rw-r--r-- | src/csoaplog.h | 26 | ||||
-rw-r--r-- | src/csoapmethod.c | 70 | ||||
-rw-r--r-- | src/csoapmethod.h | 56 | ||||
-rw-r--r-- | src/csoapparam.c | 384 | ||||
-rw-r--r-- | src/csoapparam.h | 187 | ||||
-rw-r--r-- | src/csoapres.c | 154 | ||||
-rw-r--r-- | src/csoapres.h | 90 | ||||
-rw-r--r-- | src/csoapsocket.c | 154 | ||||
-rw-r--r-- | src/csoapsocket.h | 81 | ||||
-rw-r--r-- | src/csoaptypes.h | 33 | ||||
-rw-r--r-- | src/csoapurl.c | 185 | ||||
-rw-r--r-- | src/csoapurl.h | 70 | ||||
-rw-r--r-- | src/csoapxml.c | 151 | ||||
-rw-r--r-- | src/csoapxml.h | 90 |
28 files changed, 3120 insertions, 0 deletions
diff --git a/src/csoap.c b/src/csoap.c new file mode 100644 index 0000000..c880111 --- /dev/null +++ b/src/csoap.c @@ -0,0 +1,37 @@ +/****************************************************************** + * $Id: csoap.c,v 1.1 2003/03/25 22:17:18 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoap.h" + +#include "csoapxml.h" + + +/*----------------------------------------------------------------- + FUNCTION: SoapFreeStr +/-----------------------------------------------------------------*/ + +void SoapFreeStr(char* str) +{ + if (str) xmlFree(str); +} + diff --git a/src/csoap.h b/src/csoap.h new file mode 100644 index 0000000..6022265 --- /dev/null +++ b/src/csoap.h @@ -0,0 +1,55 @@ +/****************************************************************** + * $Id: csoap.h,v 1.1 2003/03/25 22:17:18 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_H +#define CSOAP_H + + +/* Include csoap headers */ +#include "csoapcall.h" +#include "csoapfault.h" +#include "csoapurl.h" +#include "csoaptypes.h" + +/** + * Initialize routine. Must be called before any + * other csoap API function. + * + * @param argc command line parameter + * @param argv command line parameter + * + * @return CSOAP_OK if successfull. + */ +int SoapInit(int argc, char *argv[]); + + +/** + * Free a string allocated by a csoap + * function. + * + * @param str the string to free + */ +void SoapFreeStr(char* str); + + +#endif diff --git a/src/csoapbody.c b/src/csoapbody.c new file mode 100644 index 0000000..8fb35bd --- /dev/null +++ b/src/csoapbody.c @@ -0,0 +1,96 @@ +/****************************************************************** + * $Id: csoapbody.c,v 1.1 2003/03/25 22:17:18 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapbody.h" +#include "csoaplog.h" + + +/*----------------------------------------------------------------- + FUNCTION: SoapBodyGetMethod +/-----------------------------------------------------------------*/ + +HSOAPMETHOD SoapBodyGetMethod(HSOAPBODY body, const char* method) +{ + HSOAPXML node; + const char* FUNC = "SoapBodyGetMethod"; + SoapTraceEnter(FUNC,"Method = %s", method); + + if (body == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid body (null)"); + return NULL; + } + + SoapLog(LOG_DEBUG, FUNC, "Searching method '%s'", method); + + node = SoapXmlFindNode((HSOAPXML)body, method); + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "Can not find method"); + return NULL; + } +/* + cur = ((xmlNodePtr)body)->xmlChildrenNode; + while (cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar*)method)) { + SoapTraceLeave(FUNC, "Found method (%p)", cur); + return (HSOAPMETHOD)cur; + } + cur = cur->next; + } +*/ + SoapTraceLeave(FUNC, "Method (%p)", node); + return node; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapBodyGetFault +/-----------------------------------------------------------------*/ + +HSOAPFAULT SoapBodyGetFault(HSOAPBODY body) +{ + HSOAPXML node; + const char* FUNC = "SoapBodyGetFault"; + SoapTraceEnter(FUNC,"Body (%p)", body); + + if (body == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid body (null)"); + return NULL; + } + +/* + cur = ((xmlNodePtr)body)->xmlChildrenNode; + while (cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar*)"Fault")) { + SoapTraceLeave(FUNC, "Found fault (%p)", cur); + return (HSOAPFAULT)cur; + } + cur = cur->next; + } +*/ + + node = SoapXmlFindNode((HSOAPXML)body, "Fault"); + SoapTraceLeave(FUNC, "Fault (%p)", node); + return node; +} diff --git a/src/csoapbody.h b/src/csoapbody.h new file mode 100644 index 0000000..619c2c4 --- /dev/null +++ b/src/csoapbody.h @@ -0,0 +1,58 @@ +/****************************************************************** + * $Id: csoapbody.h,v 1.1 2003/03/25 22:17:18 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_BODY_H +#define CSOAP_BODY_H + +#include "csoapmethod.h" +#include "csoapfault.h" + +typedef HSOAPXML HSOAPBODY; + + + +/** + * Returns the method object assigned to + * the given body. + * + * @param body handle to the body object + * @param method the method(operation) name + * to call. + * + * @return a handle to the method object or + * NULL if the the method was not found. + */ +HSOAPMETHOD SoapBodyGetMethod(HSOAPBODY body, const char *method); + + +/** + * Returns the fault object if any exist. + * + * @param body handle to the body object + * @return a handle to a fault object or + * NULL if no fault was generated. + */ +HSOAPFAULT SoapBodyGetFault(HSOAPBODY body); + + +#endif diff --git a/src/csoapcall.c b/src/csoapcall.c new file mode 100644 index 0000000..aa211c1 --- /dev/null +++ b/src/csoapcall.c @@ -0,0 +1,225 @@ +/****************************************************************** + * $Id: csoapcall.c,v 1.1 2003/03/25 22:17:19 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapcall.h" +#include "csoaplog.h" +#include "csoaphttp.h" + +#include <stdarg.h> + + +HSOAPCALL SoapCallCreate( + const char* url, + const char* uri, + const char* method) +{ + const char *FUNC = "SoapCallCreate"; + HSOAPCALL call; + + SoapTraceEnter(FUNC, "url=%s;uri=%s;method=%s", + url, uri, method); + call = (HSOAPCALL)malloc(sizeof(struct SOAPCALL)); + call->m_method = (char*)malloc(strlen(method)+1); + + call->m_env = SoapEnvCreate(uri, method); + call->m_url = SoapUrlCreate(url); + strcpy(call->m_method, method); + + SoapTraceLeave(FUNC, "call (%p)", call); + return call; +} + + +HSOAPPARAM SoapCallAddParam( + HSOAPCALL call, + const char* name, + const char* type, + const char* format, + ...) +{ + const char *FUNC = "SoapCallAddParam"; + HSOAPBODY body; + HSOAPMETHOD method; + HSOAPPARAM param, result; + va_list ap; + char buffer[SOAP_MAX_STRING_BUFFER]; + + SoapTraceEnter(FUNC, "name=%s;type=%s;format=%s", + name, type, format); + + va_start(ap, format); + vsprintf(buffer, format, ap); + va_end(ap); + + body = SoapEnvGetBody(call->m_env); + method = SoapBodyGetMethod(body, call->m_method); + param = SoapMethodParamContext(method); + result = SoapParamCreate(param, type, NULL, name, "%s", buffer); + + SoapTraceLeave(FUNC, "created param (%p)", result); + return result; +} + + +HSOAPPARAM SoapCallAddStringParam( + HSOAPCALL call, + const char* name, + const char* format, + ...) +{ + const char *FUNC = "SoapCallAddStringParam"; + HSOAPBODY body; + HSOAPMETHOD method; + HSOAPPARAM param, result; + va_list ap; + char buffer[SOAP_MAX_STRING_BUFFER]; + + SoapTraceEnter(FUNC, "name=%s;format=%s", + name, format); + + va_start(ap, format); + vsprintf(buffer, format, ap); + va_end(ap); + + body = SoapEnvGetBody(call->m_env); + method = SoapBodyGetMethod(body, call->m_method); + param = SoapMethodParamContext(method); + result = SoapParamCreateString(param, name, buffer); + SoapTraceLeave(FUNC, "created param (%p)", result); + return result; +} + + +HSOAPPARAM SoapCallAddIntParam( + HSOAPCALL call, + const char* name, + int value) +{ + const char *FUNC = "SoapCallAddIntParam"; + HSOAPBODY body; + HSOAPMETHOD method; + HSOAPPARAM param, result; + + SoapTraceEnter(FUNC, "name=%s;value=%d", + name, value); + + body = SoapEnvGetBody(call->m_env); + method = SoapBodyGetMethod(body, call->m_method); + param = SoapMethodParamContext(method); + result = SoapParamCreateInt(param, name, value); + SoapTraceLeave(FUNC, "created param (%p)", result); + return result; +} + +HSOAPPARAM SoapCallAddDoubleParam( + HSOAPCALL call, + const char* name, + double value) +{ + const char *FUNC = "SoapCallAddDoubleParam"; + HSOAPBODY body; + HSOAPMETHOD method; + HSOAPPARAM param, result; + + SoapTraceEnter(FUNC, "name=%s;value=%f", + name, value); + + body = SoapEnvGetBody(call->m_env); + method = SoapBodyGetMethod(body, call->m_method); + param = SoapMethodParamContext(method); + result = SoapParamCreateDouble(param, name, value); + SoapTraceLeave(FUNC, "created param (%p)", result); + return result; +} + + +HSOAPRES SoapCallInvoke(HSOAPCALL call) +{ + const char* FUNC = "SoapCallInvoke"; + SoapTraceEnter(FUNC,"%p", call); + const char* filename = "csoap-client.xml"; + char *buf; + CSOAP_STATUS status; + HSOAPENV env; + HSOAPRES res; + + if (!call) { + SoapTraceLeaveWithError(FUNC, "Call is null!"); + return NULL; + } + + if (!call->m_env) { + SoapTraceLeaveWithError(FUNC, "Invalid envelope!"); + return NULL; + } + + if (!call->m_url) { + SoapTraceLeaveWithError(FUNC, "Invalid URL"); + return NULL; + } + +/* xmlSaveFormatFile(filename, ((xmlNodePtr)call->m_env)->doc, 1); + buffer = xmlBufferCreate(); + xmlNodeDump(buffer, ((xmlNodePtr)call->m_env)->doc, + (xmlNodePtr)call->m_env, 1 ,2); + printf("\n%s\n", (const char*)xmlBufferContent(buffer)); + xmlBufferFree(buffer); +*/ + + printf("Sending ...\n"); + status = SoapHttpSend(call->m_url, call->m_env, &env); + if (status != CSOAP_OK) { + printf("can not send. code = %d\n", status); + } + printf("Sending finished\n"); + /* + printf("Length: %d\nResponse: \n%s\n\n\r", strlen(buf), buf?buf:"null"); + */ + SoapEnvDump(env); + /* free(buf);*/ + /* SoapEnvFree(env);*/ + res = SoapResCreate(env, call->m_method); + SoapTraceLeave(FUNC, "res (%p)", res); + return res; +} + + +void SoapCallFree(HSOAPCALL call) +{ + const char* FUNC = "SoapCallFree"; + SoapTraceEnter(FUNC,"%p", call); + + if (!call) { + SoapTraceLeave(FUNC, "Call is null!"); + return; + } + + SoapEnvFree(call->m_env); + + if (call->m_url) SoapUrlFree(call->m_url); + if (call->m_method) free(call->m_method); + + free(call); + SoapTraceLeave(FUNC, "Call destroyed"); +} + diff --git a/src/csoapcall.h b/src/csoapcall.h new file mode 100644 index 0000000..eba568b --- /dev/null +++ b/src/csoapcall.h @@ -0,0 +1,90 @@ +/****************************************************************** + * $Id: csoapcall.h,v 1.1 2003/03/25 22:17:19 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_CALL_H +#define CSOAP_CALL_H + +#include "csoapparam.h" +#include "csoapres.h" +#include "csoapenv.h" +#include "csoapurl.h" + +typedef struct SOAPCALL* HSOAPCALL; + + +/** + * Stores information to + * send a soap call + */ +struct SOAPCALL +{ + HSOAPENV m_env; /* The soap envelope */ + HSOAPURL m_url; /* The target URL */ + char* m_method; /* The method to to call */ +}; + + +HSOAPCALL SoapCallCreate( + const char* url, + const char* uri, + const char* method +); + + +HSOAPPARAM SoapCallAddParam( + HSOAPCALL call, + const char* name, + const char* type, + const char* format, + ... +); + + +HSOAPPARAM SoapCallAddStringParam( + HSOAPCALL call, + const char* name, + const char* format, + ... +); + + +HSOAPPARAM SoapCallAddIntParam( + HSOAPCALL call, + const char* name, + int value +); + + +HSOAPPARAM SoapCallAddDoubleParam( + HSOAPCALL call, + const char* name, + double value +); + + +HSOAPRES SoapCallInvoke(HSOAPCALL call); + +void SoapCallFree(HSOAPCALL call); + + +#endif diff --git a/src/csoapenv.c b/src/csoapenv.c new file mode 100644 index 0000000..90bcbac --- /dev/null +++ b/src/csoapenv.c @@ -0,0 +1,168 @@ +/****************************************************************** + * $Id: csoapenv.c,v 1.1 2003/03/25 22:17:19 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapenv.h" +#include "csoaplog.h" + +static char *soap_env_ns = "http://schemas.xmlsoap.org/soap/envelope/"; +static char *soap_env_enc = "http://schemas.xmlsoap.org/soap/encoding/"; +static char *soap_xsi_ns = "http://www.w3.org/1999/XMLSchema-instance"; +static char *soap_xsd_ns = "http://www.w3.org/1999/XMLSchema"; + +/* + Parameters: + 1- soap_env_ns + 2- soap_env_enc + 3- xsi_ns + 4- xsd_ns + 3- method name + 4- uri + 5- method name(again) + */ +#define SOAP_MSG_TEMPLATE \ + "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"%s\" SOAP-ENV:encoding=\"%s\"" \ + " xmlns:xsi=\"%s\"" \ + " xmlns:xsd=\"%s\">" \ + " <SOAP-ENV:Body>"\ + " <m:%s xmlns:m=\"%s\">"\ + " </m:%s>" \ + " </SOAP-ENV:Body>"\ + "</SOAP-ENV:Envelope>" + + + +/*----------------------------------------------------------------- + FUNCTION: SoapEnvCreate +/-----------------------------------------------------------------*/ + +HSOAPENV SoapEnvCreate(const char *uri, const char *method) +{ + xmlDocPtr env; + xmlNodePtr node; + char buffer[1054]; + + const char* FUNC = "SoapEnvCreate"; + + SoapTraceEnter( FUNC, + "URI = '%s'\nMethod = '%s'", + uri, method); + + sprintf(buffer, SOAP_MSG_TEMPLATE, + soap_env_ns, soap_env_enc, soap_xsi_ns, + soap_xsd_ns, method, uri, method); + + env = xmlParseDoc(buffer); + if (env == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Can not create xml document!"); + return NULL; + } + + node = xmlDocGetRootElement(env); + if (node == NULL) { + SoapLog(LOG_ERROR, FUNC, + "xml document is empty!"); + return NULL; + } + + SoapLog(LOG_DEBUG, FUNC, + "Envelope created successfully"); + + SoapTraceLeave(FUNC, "Envelope: %p", node); + + return (HSOAPENV)node; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapEnvGetBody +/-----------------------------------------------------------------*/ + +HSOAPBODY SoapEnvGetBody(HSOAPENV envelope) +{ + xmlNodePtr cur; + const char* FUNC = "SoapEnvGetBody"; + SoapTraceEnter(FUNC,""); + + if (envelope == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid envelope (null)"); + return NULL; + } + + cur = ((xmlNodePtr)envelope)->xmlChildrenNode; + while (cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar*)"Body")) { + SoapTraceLeave(FUNC, "Found Body (%p)", cur); + return (HSOAPBODY)cur; + } + cur = cur->next; + } + + SoapTraceLeave(FUNC, "No body found!"); + return NULL; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapEnvFree +/-----------------------------------------------------------------*/ + +void SoapEnvFree(HSOAPENV envelope) +{ + const char* FUNC = "SoapEnvFree"; + SoapTraceEnter(FUNC,"%p", envelope); + + if (!envelope) { + SoapTraceLeave(FUNC, "Envelope is null!"); + return; + } + + xmlFreeDoc(((xmlNodePtr)envelope)->doc); + SoapTraceLeave(FUNC, "Envelope destroyed"); +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapEnvDump +/-----------------------------------------------------------------*/ + +void SoapEnvDump(HSOAPENV env) +{ + const char *FUNC = "SoapEnvDump"; + + xmlBufferPtr buffer; + xmlDocPtr doc; + char *str; + + SoapTraceEnter(FUNC, "env (%p)", env); + + buffer = xmlBufferCreate(); + xmlNodeDump(buffer, ((xmlNodePtr)env)->doc, (xmlNodePtr)env, 1 ,1); + str = (char*)xmlBufferContent(buffer); + + printf("%s\n", str?str:"null"); + + xmlBufferFree(buffer); + SoapTraceLeave(FUNC, "Leaving"); +} diff --git a/src/csoapenv.h b/src/csoapenv.h new file mode 100644 index 0000000..5455e69 --- /dev/null +++ b/src/csoapenv.h @@ -0,0 +1,86 @@ +/****************************************************************** + * $Id: csoapenv.h,v 1.1 2003/03/25 22:17:19 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_ENV_H +#define CSOAP_ENV_H + +#include "csoapxml.h" +#include "csoapbody.h" + +typedef HSOAPXML HSOAPENV; + + +/** + * Creates a new soap envelope object + * + * @param uri the URI + * @param method the method name to call + * + * @return handle to an envelope object if + * creation was successfull or NULL otherwise. + */ +HSOAPENV SoapEnvCreate(const char *uri, const char *method); + + +/** + * Creates a new soap envelope object + * + * @param uri the URI + * @param method the method name to call + * + * @return handle to an envelope object if + * creation was successfull or NULL otherwise. + */ +HSOAPENV SoapEnvCreateWithFault(const char *uri, const char *method); + + +/** + * Returns the soap body object to + * a given envelope object. + * + * @param envelope the envelope + * @return handle to a body object if + * any exist or NULL otherwise + */ +HSOAPBODY SoapEnvGetBody(HSOAPENV envelope); + + +/** + * Free a given envelope object + * + * @param envelope the envelope object + * to free + */ +void SoapEnvFree(HSOAPENV envelope); + + +/** + * Dumps an envelope object to the stdout. + * For debug puposes only. + * + * @param env the envelope object to dump + */ +void SoapEnvDump(HSOAPENV env); + + +#endif diff --git a/src/csoaperror.h b/src/csoaperror.h new file mode 100644 index 0000000..8b75291 --- /dev/null +++ b/src/csoaperror.h @@ -0,0 +1,47 @@ +/****************************************************************** + * $Id: csoaperror.h,v 1.1 2003/03/25 22:17:20 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_ERROR_H +#define CSOAP_ERROR_H + +typedef int CSOAP_STATUS; + +/* Ok status */ +#define CSOAP_OK 0 + +/* Socket related errors */ +#define ERROR_SOCKET_CAN_NOT_GET_HOSTNAME 100001 +#define ERROR_SOCKET_CAN_NOT_CONNECT 100002 +#define ERROR_SOCKET_CAN_NOT_CREATE_SOCKET 100003 +#define ERROR_SOCKET_CAN_NOT_RECEIVE 100004 +#define ERROR_SOCKET_CAN_NOT_SEND 100005 + + +/* Generic errors */ +#define ERROR_NO_MEM 110001 + + +/* xml related error */ +#define ERROR_XML_CAN_NOT_PARSE 12001 + +#endif diff --git a/src/csoapfault.c b/src/csoapfault.c new file mode 100644 index 0000000..61fe32d --- /dev/null +++ b/src/csoapfault.c @@ -0,0 +1,140 @@ +/****************************************************************** + * $Id: csoapfault.c,v 1.1 2003/03/25 22:17:20 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapfault.h" + + + +/*----------------------------------------------------------------- + FUNCTION: SoapFaultGetFaultCode +/-----------------------------------------------------------------*/ + +char* SoapFaultGetFaultCode(HSOAPFAULT fault) +{ + xmlNodePtr node; + const char *FUNC = "SoapFaultGetFaultCode"; + + SoapTraceEnter(FUNC, "Entering"); + + node = SoapXmlFindNode((HSOAPXML)fault, "faultcode"); + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "Can not find faultcode"); + return NULL; + } + + SoapTraceLeave(FUNC, "Leaving"); + return SoapXmlGetNodeValueAlloc(node); +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapFaultGetFaultString +/-----------------------------------------------------------------*/ + +char* SoapFaultGetFaultString(HSOAPFAULT fault) +{ + xmlNodePtr node; + const char *FUNC = "SoapFaultGetFaultString"; + + SoapTraceEnter(FUNC, "Entering"); + + node = SoapXmlFindNode((HSOAPXML)fault, "faultstring"); + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "Can not find faultstring"); + return NULL; + } + + SoapTraceLeave(FUNC, "Leaving"); + return SoapXmlGetNodeValueAlloc(node); +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapFaultGetFaultActor +/-----------------------------------------------------------------*/ + +char* SoapFaultGetFaultActor(HSOAPFAULT fault) +{ + xmlNodePtr node; + const char *FUNC = "SoapFaultGetFaultActor"; + + SoapTraceEnter(FUNC, "Entering"); + + node = SoapXmlFindNode((HSOAPXML)fault, "faultactor"); + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "Can not find faultactor"); + return NULL; + } + + SoapTraceLeave(FUNC, "Leaving"); + return SoapXmlGetNodeValueAlloc(node); +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapFaultGetFaultDetail +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapFaultGetDetail(HSOAPFAULT fault) +{ + xmlNodePtr node; + const char *FUNC = "SoapFaultGetFaultCode"; + + SoapTraceEnter(FUNC, "Entering"); + + node = SoapXmlFindNode((HSOAPXML)fault, "detail"); + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "Can not find detail"); + return NULL; + } + + SoapTraceLeave(FUNC, "Leaving"); + return (HSOAPPARAM)node; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapFaultPrint +/-----------------------------------------------------------------*/ + +void SoapFaultPrint(FILE* f, HSOAPFAULT fault) +{ + char *str; + + if (fault == NULL) { + fprintf(f, "Fault object is null!.\n"); + return; + } + + str = SoapFaultGetFaultCode(fault); + fprintf(f, "FaultCode: %s\n", str?str:"null"); + SoapFreeStr(str); + + str = SoapFaultGetFaultString(fault); + fprintf(f, "FaultString: %s\n", str?str:"null"); + SoapFreeStr(str); + + str = SoapFaultGetFaultActor(fault); + fprintf(f, "FaultActor: %s\n", str?str:"null"); + SoapFreeStr(str); +} diff --git a/src/csoapfault.h b/src/csoapfault.h new file mode 100644 index 0000000..3a876e7 --- /dev/null +++ b/src/csoapfault.h @@ -0,0 +1,124 @@ +/****************************************************************** + * $Id: csoapfault.h,v 1.1 2003/03/25 22:17:20 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_FAULT_H +#define CSOAP_FAULT_H + + +#include "csoapxml.h" +#include "csoapparam.h" + +typedef HSOAPXML HSOAPFAULT; + + +/** + * Returns the [faultcode] + * + * @param fault handle to a soap fault object + * @return an allocated string or NULL + * if no [faultcode] was set. + */ +char* SoapFaultGetFaultCode(HSOAPFAULT fault); + + +/** + * Returns the [faultstring] + * + * @param fault handle to a soap fault object + * @return an allocated string or NULL + * if no [faultstring] was set. + */ +char* SoapFaultGetFaultString(HSOAPFAULT fault); + + +/** + * Returns the [faultactor] + * + * @param fault handle to a soap fault object + * @return an allocated string or NULL + * if no [faultactor] was set. + */ +char* SoapFaultGetFaultActor(HSOAPFAULT fault); + + +/** + * Returns the [detail] + * + * @param fault handle to a soap fault object + * @return handle to a soap param object + */ +HSOAPPARAM SoapFaultGetDetail(HSOAPFAULT fault); + + +/** + * Sets the a [faultcode] field. + * This will be called internally. + * + * @param fault handle to a soap fault object + * @param faultcode the faultcode to set + */ +void SoapFaultSetFaultCode(HSOAPFAULT fault, const char* faultCode); + + +/** + * Sets the a [faultstring] field. + * This will be called internally. + * + * @param fault handle to a soap fault object + * @param faultstring the faultstring to set + */ +void SoapFaultSetFaultString(HSOAPFAULT fault, const char* faultString); + + +/** + * Sets the a [faultactor] field. + * This will be called internally. + * + * @param fault handle to a soap fault object + * @param faultactor the faultactor to set + */ +void SoapFaultSetFaultActor(HSOAPFAULT fault, const char* faultActor); + + +/** + * Sets the a [faultdetail] field. + * This will be called internally. + * + * @param fault handle to a soap fault object + * @param faultcode the detail to set + */ +void SoapFaultSetFaultDetail(HSOAPFAULT fault, HSOAPPARAM param); + + +/** + * Prints a fault object into the + * given file. This is for debug puposes. + * + * @param f the file to print into + * @param fault the fault object to print + */ +void SoapFaultPrint(FILE* f, HSOAPFAULT fault); + + +#endif + diff --git a/src/csoaphttp.c b/src/csoaphttp.c new file mode 100644 index 0000000..2d578ce --- /dev/null +++ b/src/csoaphttp.c @@ -0,0 +1,153 @@ +/****************************************************************** + * $Id: csoaphttp.c,v 1.1 2003/03/25 22:17:20 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoaphttp.h" +#include "csoaplog.h" +#include "csoapxml.h" + +/*----------------------------------------------------------------- + FUNCTION: SoapHttpCreateEnv +/-----------------------------------------------------------------*/ + +static +HSOAPENV SoapHttpCreateEnv(char* httpResponse) +{ + const char *FUNC = "SoapHttpCreateEnv"; + int count = 0; + int newline = 0; + xmlDocPtr env; + xmlNodePtr node; + int len; + char *tmp; + + SoapTraceEnter(FUNC, "Entering response =\n"); + while (*(httpResponse+count) != '\0') { + if (httpResponse[count]=='\r') { + count++; + continue; + } + if (httpResponse[count]=='\n') { + if (newline) break; + else newline = 1; + } else newline = 0; + + count++; + } + + len = strlen(httpResponse); + SoapLog(LOG_DEBUG, FUNC, "count = %d\n", count); + SoapLog(LOG_DEBUG, FUNC, "response length = %d\n", len); + + len = strlen(&httpResponse[count]); + SoapLog(LOG_DEBUG, FUNC, "xml response length = %d\n", len); + + while (httpResponse[count] == '\n' + || httpResponse[count] == '\r') { + count++; + } + + SoapLog(LOG_DEBUG, FUNC, "count = %d\n", count); + + SoapLog(LOG_DEBUG, FUNC, "casting\n"); + tmp = (char*)(&httpResponse[count]); + SoapLog(LOG_DEBUG, FUNC, "casting ok\n"); + + /* SoapLog(LOG_DEBUG, FUNC, "xml = %s\n",tmp?tmp:"null"); + */ + SoapLog(LOG_DEBUG, FUNC, "Starting parsing\n"); + env = xmlParseMemory((const char*)tmp, len); + if (env == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Can not create xml document!"); + return NULL; + } + + node = xmlDocGetRootElement(env); + if (node == NULL) { + SoapLog(LOG_ERROR, FUNC, + "xml document is empty!"); + return NULL; + } + + SoapLog(LOG_DEBUG, FUNC, + "Envelope created successfully"); + + SoapTraceLeave(FUNC, "env (%p)", node); + return (HSOAPENV)node; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapHttpSend +/-----------------------------------------------------------------*/ + +CSOAP_STATUS SoapHttpSend(HSOAPURL url, HSOAPENV env, HSOAPENV* res) +{ + const char *FUNC = "SoapHttpSend"; + HSOAPSOCKET http; + int len; + ssize_t size; + char *tmp; + char *response; + char tmp2[1054]; + CSOAP_STATUS status; + xmlBufferPtr buffer; + xmlDocPtr doc; + + SoapTraceEnter(FUNC, "env (%p)", env); + + buffer = xmlBufferCreate(); + xmlNodeDump(buffer, ((xmlNodePtr)env)->doc, (xmlNodePtr)env, 1 ,1); + len = strlen((const char*)xmlBufferContent(buffer)); + + tmp = (char*)malloc(1054 + len); + if (tmp == NULL) + return ERROR_NO_MEM; + + status = SoapSocketCreate(url->m_host, url->m_port, &http); + if (status != CSOAP_OK) return status; + + /*SoapSocketGetResponse(http);*/ + sprintf(tmp2, "POST %s HTTP/1.0\n", url->m_context?url->m_context:"/"); + sprintf(tmp2, "%sContent-Type: text/xml\n", tmp2); + sprintf(tmp2, "%sContent-Length: %d\n\n", tmp2, len); + + sprintf(tmp, "%s%s", tmp2, (const char*)xmlBufferContent(buffer)); + + SoapLog(LOG_DEBUG, FUNC, "sending request\n"); + status = SoapSocketSend(http, tmp, &size); + if (status != CSOAP_OK) return status; + + status = SoapSocketRecv(http, &response, &size); + SoapLog(LOG_DEBUG, FUNC, "response returned status = %d\n", status); + if (status != CSOAP_OK) return status; + + *res = SoapHttpCreateEnv(response); + free(tmp); + free(response); + xmlBufferFree(buffer); + + SoapTraceLeave(FUNC, ""); + return CSOAP_OK; +} + diff --git a/src/csoaphttp.h b/src/csoaphttp.h new file mode 100644 index 0000000..0fe8858 --- /dev/null +++ b/src/csoaphttp.h @@ -0,0 +1,45 @@ +/****************************************************************** + * $Id: csoaphttp.h,v 1.1 2003/03/25 22:17:20 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_HTTP_H +#define CSOAP_HTTP_H + +#include "csoapenv.h" +#include "csoapsocket.h" +#include "csoapurl.h" + +/** + * Sends a soap envelope to the given + * host and receives a soap envelope. + * + * @param url The target url + * @param env The soap envelope to send + * @param res The destination soap handle to + * receive the the envelope. + * + * @return CSOAP_OK if it was successfull. + */ +CSOAP_STATUS SoapHttpSend(HSOAPURL url, HSOAPENV env, HSOAPENV* res); + + +#endif diff --git a/src/csoaplog.c b/src/csoaplog.c new file mode 100644 index 0000000..536d1a9 --- /dev/null +++ b/src/csoaplog.c @@ -0,0 +1,65 @@ +#include "csoaplog.h" + +#include <stdarg.h> +#include <stdio.h> + +static +void _SoapLogWrite(SoapLogLevel level, + const char* function, + const char* format, + va_list ap) +{ + char buffer[1054]; + char buffer2[1054]; + sprintf(buffer, "[%s] [%d] %s\n", function, level, format); + vsprintf(buffer2, buffer, ap); +/* printf(buffer2); + fflush(stdout); +*/ +} + + +void SoapTraceEnter(const char* function, + const char* format, ...) +{ + va_list ap; + + va_start(ap, format); + _SoapLogWrite(LOG_TRACE, function, format, ap); + va_end(ap); +} + + +void SoapTraceLeave(const char* function, + const char* format, ...) +{ + va_list ap; + + va_start(ap, format); + _SoapLogWrite(LOG_TRACE, function, format, ap); + va_end(ap); +} + + +void SoapTraceLeaveWithError(const char* function, + const char* format, ...) +{ + va_list ap; + + va_start(ap, format); + _SoapLogWrite(LOG_ERROR, function, format, ap); + va_end(ap); +} + + +void SoapLog(SoapLogLevel level, const char* function, + const char* format, ...) +{ + va_list ap; + + va_start(ap, format); + _SoapLogWrite(level, function, format, ap); + va_end(ap); +} + + diff --git a/src/csoaplog.h b/src/csoaplog.h new file mode 100644 index 0000000..6d7edb6 --- /dev/null +++ b/src/csoaplog.h @@ -0,0 +1,26 @@ +#ifndef CSOAP_LOG_H +#define CSOAP_LOG_H + + +typedef enum tagSoapLogLevel +{ + LOG_TRACE, + LOG_DEBUG, + LOG_INFO, + LOG_WARN, + LOG_ERROR +}SoapLogLevel; + +void SoapTraceEnter(const char* function, + const char* format, ...); + +void SoapTraceLeave(const char* function, + const char* format, ...); +void SoapTraceLeaveWithError(const char* function, + const char* format, ...); + +void SoapLog(SoapLogLevel level, const char* function, + const char* format, ...); + +#endif + diff --git a/src/csoapmethod.c b/src/csoapmethod.c new file mode 100644 index 0000000..fb85348 --- /dev/null +++ b/src/csoapmethod.c @@ -0,0 +1,70 @@ +/****************************************************************** + * $Id: csoapmethod.c,v 1.1 2003/03/25 22:17:21 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapmethod.h" +#include "csoaplog.h" + + +/*----------------------------------------------------------------- + FUNCTION:SoapMethodGetName +/-----------------------------------------------------------------*/ + +char* SoapMethodGetName(HSOAPMETHOD method) +{ + const char* FUNC = "SoapMethodGetName"; + char *name; + xmlNodePtr node; + SoapTraceEnter(FUNC,""); + + if (method == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid method (null)"); + return NULL; + } + node = (xmlNodePtr)method; + name = (char*)node->name; + SoapTraceLeave(FUNC, "Name = '%s'", name); + return name; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapMethodParamContext +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapMethodParamContext(HSOAPMETHOD method) +{ + const char* FUNC = "SoapMethodParamContext"; + char *name; + SoapTraceEnter(FUNC,""); + + if (method == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid method (null)"); + return NULL; + } + SoapTraceLeave(FUNC, "param context = '%p'", method); + + return (xmlNodePtr)method; +} + diff --git a/src/csoapmethod.h b/src/csoapmethod.h new file mode 100644 index 0000000..aa8883d --- /dev/null +++ b/src/csoapmethod.h @@ -0,0 +1,56 @@ +/****************************************************************** + * $Id: csoapmethod.h,v 1.1 2003/03/25 22:17:21 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_METHOD_H +#define CSOAP_METHOD_H + +#include "csoapparam.h" + + +typedef HSOAPXML HSOAPMETHOD; + + +/** + * Returns the method name + * + * @param method handle to a soap method object + * @return the method name (do not free the string) + */ +char* SoapMethodGetName(HSOAPMETHOD method); + + +/** + * Returns the param context. Param context is + * also a param object. Use the param context + * as the parent of the method parameters. + * + * @param method the method object to get + * its param context + * + * @return The root parameter object if any + * exist , NULL otherwise. + */ +HSOAPPARAM SoapMethodParamContext(HSOAPMETHOD method); + + +#endif diff --git a/src/csoapparam.c b/src/csoapparam.c new file mode 100644 index 0000000..dfc9ac4 --- /dev/null +++ b/src/csoapparam.c @@ -0,0 +1,384 @@ +/****************************************************************** + * $Id: csoapparam.c,v 1.1 2003/03/25 22:17:25 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapparam.h" +#include "csoaplog.h" +#include "csoaptypes.h" +#include "csoapxml.h" + +#include <stdarg.h> + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamCreate +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapParamCreate(HSOAPPARAM parent, const char *type, + const char *ns, const char *name, + const char *format, ...) +{ + va_list ap; + char buffer[SOAP_MAX_STRING_BUFFER]; + xmlNodePtr newnode; + const char *FUNC = "SoapParamCreate"; + + SoapTraceEnter(FUNC,""); + + va_start(ap, format); + vsprintf(buffer, format, ap); + va_end(ap); + + newnode = xmlNewTextChild(parent, NULL, name, buffer); + + if (newnode == NULL) { + SoapTraceLeaveWithError(FUNC, + "Can not create new xml node"); + return NULL; + } + + if ( !xmlNewProp(newnode, "xsi:type", type)) { + SoapTraceLeaveWithError(FUNC, + "Can not create new xml attribute"); + return NULL; + } + + SoapTraceLeave(FUNC, "New xml node (%p)", newnode); + return newnode; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamCreateString +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapParamCreateString(HSOAPPARAM parent, const char *name, + const char *format, ...) +{ + va_list ap; + HSOAPPARAM node; + char buffer[SOAP_MAX_STRING_BUFFER]; + const char* FUNC = "SoapParamCreateString"; + SoapTraceEnter(FUNC,""); + + if (parent == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parent (null)"); + return NULL; + } + + if (name == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid name (null)"); + return NULL; + } + + if (format == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid format (null)"); + return NULL; + } + + SoapLog(LOG_DEBUG, FUNC, + "Creating string parameter\n" \ + "Name = '%s'" \ + "Format = %s", name, format); + + va_start(ap, format); + vsprintf(buffer, format, ap); + va_end(ap); + + node = SoapParamCreate(parent , SOAP_TYPE_STRING, + NULL, name, "%s", buffer); + + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "can not create param"); + return NULL; + } + + SoapTraceLeave(FUNC, "New param (%p)", node); + return (HSOAPPARAM)node; +} + + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamCreateInt +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapParamCreateInt(HSOAPPARAM parent, const char *name, + int value) +{ + HSOAPPARAM node; + const char* FUNC = "SoapParamCreateInt"; + SoapTraceEnter(FUNC,""); + + if (parent == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parent (null)"); + return NULL; + } + + if (name == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid name (null)"); + return NULL; + } + + node = SoapParamCreate(parent , SOAP_TYPE_INT, + NULL, name, "%d", value); + + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "can not create param"); + return NULL; + } + + SoapTraceLeave(FUNC, "New param (%p)", node); + return node; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamCreateDouble +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapParamCreateDouble(HSOAPPARAM parent, const char *name, + double value) +{ + HSOAPPARAM node; + const char* FUNC = "SoapParamCreateDouble"; + SoapTraceEnter(FUNC,""); + + if (parent == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parent (null)"); + return NULL; + } + + if (name == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid name (null)"); + return NULL; + } + + node = SoapParamCreate(parent, SOAP_TYPE_DOUBLE, + NULL, name, "%f", value); + + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, "can not create param"); + return NULL; + } + + SoapTraceLeave(FUNC, "New param (%p)", node); + return node; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamSetValue +/-----------------------------------------------------------------*/ + +void SoapParamSetValue(HSOAPPARAM param, const char* type, + const char* format, ...) +{ + // Not implemented yet! +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamGetString +/-----------------------------------------------------------------*/ + +int SoapParamGetString(HSOAPPARAM param, char *dest) +{ + char *value; + int len; + xmlNodePtr xmlNode; + const char* FUNC = "SoapParamGetString"; + SoapTraceEnter(FUNC,""); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'param' (null)"); + return 0; + } + + xmlNode = (xmlNodePtr)param; + value = (char*)xmlNodeListGetString(xmlNode->doc, + xmlNode->xmlChildrenNode,1); + + if (dest) + strcpy(dest, value); + + len = strlen(value); + xmlFree(value); + + SoapTraceLeave(FUNC, "Value = '%s'\nLength=%d", dest?dest:"null", len); + return len; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamGetInt +/-----------------------------------------------------------------*/ + +int SoapParamGetInt(HSOAPPARAM param) +{ + int value; + char buffer[15]; + const char* FUNC = "SoapParamGetInt"; + SoapTraceEnter(FUNC,""); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'param' (null)"); + return 0; + } + + SoapParamGetString(param, buffer); + value = atoi(buffer); + SoapTraceLeave(FUNC, "Value = %d", value); + return value; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamGetDouble +/-----------------------------------------------------------------*/ + +double SoapParamGetDouble(HSOAPPARAM param) +{ + double value; + char buffer[15]; + const char* FUNC = "SoapParamGetDouble"; + SoapTraceEnter(FUNC,""); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'param' (null)"); + return 0.0; + } + + SoapParamGetString(param, buffer); + value = atof(buffer); + SoapTraceLeave(FUNC, "Value = %f", value); + return value; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamGetChildren +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapParamGetChildren(HSOAPPARAM param) +{ + xmlNodePtr children; + const char* FUNC = "SoapParamGetChildren"; + SoapTraceEnter(FUNC,""); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'param' (null)"); + return NULL; + } + + children = ((xmlNodePtr)param)->xmlChildrenNode; + while (children != NULL) { + if (children->type != XML_ELEMENT_NODE) + children = children->next; + else break; + } + SoapTraceLeave(FUNC, "Children node (%p)", children); + return (HSOAPPARAM)children; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamGetNext +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapParamGetNext(HSOAPPARAM param) +{ + xmlNodePtr children; + const char* FUNC = "SoapParamGetNext"; + xmlNodePtr node = (xmlNodePtr)param; + SoapTraceEnter(FUNC,"Enter. node = %s", node?(char*)node->name:"null"); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'param' (null)"); + return NULL; + } + + children = node->next; + + while (children != NULL) { + if (children->type != XML_ELEMENT_NODE) + children = children->next; + else break; + } + + SoapTraceLeave(FUNC, "Children node (%p)", children); + return (HSOAPPARAM)children; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamGetType +/-----------------------------------------------------------------*/ + +char* SoapParamGetType(HSOAPPARAM param) +{ + const char* FUNC = "SoapParamGetType"; + char *value; + xmlNodePtr node = (xmlNodePtr)param; + SoapTraceEnter(FUNC,"Enter. node = %s", node?(char*)node->name:"null"); + + value = SoapXmlGetAttr(node, NULL, "type"); + + SoapTraceLeave(FUNC, "Type = %s", value?value:"(null}"); + return value; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapParamTypeIs +/-----------------------------------------------------------------*/ + +int SoapParamTypeIs(HSOAPPARAM param, const char* type) +{ + const char* FUNC = "SoapParamTypeIs"; + char *value; + SoapTraceEnter(FUNC,"Enter. Type = %s", type?type:"(null)"); + + if (type == NULL) { + SoapTraceLeaveWithError(FUNC, "type is null"); + return 0; + } + + value = SoapParamGetType(param); + + SoapTraceLeave(FUNC, "Leave"); + return (!strcmp(value, type)); +} + + diff --git a/src/csoapparam.h b/src/csoapparam.h new file mode 100644 index 0000000..23a27f9 --- /dev/null +++ b/src/csoapparam.h @@ -0,0 +1,187 @@ +/****************************************************************** + * $Id: csoapparam.h,v 1.1 2003/03/25 22:17:25 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_PARAM_H +#define CSOAP_PARAM_H + +#include "csoapxml.h" + + +typedef HSOAPXML HSOAPPARAM; + + +#define SOAP_MAX_STRING_BUFFER 1054 + + +/** + * Creates a string soap parameter + * + * <LI>Default type: "xsd:string" + * + * @param parent the parent param object + * @param name the parameter name + * @param format the parameter value + * + * @return handle to a parameter object if + * the creation was successfull, NULL otherwise + */ +HSOAPPARAM SoapParamCreateString( HSOAPPARAM parent, const char *name, + const char *format, ...); + + +/** + * Creates an integer soap parameter + * + * <LI>Default type: "xsd:integer" + * + * @param parent the parent param object + * @param name the parameter name + * @param value the parameter value + * + * @return handle to a parameter object if + * the creation was successfull, NULL otherwise + */ +HSOAPPARAM SoapParamCreateInt( HSOAPPARAM parent, const char *name, + int value); + + +/** + * Creates a double soap parameter + * + * <LI>Default type: "xsd:double" + * + * @param parent the parent param object + * @param name the parameter name + * @param value the parameter value + * + * @return handle to a parameter object if + * the creation was successfull, NULL otherwise + */ +HSOAPPARAM SoapParamCreateDouble( HSOAPPARAM parent, const char *name, + double value); + + +/** + * Sets the parameter value. + * + * @param param the parameter object + * @param type a custom type name + * @param format value of the parameter + */ +void SoapParamSetValue(HSOAPPARAM param,const char* type, + const char* format, ...); + + +/** + * Get the value of a soap parameter + * in string format + * + * @param param the soap parameter object + * @param buffer an allocated character buffer + * to receive the content. If this is NULL, + * this function will return the size only. + * + * @return size of the content. + */ +int SoapParamGetString(HSOAPPARAM param, char *buffer); + + +/** + * Get the value of a soap parameter + * in integer format + * + * @param param the soap parameter object + * @return the param content as integer + */ +int SoapParamGetInt(HSOAPPARAM param); + + +/** + * Get the value of a soap parameter + * in double format + * + * @param param the soap parameter object + * @return the param content as double + */ +double SoapParamGetDouble(HSOAPPARAM param); + + +/** + * Get the children parameter nodes. + * This acts actually like an xml node. + * + * @param param the soap parameter object + * @return handle to the first child node + */ +HSOAPPARAM SoapParamGetChildren(HSOAPPARAM param); + + +/** + * Get the next parameter. + * This acts actually like an xml node. + * + * @param param the soap parameter object + * @return handle to the next node + */ +HSOAPPARAM SoapParamGetNext(HSOAPPARAM param); + + +/** + * Checks if the type is equals with + * the given one. + * + * @param param the param to check + * @param type the type to check + * + * @return 0 if the parameter type not equals to 'type' + */ +int SoapParamTypeIs(HSOAPPARAM param, const char* type); + + +/** + * Returns parameters type. + * + * @param param the param to return its type + * + * @return returns parameters type + */ +char* SoapParamGetType(HSOAPPARAM param); + + +/** + * Creates a new parameter node. + * This is used internally. + * + * @param parent the parent soap parameter object + * @param type the parameter type + * @param ns the namespace of the parameter + * @param name name of the parameter + * @param format value of the parameter + * + * @return A newly created soap parameter object + */ +HSOAPPARAM SoapParamCreate(HSOAPPARAM parent, const char *type, + const char *ns, const char *name, + const char *format, ...); + +#endif diff --git a/src/csoapres.c b/src/csoapres.c new file mode 100644 index 0000000..3d631e1 --- /dev/null +++ b/src/csoapres.c @@ -0,0 +1,154 @@ +/****************************************************************** + * $Id: csoapres.c,v 1.1 2003/03/25 22:17:26 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapres.h" +#include "csoaplog.h" + + +/*----------------------------------------------------------------- + FUNCTION: SoapResCreate +/-----------------------------------------------------------------*/ + +HSOAPRES SoapResCreate(HSOAPENV env, const char* methodName) +{ + HSOAPRES res = (HSOAPRES)malloc(sizeof(struct SOAPRES)); + res->m_env = env; + res->m_method = (char*)malloc(sizeof(char)*strlen(methodName)+1); + strcpy(res->m_method, methodName); + return res; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapResGetFault +/-----------------------------------------------------------------*/ + +HSOAPFAULT SoapResGetFault(HSOAPRES res) +{ + const char *FUNC = "SoapResGetFault"; + HSOAPBODY body; + HSOAPFAULT fault; + + SoapTraceEnter(FUNC, "Entering"); + + if (res == NULL) { + SoapTraceLeaveWithError(FUNC, "res is null"); + return NULL; + } + + if (res->m_env == NULL) { + SoapTraceLeaveWithError(FUNC, "res->m_env is null"); + return NULL; + } + + if (!(body = SoapEnvGetBody(res->m_env))) { + SoapTraceLeaveWithError(FUNC, "can not get body"); + return NULL; + } + + fault = SoapBodyGetFault(body); + SoapTraceLeave(FUNC, "Leaving fault (%p)", fault); + + return fault; +} + +/*----------------------------------------------------------------- + FUNCTION: SoapResFree +/-----------------------------------------------------------------*/ + +void SoapResFree(HSOAPRES res) +{ + const char *FUNC = "SoapResFree"; + + SoapTraceEnter(FUNC, "Entering"); + + if (res == NULL) { + SoapTraceLeaveWithError(FUNC, "res is null"); + return; + } + + if (res->m_env == NULL) { + SoapTraceLeaveWithError(FUNC, "res->m_env is null"); + return; + } + + SoapEnvFree(res->m_env); + free(res); + + SoapTraceLeave(FUNC, "Leaving"); +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapResFree +/-----------------------------------------------------------------*/ + +HSOAPPARAM SoapResGetParamChildren(HSOAPRES res) +{ + const char *FUNC = "SoapResGetParamChildren"; + HSOAPBODY body; + HSOAPMETHOD method; + HSOAPPARAM param; + char tmp[1054]; + + SoapTraceEnter(FUNC, "Entering"); + + if (res == NULL) { + SoapTraceLeaveWithError(FUNC, "res is null"); + return NULL; + } + + if (res->m_env == NULL) { + SoapTraceLeaveWithError(FUNC, "res->m_env is null"); + return NULL; + } + + if (!(body = SoapEnvGetBody(res->m_env))) { + SoapTraceLeaveWithError(FUNC, "can not get body"); + return NULL; + } + + sprintf(tmp, "%sResponse", res->m_method); + method = SoapBodyGetMethod(body, tmp); + + if (method == NULL) { + SoapTraceLeaveWithError(FUNC, "method is null"); + return NULL; + } + + param = SoapMethodParamContext(method); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, "param is null"); + return NULL; + } + + param = SoapParamGetChildren(method); + + if (param == NULL) { + SoapTraceLeaveWithError(FUNC, "child is null"); + return NULL; + } + + return param; +} diff --git a/src/csoapres.h b/src/csoapres.h new file mode 100644 index 0000000..38efd9b --- /dev/null +++ b/src/csoapres.h @@ -0,0 +1,90 @@ +/****************************************************************** + * $Id: csoapres.h,v 1.1 2003/03/25 22:17:26 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_RES_H +#define CSOAP_RES_H + +#include "csoapxml.h" +#include "csoapenv.h" + +typedef struct SOAPRES* HSOAPRES; + + +/** + * The result object. Stores + * the response of a soap request. + */ +struct SOAPRES +{ + HSOAPENV m_env; /* The soap envelope object */ + char *m_method; /* The called method name */ +}; + + +/** + * Creates a new soap result object. + * This is used actually internally. + * To get a soap result see + * <B>HSOAPCALL</B> + * + * @param env the envelope object to use + * @param methodName the called method name + * @return handle to a soap result object. + */ +HSOAPRES SoapResCreate(HSOAPENV env, const char* methodName); + + +/** + * Returns a soap fault object + * if any exist. This can also be + * called to check if any faults + * was occured for this result. + * + * @param res handle to the soap result object + * @return handle to a fault object or + * NULL if no fault was generated. + */ +HSOAPFAULT SoapResGetFault(HSOAPRES res); + + +/** + * Returns the first parameter + * in the result object if any exist. + * + * @param res handle to the soap result object + * @return handle to a soap param object + * NULL if no parameter was received. + */ +HSOAPPARAM SoapResGetParamChildren(HSOAPRES res); + + +/** + * Free a soap result object. + * This must be called after the result + * object was used. + * + * @param res The soap result object to free + */ +void SoapResFree(HSOAPRES res); + +#endif diff --git a/src/csoapsocket.c b/src/csoapsocket.c new file mode 100644 index 0000000..87d5515 --- /dev/null +++ b/src/csoapsocket.c @@ -0,0 +1,154 @@ +/****************************************************************** + * $Id: csoapsocket.c,v 1.1 2003/03/25 22:17:26 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapsocket.h" +#include "csoaperror.h" +#include "csoaplog.h" + +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netdb.h> + +#define SOCKET_MAX_BUFSIZE 1054 + + +/*----------------------------------------------------------------- + FUNCTION: SoapSocketCreate +/-----------------------------------------------------------------*/ + +CSOAP_STATUS SoapSocketCreate(const char* hostname, int port, HSOAPSOCKET* hSock) +{ + + int sock; + struct sockaddr_in address; + struct hostent* host; + int i; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock <= 0) return ERROR_SOCKET_CAN_NOT_CREATE_SOCKET; + + /* Get host data */ + host = gethostbyname(hostname); + if (host == NULL) return ERROR_SOCKET_CAN_NOT_GET_HOSTNAME; + + /* set server addresss */ + address.sin_family = host->h_addrtype;; + address.sin_port = htons(port); + memcpy((char*)&address.sin_addr.s_addr, + host->h_addr_list[0], host->h_length); + + /* connect to the server */ + if (connect(sock, (struct sockaddr*) &address, sizeof(address)) != 0) + return ERROR_SOCKET_CAN_NOT_CONNECT; + + *hSock = sock; + return CSOAP_OK; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapSocketRecv +/-----------------------------------------------------------------*/ + +CSOAP_STATUS SoapSocketRecv(HSOAPSOCKET sock, char** buffer, ssize_t* totalSize) +{ + const char *FUNC = "SoapSocketRecv"; + ssize_t size; + int chunk=1; + char tmp[SOCKET_MAX_BUFSIZE+1]; + + SoapTraceEnter( FUNC, "Entering"); + *totalSize = 0; + *buffer = 0; + + do { + SoapLog(LOG_DEBUG, FUNC, "Receiving buffer\n"); + size = recv(sock, tmp, SOCKET_MAX_BUFSIZE, 0); + SoapLog(LOG_DEBUG, FUNC, "received = %s\n", tmp); + if (size == -1) { + printf("Error reading from socket\n"); + return ERROR_SOCKET_CAN_NOT_RECEIVE; + } + *totalSize += size; + if (*buffer) { + SoapLog(LOG_DEBUG, FUNC, "realloc\n"); + *buffer = (char*)realloc(*buffer, SOCKET_MAX_BUFSIZE*chunk+1); + strcat(*buffer, tmp); + SoapLog(LOG_DEBUG, FUNC,"realloc ok\n"); + } else { + SoapLog(LOG_DEBUG, FUNC, "alloc\n"); + *buffer = (char*)realloc(NULL, SOCKET_MAX_BUFSIZE+1); + strcpy(*buffer, tmp); + SoapLog(LOG_DEBUG, FUNC,"alloc ok\n"); + } + + SoapLog(LOG_DEBUG, FUNC, "totalSize = %d\n", *totalSize); + (*buffer)[*totalSize] = '\0'; + chunk++; + } while (size > 0); + + SoapTraceLeave(FUNC, "totalsize: %d", *totalSize); + return CSOAP_OK; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapSocketSend +/-----------------------------------------------------------------*/ + +CSOAP_STATUS SoapSocketSend(HSOAPSOCKET sock, const char* req, ssize_t* sentSize) +{ + const char *FUNC = "SoapSocketSend"; + ssize_t size; + + SoapTraceEnter(FUNC, ""); + + size = send(sock, req, strlen(req), 0); + if (size == -1) + return ERROR_SOCKET_CAN_NOT_SEND; + + *sentSize = size; + SoapTraceLeave(FUNC, ""); + return CSOAP_OK; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapSocketInitialize +/-----------------------------------------------------------------*/ + +CSOAP_STATUS SoapSocketInitialize() +{ + const char *FUNC = "SoapSocketInitialize"; + SoapTraceEnter(FUNC, ""); + +#ifdef WIN32 + /* Initialize WinSocket for the Windows version */ +#endif + + SoapTraceLeave(FUNC, ""); + return CSOAP_OK; +} + + diff --git a/src/csoapsocket.h b/src/csoapsocket.h new file mode 100644 index 0000000..216b1a2 --- /dev/null +++ b/src/csoapsocket.h @@ -0,0 +1,81 @@ +/****************************************************************** + * $Id: csoapsocket.h,v 1.1 2003/03/25 22:17:28 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_SOCKET_H +#define CSOAP_SOCKET_H + +#include <stdio.h> +#include "csoaperror.h" + +typedef int HSOAPSOCKET; + + +/** + * Initializes the soap socket module. + * This is called internally. Before any + * socket operation. + * + * @return CSOAP_OK if it was successfull + */ +int SoapSocketInitialize(); + + +/** + * Creates a new soap compatible socket object. + * + * @param host the host to connect + * @param port the port to connect + * @param socket the destination pointer + * to receive a connected socket object + * + * @return CSOAP_OK if it was successfull. + */ +CSOAP_STATUS SoapSocketCreate(const char* host, int port, HSOAPSOCKET* socket); + +/** + * Sends data to the connected socket. + * + * @param sock A connected socket object + * @param req data to send + * @param sentSize the size of sent data + * + * @return CSOAP_OK if it was successfull + */ +CSOAP_STATUS SoapSocketSend(HSOAPSOCKET sock, const char* req,ssize_t* sentSize); + + +/** + * Receives data from the connected socket. + * + * @param sock A connected socket object + * @param res destination pointer to receive + * the data. This will be allocated in this + * function. So you have to free it. + * @param receivedSize the size of received data + * + * @return CSOAP_OK if it was successfull + */ +CSOAP_STATUS SoapSocketRecv(HSOAPSOCKET sock, char** res,ssize_t* receivedSize); + + +#endif diff --git a/src/csoaptypes.h b/src/csoaptypes.h new file mode 100644 index 0000000..ac001f4 --- /dev/null +++ b/src/csoaptypes.h @@ -0,0 +1,33 @@ +/****************************************************************** + * $Id: csoaptypes.h,v 1.1 2003/03/25 22:17:28 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_TYPES_H +#define CSOAP_TYPES_H + + +#define SOAP_TYPE_STRING "xsd:string" +#define SOAP_TYPE_INT "xsd:int" +#define SOAP_TYPE_DOUBLE "xsd:double" + + +#endif diff --git a/src/csoapurl.c b/src/csoapurl.c new file mode 100644 index 0000000..ae91e40 --- /dev/null +++ b/src/csoapurl.c @@ -0,0 +1,185 @@ +/****************************************************************** + * $Id: csoapurl.c,v 1.1 2003/03/25 22:17:28 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapurl.h" +#include "csoaplog.h" + +#include <stdio.h> +#include <string.h> + + +static +HSOAPURL CreateUrlFromIndex(const char* urlstr, int iprotocol, int ihost, int iport) +{ + const char *FUNC = "CreateUrlFromIndex"; + int len, size; + char tmp[8]; + HSOAPURL url; + + SoapTraceEnter(FUNC, "Entering"); + + url = (HSOAPURL)malloc(sizeof(struct SOAPURL)); + + url->m_protocol = (char*)malloc(sizeof(char)*iprotocol+1); + strncpy(url->m_protocol, urlstr, iprotocol); + + size = ihost - iprotocol - 3; + url->m_host = (char*)malloc(sizeof(char)*size); + strncpy(url->m_host, &urlstr[iprotocol+3], size); + + if (iport > ihost) + { + size = iport - ihost; + strncpy(tmp, &urlstr[ihost+1], size); + url->m_port = atoi(tmp); + } else { + url->m_port = 80; + } + + len = strlen(urlstr); + if (len > iport ) + { + size = len - iport; + url->m_context = (char*)malloc(sizeof(char)*size); + strncpy(url->m_context, &urlstr[iport], size); + } else { + url->m_context = NULL; + } + + SoapTraceEnter(FUNC, "Leaving url = %p", url); + return url; +}; + + +/*----------------------------------------------------------------- + FUNCTION: SoapUrlCreate +/-----------------------------------------------------------------*/ + +HSOAPURL SoapUrlCreate(const char* urlstr) +{ + const char *FUNC = "SoapUrlCreate"; + int iprotocol; + int ihost; + int iport; + int len; + HSOAPURL url = NULL; + + SoapTraceEnter(FUNC, "Entering. URL = %s", urlstr?urlstr:"null"); + + iprotocol = 0; + len = strlen(urlstr); + printf("len = %d\n", len); + /* find protocol */ + while (urlstr[iprotocol] != ':' && urlstr[iprotocol] != '\0') + { +/* printf("protocol: urlstr[%d] = %c\n",iprotocol, urlstr[iprotocol] );*/ + iprotocol++; + } + + if (iprotocol == 0) { + SoapTraceLeaveWithError(FUNC, "no protocol"); + return NULL; + } + + if (iprotocol + 3 >= len) { + SoapTraceLeaveWithError(FUNC, "no host"); + return NULL; + } + + if ( urlstr[iprotocol] != ':' + && urlstr[iprotocol+1] != '/' + && urlstr[iprotocol+2] != '/') + { + SoapTraceLeaveWithError(FUNC, "no protocol"); + return NULL; + } + + /* find host */ + ihost = iprotocol + 3; + while (urlstr[ihost] != ':' + && urlstr[ihost] != '/' + && urlstr[ihost] != '\0') + { +/* printf("host: urlstr[%d] = %c\n",ihost, urlstr[ihost] );*/ + ihost++; + } + + if (ihost == iprotocol + 1) { + SoapTraceLeaveWithError(FUNC, "no host"); + return NULL; + } + + /* find port */ + iport = ihost; + if (ihost + 1 < len) { + if (urlstr[ihost] == ':') { + while (urlstr[iport] != '/' && urlstr[iport] != '\0') { +/* printf("port: urlstr[%d] = %c\n", iport, urlstr[iport] );*/ + iport++; + } + } + } + +/* + printf("iprotocol = %d\nihost = %d\niport = %d\nlen = %d\n", + iprotocol, ihost, iport, len); +*/ + url = CreateUrlFromIndex(urlstr, iprotocol, ihost, iport); + SoapTraceLeave(FUNC, "Leaving url (%p)", url); + return url; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapUrlFree +/-----------------------------------------------------------------*/ + +void SoapUrlFree(HSOAPURL url) +{ + if (url != NULL) { + if (url->m_protocol) free(url->m_protocol); + if (url->m_host) free(url->m_host); + if (url->m_context) free(url->m_context); + + free(url); + } +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapUrlDump +/-----------------------------------------------------------------*/ + +void SoapUrlDump(HSOAPURL url) +{ + if (url == NULL) { + printf("(null)\n"); + return ; + } + + printf("PROTOCOL : %s\n", url->m_protocol?url->m_protocol:"(null)"); + printf(" HOST : %s\n", url->m_host?url->m_host:"(null)"); + printf(" PORT : %d\n", url->m_port); + printf(" CONTEXT : %s\n", url->m_context?url->m_context:"(null)"); + +} diff --git a/src/csoapurl.h b/src/csoapurl.h new file mode 100644 index 0000000..7840f78 --- /dev/null +++ b/src/csoapurl.h @@ -0,0 +1,70 @@ +/****************************************************************** + * $Id: csoapurl.h,v 1.1 2003/03/25 22:17:30 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_URL_H +#define CSOAP_URL_H + + +/* Include csoap headers */ + + +typedef struct SOAPURL* HSOAPURL; + + +struct SOAPURL +{ + char *m_protocol; + char *m_host; + int m_port; + char *m_context; +}; + + +/** + * Creates a new url object + * + * @param url the url string + * + * @return A soap url object if it was + * successfull, NULL otherwise. + */ +HSOAPURL SoapUrlCreate(const char* url); + + +/** + * Free a url object + * + * @param url the url to free + */ +void SoapUrlFree(HSOAPURL url); + + +/** + * Dump the url data (for debugging) + * + * @param url the url to show its content + */ +void SoapUrlDump(HSOAPURL url); + + +#endif diff --git a/src/csoapxml.c b/src/csoapxml.c new file mode 100644 index 0000000..6129747 --- /dev/null +++ b/src/csoapxml.c @@ -0,0 +1,151 @@ +/****************************************************************** + * $Id: csoapxml.c,v 1.1 2003/03/25 22:17:31 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#include "csoapxml.h" + +#include "csoaplog.h" + + +/*----------------------------------------------------------------- + FUNCTION: SoapXmlFindNode +/-----------------------------------------------------------------*/ + +HSOAPXML +SoapXmlFindNode(HSOAPXML root, const char* nodeName) +{ + xmlNodePtr cur; + const char* FUNC = "SoapXmlFindNode"; + + SoapTraceEnter(FUNC,"root (%p) node (%p)", + root, nodeName?nodeName:"null"); + + if (root == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid root node (null)"); + return NULL; + } + + if (nodeName == NULL) { + SoapLog(LOG_ERROR, FUNC, + "Invalid node name (null)"); + return NULL; + } + + cur = ((xmlNodePtr)root)->xmlChildrenNode; + while (cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar*)nodeName)) { + SoapTraceLeave(FUNC, "Found '%s' (%p)", nodeName, cur); + return cur; + } + cur = cur->next; + } + + SoapTraceLeave(FUNC, "No '%s' found!", nodeName); + return NULL; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapXmlGetNodeValue +/-----------------------------------------------------------------*/ + +int +SoapXmlGetNodeValue(HSOAPXML xmlNode, char* dest) +{ + char *value; + int len; + const char* FUNC = "SoapXmlGetNodeValue"; + SoapTraceEnter(FUNC,"Entering"); + + + if (xmlNode == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'xmlNode' (null)"); + return 0; + } + + value = (char*)xmlNodeListGetString(((xmlNodePtr)xmlNode)->doc, + ((xmlNodePtr)xmlNode)->xmlChildrenNode,1); + strcpy(dest, value); + len = strlen(value); + xmlFree(value); + + SoapTraceLeave(FUNC, "Value = '%s'\nLength=%d", dest, len); + return len; + +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapXmlGetNodeValueAlloc +/-----------------------------------------------------------------*/ + +char* +SoapXmlGetNodeValueAlloc(HSOAPXML xmlNode) +{ + char *value; + int len; + const char* FUNC = "SoapXmlGetNodeValueAlloc"; + SoapTraceEnter(FUNC,"Entering"); + + + if (xmlNode == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'xmlNode' (null)"); + return 0; + } + + value = (char*)xmlNodeListGetString(((xmlNodePtr)xmlNode)->doc, + ((xmlNodePtr)xmlNode)->xmlChildrenNode,1); + SoapTraceLeave(FUNC, "Value = '%s'\n", value); + return value; +} + + +/*----------------------------------------------------------------- + FUNCTION: SoapXmlGetAttr +/-----------------------------------------------------------------*/ + +char* SoapXmlGetAttr(HSOAPXML node, const char* ns, const char* key) +{ + char *value; + int len; + const char* FUNC = "SoapXmlGetAttr"; + SoapTraceEnter(FUNC,"Entering"); + + + if (node == NULL) { + SoapTraceLeaveWithError(FUNC, + "Invalid parameter 'node' (null)"); + return NULL; + } + + if (ns == NULL) { + value = (char*)xmlGetProp(node, key); + } else { + value = (char*)xmlGetNsProp(node, key, ns); + } + + SoapTraceLeave(FUNC, "Value = '%s'\n", value?value:"(null)"); + return value; +} diff --git a/src/csoapxml.h b/src/csoapxml.h new file mode 100644 index 0000000..290d556 --- /dev/null +++ b/src/csoapxml.h @@ -0,0 +1,90 @@ +/****************************************************************** + * $Id: csoapxml.h,v 1.1 2003/03/25 22:17:33 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammet.net + ******************************************************************/ +#ifndef CSOAP_XML_H +#define CSOAP_XML_H + + +#include <libxml/xmlmemory.h> +#include <libxml/parser.h> + +#include "csoaperror.h" + + +typedef xmlNodePtr HSOAPXML; + + +/** + * Search for an xml node which + * has the name nodeName + * + * @param root the root xml node to search + * the nodeName in its children nodes + * @param nodeName the nodeName to find + * + * @return an xml node if any exist, + * NULL otherwise + */ +HSOAPXML SoapXmlFindNode(HSOAPXML root, const char* nodeName); + + +/** + * Receives the node value + * + * @param node the xml node to receive + * its text node + * @param dest the destination string + * + * @return length of content copied into dest + */ +int SoapXmlGetNodeValue(HSOAPXML node, char* dest); + + +/** + * Receives the node value. + * + * @param node the xml node to receive + * its text node + * + * @return An allocated string. You must free + * it using <B>SoapFreeStr</B> + * @see SoapFreeStr + */ +char* SoapXmlGetNodeValueAlloc(HSOAPXML node); + + +/** + * Returns the xml attribute + * + * @param node the xml node to receive its attribute + * @param ns namespace of the attribute + * @param key key of the attribute + * + * @return value of the attribute if any found, + * NULL otherwise. It's up to the caller to free + * the memory with SoapFreeStr(). + */ +char* SoapXmlGetAttr(HSOAPXML node, const char* ns, const char* key); + +#endif + |