From: František Dvořák Date: Wed, 28 Feb 2007 15:00:35 +0000 (+0000) Subject: Gsoap compatiblity, 1. part: error handling and choice type. X-Git-Tag: glite-jp-ws-interface_R_1_2_2_1~1 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=c0d55bb971fa5b17665e9e124bab3ccbbceae94f;p=jra1mw.git Gsoap compatiblity, 1. part: error handling and choice type. So compatible with 2.7.6b for now. --- diff --git a/org.glite.jp.ws-interface/Makefile b/org.glite.jp.ws-interface/Makefile index d820796..905d02e 100644 --- a/org.glite.jp.ws-interface/Makefile +++ b/org.glite.jp.ws-interface/Makefile @@ -5,6 +5,7 @@ top_builddir=${top_srcdir}/${builddir} stagedir=. distdir=. globalprefix=glite +jpprefix=jp package=glite-jp-ws-interface version=0.0.0 PREFIX=/opt/glite @@ -46,10 +47,12 @@ distbin: install: -mkdir -p ${PREFIX}/${STAGETO} -mkdir -p ${PREFIX}/share/doc/${package}-${version} + -mkdir -p ${PREFIX}/include/${globalprefix}/${jpprefix} install -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} -install -m 644 JobProvenance.html ${PREFIX}/share/doc/${package}-${version} # cd ${top_srcdir}/interface && install -m 644 ${WSDL} ${PREFIX}/${STAGETO} install -m 644 ${WSDL} ${XSD} ${PREFIX}/${STAGETO} + install -m 644 ${top_srcdir}/src/ws_fault.c ${PREFIX}/include/${globalprefix}/${jpprefix} clean: rm -f *.h diff --git a/org.glite.jp.ws-interface/src/ws_fault.c b/org.glite.jp.ws-interface/src/ws_fault.c new file mode 100644 index 0000000..54e91cb --- /dev/null +++ b/org.glite.jp.ws-interface/src/ws_fault.c @@ -0,0 +1,107 @@ +#ident "$Header: " + +#include +#include +#include + +#if GSOAP_VERSION >= 20709 + #define GSOAP_FAULT(DETAIL) ((DETAIL)->jpelem__genericFault) +#elif GSOAP_VERSION >= 20700 + #define GSOAP_FAULT(DETAIL) (((struct _genericFault *)(DETAIL)->fault)->jpelem__genericFault) +#else + #define GSOAP_FAULT(DETAIL) (((struct _genericFault *)(DETAIL)->value)->jptype__genericFault) +#endif +#define GSOAP_STRING(CHOICE) GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, string, jptype__stringOrBlob, 1) +#define GSOAP_BLOB(CHOICE) GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, blob, jptype__stringOrBlob, 1) + +#ifndef dprintf +#define dprintf(x) printf x +#endif + +static int glite_jp_clientCheckFault(struct soap *soap, int err, const char *name, int toSyslog) { + struct SOAP_ENV__Detail *detail; + struct jptype__genericFault *f; + char *reason,indent[200] = " "; + char *prefix; + int retval; + + if (name) asprintf(&prefix, "[%s] ", name); + else prefix = strdup(""); + retval = 0; + + switch(err) { + case SOAP_OK: + dprintf(("%sOK\n", prefix)); + break; + + case SOAP_FAULT: + case SOAP_SVR_FAULT: + detail = GLITE_SECURITY_GSOAP_DETAIL(soap); + reason = GLITE_SECURITY_GSOAP_REASON(soap); + dprintf(("%s%s\n", prefix, reason)); + if (toSyslog) syslog(LOG_ERR, "%s", reason); + if (!( +#ifdef SOAP_TYPE__genericFault + (detail->__type == SOAP_TYPE__genericFault) || +#endif +#ifdef SOAP_TYPE_jptype__genericFault + (detail->__type == SOAP_TYPE_jptype__genericFault) || +#endif +#ifdef SOAP_TYPE_lbt__genericFault + (detail->__type == SOAP_TYPE_lbt__genericFault) || +#endif + 0)) assert(1); + f = GSOAP_FAULT(detail); + + while (f) { + dprintf(("%s%s%s: %s (%s)\n", + prefix, indent, + f->source, f->text, f->description)); + if (toSyslog) syslog(LOG_ERR, "%s%s: %s (%s)", + reason, f->source, f->text, f->description); + f = f->reason; + strcat(indent," "); + } + retval = -1; + + default: + soap_print_fault(soap,stderr); + retval = -1; + } + + free(prefix); + return retval; +} + + +static struct jptype__genericFault *jp2s_error(struct soap *soap, const glite_jp_error_t *err) +{ + struct jptype__genericFault *ret = NULL; + if (err) { + ret = soap_malloc(soap,sizeof *ret); + memset(ret,0,sizeof *ret); + ret->code = err->code; + ret->source = soap_strdup(soap,err->source); + ret->text = soap_strdup(soap,strerror(err->code)); + ret->description = soap_strdup(soap,err->desc); + ret->reason = jp2s_error(soap,err->reason); + } + return ret; +} + + +static void glite_jp_server_err2fault(const glite_jp_context_t ctx,struct soap *soap) +{ + struct SOAP_ENV__Detail *detail = soap_malloc(soap,sizeof *detail); + struct _genericFault *f = soap_malloc(soap,sizeof *f); + + f->jpelem__genericFault = jp2s_error(soap,ctx->error); + + detail->__type = SOAP_TYPE__genericFault; + GSOAP_FAULT(detail) = f; + detail->__any = NULL; + + soap_receiver_fault(soap,"Oh, shit!",NULL); + if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail; + else soap->fault->detail = detail; +}