Mercurial > repos > ktnyt > gembassy
diff GEMBASSY-1.0.3/gsoap/wsdl/soap.cpp @ 0:8300eb051bea draft
Initial upload
author | ktnyt |
---|---|
date | Fri, 26 Jun 2015 05:19:29 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GEMBASSY-1.0.3/gsoap/wsdl/soap.cpp Fri Jun 26 05:19:29 2015 -0400 @@ -0,0 +1,231 @@ +/* + soap.cpp + + WSDL/SOAP binding schema + +-------------------------------------------------------------------------------- +gSOAP XML Web services tools +Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. +This software is released under one of the following licenses: +GPL or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- + +*/ + +#include "wsdlH.h" // cannot include "schemaH.h" +#include "includes.h" + +extern const char *qname_token(const char*, const char*); +extern int is_builtin_qname(const char*); + +//////////////////////////////////////////////////////////////////////////////// +// +// soap:header +// +//////////////////////////////////////////////////////////////////////////////// + +int soap__header::traverse(wsdl__definitions& definitions) +{ if (vflag) + cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + messageRef = NULL; + partRef = NULL; + const char *token = qname_token(message, definitions.targetNamespace); + if (token) + { for (vector<wsdl__message>::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) + { if ((*message).name && !strcmp((*message).name, token)) + { messageRef = &(*message); + if (vflag) + cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; + break; + } + } + } + if (!messageRef) + { for (vector<wsdl__import>::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) + { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); + if (importdefinitions) + { token = qname_token(message, importdefinitions->targetNamespace); + if (token) + { for (vector<wsdl__message>::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) + { if ((*message).name && !strcmp((*message).name, token)) + { messageRef = &(*message); + if (vflag) + cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; + break; + } + } + } + } + } + } + if (messageRef) + { if (part) + { for (vector<wsdl__part>::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) + if ((*pt).name && !strcmp((*pt).name, part)) + { partRef = &(*pt); + break; + } + } + if (!partRef) + cerr << "Warning: soap header has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + } + else + cerr << "Warning: could not find soap header part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + for (vector<soap__headerfault>::iterator i = headerfault.begin(); i != headerfault.end(); ++i) + (*i).traverse(definitions); + return SOAP_OK; +} + +void soap__header::messagePtr(wsdl__message *message) +{ messageRef = message; +} + +wsdl__message *soap__header::messagePtr() const +{ return messageRef; +} + +void soap__header::partPtr(wsdl__part *part) +{ partRef = part; +} + +wsdl__part *soap__header::partPtr() const +{ return partRef; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// soap:headerfault +// +//////////////////////////////////////////////////////////////////////////////// + +int soap__headerfault::traverse(wsdl__definitions& definitions) +{ if (vflag) + cerr << " Analyzing soap headerfault in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + messageRef = NULL; + partRef = NULL; + const char *token = qname_token(message, definitions.targetNamespace); + if (token) + { for (vector<wsdl__message>::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) + { if ((*message).name && !strcmp((*message).name, token)) + { messageRef = &(*message); + if (vflag) + cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; + break; + } + } + } + else + { for (vector<wsdl__import>::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) + { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); + if (importdefinitions) + { token = qname_token(message, importdefinitions->targetNamespace); + if (token) + { for (vector<wsdl__message>::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) + { if ((*message).name && !strcmp((*message).name, token)) + { messageRef = &(*message); + if (vflag) + cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; + break; + } + } + } + } + } + } + if (messageRef) + { if (part) + { for (vector<wsdl__part>::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) + if ((*pt).name && !strcmp((*pt).name, part)) + { partRef = &(*pt); + break; + } + } + if (!partRef) + cerr << "Warning: soap headerfault has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + } + else + cerr << "Warning: could not find soap headerfault part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wSDL definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + return SOAP_OK; +} + +void soap__headerfault::messagePtr(wsdl__message *message) +{ messageRef = message; +} + +wsdl__message *soap__headerfault::messagePtr() const +{ return messageRef; +} + +void soap__headerfault::partPtr(wsdl__part *part) +{ partRef = part; +} + +wsdl__part *soap__headerfault::partPtr() const +{ return partRef; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// wsoap:header +// +//////////////////////////////////////////////////////////////////////////////// + +int wsoap__header::traverse(wsdl__definitions& definitions) +{ if (vflag) + cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + elementRef = NULL; + // WSDL 2.0 + if (element) + { if (definitions.types) + { for (vector<xs__schema*>::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) + { const char *token = qname_token(element, (*schema)->targetNamespace); + if (token) + { for (vector<xs__element>::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) + { if ((*element).name && !strcmp((*element).name, token)) + { elementRef = &(*element); + if (vflag) + cerr << " Found soap header element '" << (token?token:"") << "'" << endl; + break; + } + } + } + } + } + if (!elementRef) + { if (is_builtin_qname(element)) + definitions.builtinElement(element); + else + if (!Wflag) + cerr << "Warning: no soap header element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; + } + } + return SOAP_OK; +} + +void wsoap__header::elementPtr(xs__element *element) +{ elementRef = element; +} + +xs__element *wsoap__header::elementPtr() const +{ return elementRef; +}