Mercurial > repos > ktnyt > gembassy
diff GEMBASSY-1.0.3/gsoap/wsdl/wsdl.cpp @ 2:8947fca5f715 draft default tip
Uploaded
author | ktnyt |
---|---|
date | Fri, 26 Jun 2015 05:21:44 -0400 |
parents | 84a17b3fad1f |
children |
line wrap: on
line diff
--- a/GEMBASSY-1.0.3/gsoap/wsdl/wsdl.cpp Fri Jun 26 05:20:29 2015 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1536 +0,0 @@ -/* - wsdl.cpp - - WSDL 1.1 and WSDL 2.0 binding schema implementation - --------------------------------------------------------------------------------- -gSOAP XML Web services tools -Copyright (C) 2000-2012, 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" -#include "includes.h" - -extern struct Namespace namespaces[]; - -const char *qname_token(const char *QName, const char *URI) -{ if (QName && QName[0] == '"' && QName[1] == '"' && QName[2] == ':') - return QName + 3; - if (QName && URI && *QName == '"') // QNames are stored in the format "URI":name, unless the URI is in the nsmap - { size_t n = strlen(URI); - if (!strncmp(QName + 1, URI, n) && QName[n + 1] == '"') - return QName + n + 3; - } - return NULL; -} - -int is_builtin_qname(const char *QName) -{ if (iflag) - return 1; - if (QName) - { if (*QName == '#') // reserved QNames - return 0; - if (*QName != '"') - return 1; // if the QName does not start with a ", it must be in the nsmap - const char *s = strchr(QName + 1, '"'); - if (s) - { size_t n = s - QName - 1; - for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) - if (strlen(*i) == n && !strncmp(QName + 1, *i, n)) - return 1; // QName is in exturis - } - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// wsdl -// -//////////////////////////////////////////////////////////////////////////////// - -extern "C" { -int warn_ignore(struct soap*, const char*); -int show_ignore(struct soap*, const char*); -} - -wsdl__definitions::wsdl__definitions() -{ soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); -#ifdef HTTPDA_H - soap_register_plugin(soap, http_da); -#endif -#ifdef WITH_OPENSSL - soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); -#endif - soap_set_namespaces(soap, namespaces); - soap_default(soap); - if (vflag) - soap->fignore = show_ignore; - else - soap->fignore = warn_ignore; - soap->encodingStyle = NULL; - soap->proxy_host = proxy_host; - soap->proxy_port = proxy_port; - soap->proxy_userid = proxy_userid; - soap->proxy_passwd = proxy_passwd; - name = NULL; - targetNamespace = soap_strdup(soap, ""); - documentation = NULL; - types = NULL; - updated = false; - location = NULL; - redirs = 0; -} - -wsdl__definitions::wsdl__definitions(struct soap *copy, const char *cwd, const char *loc) -{ soap = soap_copy(copy); - soap->socket = SOAP_INVALID_SOCKET; - soap->recvfd = 0; - soap->sendfd = 1; - strcpy(soap->host, copy->host); - soap_default(soap); - soap->fignore = warn_ignore; - soap->encodingStyle = NULL; - updated = false; - location = NULL; - redirs = 0; - read(cwd, loc); -} - -wsdl__definitions::~wsdl__definitions() -{ soap_destroy(soap); - soap_end(soap); - soap_done(soap); - free(soap); -} - -int wsdl__definitions::get(struct soap *soap) -{ return preprocess(); -} - -int wsdl__definitions::read(int num, char **loc) -{ if (num <= 0) - return read((const char*)NULL, (const char*)NULL); - if (num == 1) - return read((const char*)NULL, loc[0]); - wsdl__import im; - im.namespace_ = NULL; - name = soap_strdup(soap, "WSDL"); - targetNamespace = soap_strdup(soap, "");; - for (int i = 0; i < num; i++) - { im.location = loc[i]; - import.push_back(im); - } - return preprocess(); -} - -int wsdl__definitions::read(const char *cwd, const char *loc) -{ const char *cwd_temp; - if (!cwd) - cwd = cwd_path; - if (vflag) - fprintf(stderr, "\nOpening WSDL/XSD '%s' from '%s'\n", loc?loc:"", cwd?cwd:""); - if (loc) - { if (soap->recvfd > 2) - { soap_end_recv(soap); - close(soap->recvfd); - soap->recvfd = -1; - } - else if (soap_valid_socket(soap->socket)) - { soap_end_recv(soap); - soap_closesock(soap); - } -#ifdef WITH_OPENSSL - if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) -#else - if (!strncmp(loc, "https://", 8)) - { fprintf(stderr, "\nCannot connect to https site: no SSL support, please rebuild wsdl2h with SSL or download the files and rerun wsdl2h\n"); - exit(1); - } - else if (!strncmp(loc, "http://", 7)) -#endif - { fprintf(stderr, "\nConnecting to '%s' to retrieve WSDL/XSD...\n", loc); - location = soap_strdup(soap, loc); - if (soap_connect_command(soap, SOAP_GET, location, NULL)) - { fprintf(stderr, "Connection failed\n"); - soap_print_fault(soap, stderr); - exit(1); - } - fprintf(stderr, "Connected, receiving...\n"); - } - else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) - { char *s; - location = (char*)soap_malloc(soap, strlen(cwd) + strlen(loc) + 2); - strcpy(location, cwd); - s = strrchr(location, '/'); - if (s) - *s = '\0'; - strcat(location, "/"); - strcat(location, loc); - fprintf(stderr, "\nConnecting to '%s' to retrieve relative path '%s' WSDL/XSD...\n", location, loc); - if (soap_connect_command(soap, SOAP_GET, location, NULL)) - { fprintf(stderr, "Connection failed\n"); - exit(1); - } - fprintf(stderr, "Connected, receiving...\n"); - } - else - { soap->recvfd = open(loc, O_RDONLY, 0); - if (soap->recvfd < 0) - { if (cwd) - { char *s; - location = (char*)soap_malloc(soap, strlen(cwd) + strlen(loc) + 2); - strcpy(location, cwd); - s = strrchr(location, '/'); -#ifdef WIN32 - if (!s) - s = strrchr(location, '\\'); -#endif - if (s) - *s = '\0'; - strcat(location, "/"); - strcat(location, loc); - if (!strncmp(location, "file://", 7)) - location += 7; - soap->recvfd = open(location, O_RDONLY, 0); - } - if (soap->recvfd < 0 && import_path) - { location = (char*)soap_malloc(soap, strlen(import_path) + strlen(loc) + 2); - strcpy(location, import_path); - strcat(location, "/"); - strcat(location, loc); - if (!strncmp(location, "file://", 7)) - location += 7; - soap->recvfd = open(location, O_RDONLY, 0); - } - if (soap->recvfd < 0) - { fprintf(stderr, "\nCannot open '%s'\n", loc); - exit(1); - } - } - else - location = soap_strdup(soap, loc); - fprintf(stderr, "\nReading file '%s'...\n", location); - } - } - cwd_temp = cwd_path; - cwd_path = location; - if (!soap_begin_recv(soap)) - this->soap_in(soap, "wsdl:", NULL); - if (soap->error) - { // handle sloppy WSDLs that import schemas at the top level rather than - // importing them in <types> - if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) - { soap_retry(soap); - xs__schema *schema = soap_new_xs__schema(soap, -1); - schema->soap_in(soap, "xs:schema", NULL); - if (soap->error) - { fprintf(stderr, "\nAn error occurred while parsing WSDL or XSD from '%s'\n", loc?loc:""); - soap_print_fault(soap, stderr); - if (soap->error < 200) - soap_print_fault_location(soap, stderr); - exit(1); - } - name = NULL; - targetNamespace = schema->targetNamespace; - if (vflag) - cerr << "Found schema '" << (targetNamespace?targetNamespace:"") << "' when expecting WSDL" << endl; - types = soap_new_wsdl__types(soap, -1); - types->documentation = NULL; - types->xs__schema_.push_back(schema); - types->preprocess(*this); - } - // check HTTP redirect (socket was closed) - else if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) - { int r = SOAP_ERR; - fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); - if (redirs++ < 10) - r = read(cwd, soap->endpoint); - else - fprintf(stderr, "\nMax redirects exceeded\n"); - redirs--; - return r; - } - else if (soap->error == 401) - { int r = SOAP_ERR; - fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); - if (auth_userid && auth_passwd && redirs++ < 1) - { -#ifdef HTTPDA_H - struct http_da_info info; - http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); -#else - soap->userid = auth_userid; - soap->passwd = auth_passwd; -#endif - r = read(cwd, loc); -#ifdef HTTPDA_H - http_da_release(soap, &info); -#endif - redirs--; - } - else - fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); - return r; - } - else - { fprintf(stderr, "\nAn error occurred while parsing WSDL from '%s'\n", loc?loc:""); - soap_print_fault(soap, stderr); - if (soap->error < 200) - soap_print_fault_location(soap, stderr); - exit(1); - } - } - fprintf(stderr, "Done reading '%s'\n", loc?loc:""); - soap_end_recv(soap); - if (soap->recvfd > 2) - { close(soap->recvfd); - soap->recvfd = -1; - } - else - soap_closesock(soap); - cwd_path = cwd_temp; - return SOAP_OK; -} - -int wsdl__definitions::preprocess() -{ if (vflag) - cerr << "Preprocessing wsdl definitions '" << (location?location:"") << "' namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - // process import - for (vector<wsdl__import>::iterator im1 = import.begin(); im1 != import.end(); ++im1) - (*im1).preprocess(*this); - // merge nested imported WSDLs into single import list -again: - for (vector<wsdl__import>::iterator im2 = import.begin(); im2 != import.end(); ++im2) - { if ((*im2).definitionsPtr()) - { for (vector<wsdl__import>::iterator i = (*im2).definitionsPtr()->import.begin(); i != (*im2).definitionsPtr()->import.end(); ++i) - { if ((*i).definitionsPtr()) - { bool found = false; - if (vflag) - cerr << "Import WSDL '" << ((*i).location?(*i).location:"") << endl; - for (vector<wsdl__import>::iterator j = import.begin(); j != import.end(); ++j) - { if ((*i).definitionsPtr() == (*j).definitionsPtr() - || ((*i).location && (*j).location && !strcmp((*i).location, (*j).location))) - { found = true; - break; - } - } - if (!found) - { if (vflag) - cerr << "Adding imported WSDL '" << ((*i).location?(*i).location:"") << "' to '" << (location?location:"") << "' ('" << (name?name:"") << "') namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - import.push_back(*i); - goto again; - } - } - } - } - } - // merge <types> - for (vector<wsdl__import>::iterator im3 = import.begin(); im3 != import.end(); ++im3) - { if ((*im3).definitionsPtr() && (*im3).definitionsPtr()->types) - { if (!types) - { types = soap_new_wsdl__types(soap, -1); - types->soap_default(soap); - } - // merge <types>, check for duplicates, add namespaces for sloppy imports - for (vector<xs__schema*>::const_iterator i = (*im3).definitionsPtr()->types->xs__schema_.begin(); i != (*im3).definitionsPtr()->types->xs__schema_.end(); ++i) - { bool found = false; - vector<xs__schema*>::const_iterator j; - if (!(*i)->targetNamespace) - { (*i)->targetNamespace = targetNamespace; - if (!Wflag) - cerr << "Warning: schema without namespace, assigning namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - } - for (j = types->xs__schema_.begin(); j != types->xs__schema_.end(); ++j) - { if ((*j)->targetNamespace && !strcmp((*i)->targetNamespace, (*j)->targetNamespace)) - { found = true; - break; - } - } - // add new schema only if not already in <types>, otherwise merge schema components - if (found) - { if (vflag) - cerr << "Warning: duplicate schema with namespace '" << ((*i)->targetNamespace?(*i)->targetNamespace:"") << "' merged in WSDL '" << (name?name:"") << "' namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - (*j)->insert(*(*i)); - } - else - { if (vflag) - cerr << "Adding schema with namespace '" << ((*i)->targetNamespace?(*i)->targetNamespace:"") << "' to types in WSDL '" << (name?name:"") << "' namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - types->xs__schema_.push_back(*i); - } - } - } - } - // process the types - if (types) - types->preprocess(*this); - return SOAP_OK; -} - -int wsdl__definitions::traverse() -{ if (updated) - return SOAP_OK; - if (vflag) - cerr << "Analyzing definitions '" << (name?name:"") << "' in wsdl namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - updated = true; - if (!targetNamespace) - { if (vflag) - cerr << "Warning: wsdl '" << (name?name:"") << "' has no targetNamespace" << endl; - targetNamespace = soap_strdup(soap, ""); - } - // process import first - for (vector<wsdl__import>::iterator im = import.begin(); im != import.end(); ++im) - (*im).traverse(*this); - // then process the types - if (types) - types->traverse(*this); - // process messages before portType - for (vector<wsdl__message>::iterator mg = message.begin(); mg != message.end(); ++mg) - (*mg).traverse(*this); - // process portType before binding - for (vector<wsdl__portType>::iterator pt = portType.begin(); pt != portType.end(); ++pt) - (*pt).traverse(*this); - // process interface before binding WSDL 2.0 - for (vector<wsdl__portType>::iterator in = interface_.begin(); in != interface_.end(); ++in) - (*in).traverse(*this); - // process binding - for (vector<wsdl__binding>::iterator bg = binding.begin(); bg != binding.end(); ++bg) - (*bg).traverse(*this); - // process service - for (vector<wsdl__service>::iterator sv = service.begin(); sv != service.end(); ++sv) - (*sv).traverse(*this); - if (vflag) - cerr << "End of definitions '" << (name?name:"") << "' namespace '" << (targetNamespace?targetNamespace:"") << "'" << endl; - for (std::vector<wsp__Policy>::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) - (*p).traverse(*this); - return SOAP_OK; -} - -const char *wsdl__definitions::sourceLocation() -{ return location; -} - -int wsdl__definitions::error() -{ return soap->error; -} - -void wsdl__definitions::print_fault() -{ soap_print_fault(soap, stderr); - if (soap->error < 200) - soap_print_fault_location(soap, stderr); -} - -void wsdl__definitions::builtinType(const char *type) -{ builtinTypeSet.insert(type); -} - -void wsdl__definitions::builtinTypes(const SetOfString& types) -{ for (SetOfString::const_iterator tp = types.begin(); tp != types.end(); ++tp) - builtinTypeSet.insert(*tp); -} - -void wsdl__definitions::builtinElement(const char *element) -{ builtinElementSet.insert(element); -} - -void wsdl__definitions::builtinElements(const SetOfString& elements) -{ for (SetOfString::const_iterator el = elements.begin(); el != elements.end(); ++el) - builtinElementSet.insert(*el); -} - -void wsdl__definitions::builtinAttribute(const char *attribute) -{ builtinAttributeSet.insert(attribute); -} - -void wsdl__definitions::builtinAttributes(const SetOfString& attributes) -{ for (SetOfString::const_iterator at = attributes.begin(); at != attributes.end(); ++at) - builtinAttributeSet.insert(*at); -} - -const SetOfString& wsdl__definitions::builtinTypes() const -{ return builtinTypeSet; -} - -const SetOfString& wsdl__definitions::builtinElements() const -{ return builtinElementSet; -} - -const SetOfString& wsdl__definitions::builtinAttributes() const -{ return builtinAttributeSet; -} - -int wsdl__service::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << "Analyzing service '" << (name?name:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - // process ports - for (vector<wsdl__port>::iterator pt = port.begin(); pt != port.end(); ++pt) - (*pt).traverse(definitions); - for (vector<wsdl__port>::iterator ep = endpoint.begin(); ep != endpoint.end(); ++ep) - (*ep).traverse(definitions); - for (vector<wsp__Policy>::iterator py = wsp__Policy_.begin(); py != wsp__Policy_.end(); ++py) - (*py).traverse(definitions); - for (vector<wsp__PolicyReference>::iterator pr = wsp__PolicyReference_.begin(); pr != wsp__PolicyReference_.end(); ++pr) - (*pr).traverse(definitions); - return SOAP_OK; -} - -wsdl__port::wsdl__port() -{ bindingRef = NULL; -} - -int wsdl__port::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing service port/endpoint in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - // search binding name - const char *token = qname_token(binding, definitions.targetNamespace); - bindingRef = NULL; - if (token) - { for (vector<wsdl__binding>::iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) - { if ((*binding).name && !strcmp((*binding).name, token)) - { bindingRef = &(*binding); - if (vflag) - cerr << " Found port/endpoint '" << (name?name:"") << "' binding '" << (token?token:"") << "'" << endl; - break; - } - } - } - if (!bindingRef) - { for (vector<wsdl__import>::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) - { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); - if (importdefinitions) - { token = qname_token(binding, importdefinitions->targetNamespace); - if (token) - { for (vector<wsdl__binding>::iterator binding = importdefinitions->binding.begin(); binding != importdefinitions->binding.end(); ++binding) - { if ((*binding).name && !strcmp((*binding).name, token)) - { bindingRef = &(*binding); - if (vflag) - cerr << " Found port/endpoint '" << (name?name:"") << "' binding '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - } - if (!bindingRef) - if (!Wflag) - cerr << "Warning: no port/endpoint '" << (name?name:"") << "' binding '" << (binding?binding:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -void wsdl__port::bindingPtr(wsdl__binding *binding) -{ bindingRef = binding; - if (!bindingRef && vflag) - cerr << "Warning: wsdl__port binding set to NULL" << endl; -} - -wsdl__binding *wsdl__port::bindingPtr() const -{ return bindingRef; -} - -wsdl__binding::wsdl__binding() -{ portTypeRef = NULL; -} - -int wsdl__binding::traverse(wsdl__definitions& definitions) -{ const char *token; - if (vflag) - cerr << " Analyzing binding '" << (name?name:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - portTypeRef = NULL; - if (interface_) // WSDL 2.0 - token = qname_token(interface_, definitions.targetNamespace); - else - token = qname_token(type, definitions.targetNamespace); - if (token) - { for (vector<wsdl__portType>::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) - { if ((*portType).name && !strcmp((*portType).name, token)) - { portTypeRef = &(*portType); - if (vflag) - cerr << " Found binding '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << endl; - break; - } - } - // WSDL 2.0 - for (vector<wsdl__portType>::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) - { if ((*i).name && !strcmp((*i).name, token)) - { portTypeRef = &(*i); - if (vflag) - cerr << " Found binding '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << endl; - break; - } - } - } - if (!portTypeRef) - { for (vector<wsdl__import>::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) - { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); - if (importdefinitions) - { if (interface_) // WSDL 2.0 - token = qname_token(interface_, importdefinitions->targetNamespace); - else - token = qname_token(type, importdefinitions->targetNamespace); - if (token) - { for (vector<wsdl__portType>::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) - { if ((*portType).name && !strcmp((*portType).name, token)) - { portTypeRef = &(*portType); - if (vflag) - cerr << " Found binding '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << endl; - break; - } - } - // WSDL 2.0 - for (vector<wsdl__portType>::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) - { if ((*i).name && !strcmp((*i).name, token)) - { portTypeRef = &(*i); - if (vflag) - cerr << " Found binding '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - } - if (!portTypeRef) - { if (!Wflag) - { if (interface_) - cerr << "Warning: no binding '" << (name?name:"") << "' interface '" << (interface_?interface_:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - else - cerr << "Warning: no binding '" << (name?name:"") << "' portType '" << (type?type:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - } - // WSDL 2.0 - for (vector<wsdl__ext_fault>::iterator f = fault.begin(); f != fault.end(); ++f) - (*f).traverse(definitions, portTypeRef); - for (vector<wsdl__ext_operation>::iterator i = operation.begin(); i != operation.end(); ++i) - (*i).traverse(definitions, portTypeRef); - for (vector<wsp__Policy>::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) - (*p).traverse(definitions); - for (vector<wsp__PolicyReference>::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) - (*r).traverse(definitions); - return SOAP_OK; -} - -void wsdl__binding::portTypePtr(wsdl__portType *portType) -{ portTypeRef = portType; - if (!portTypeRef && vflag) - cerr << "Warning: wsdl__binding portType set to NULL" << endl; -} - -wsdl__portType *wsdl__binding::portTypePtr() const -{ return portTypeRef; -} - -wsdl__ext_operation::wsdl__ext_operation() -{ operationRef = NULL; -} - -int wsdl__ext_operation::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) -{ if (vflag) - cerr << " Analyzing binding operation '" << (name?name:ref?ref:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - if (input) - input->traverse(definitions); - if (output) - output->traverse(definitions); - for (vector<wsdl__ext_fault>::iterator f = fault.begin(); f != fault.end(); ++f) - (*f).traverse(definitions, portTypeRef); - // WSDL 2.0 - for (vector<wsdl__ext_fault>::iterator fi = infault.begin(); fi != infault.end(); ++fi) - (*fi).traverse(definitions, portTypeRef); - for (vector<wsdl__ext_fault>::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) - (*fo).traverse(definitions, portTypeRef); - operationRef = NULL; - if (portTypeRef) - { // WSDL 2.0, assumption: ref refers to an operation in the interface for this binding - const char *token = NULL; - if (ref) - token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); - for (vector<wsdl__operation>::iterator i = portTypeRef->operation.begin(); i != portTypeRef->operation.end(); ++i) - { if (token) - { if ((*i).name && !strcmp((*i).name, token)) - { operationRef = &(*i); - if (vflag) - cerr << " Found operation '" << token << "' in interface '" << portTypeRef->name << "'" << endl; - break; - } - } - else if (name && (*i).name && !strcmp((*i).name, name)) - { if ((!input - || !input->name - || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput1.input->name && !strcmp((*i).__ioput1.input->name, input->name)) - || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput2.input->name && !strcmp((*i).__ioput2.input->name, input->name)) - ) - && (!output - || !output->name - || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput1.output->name && !strcmp((*i).__ioput1.output->name, output->name)) - || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput2.output->name && !strcmp((*i).__ioput2.output->name, output->name)) - )) - { operationRef = &(*i); - if (vflag) - cerr << " Found operation '" << name << "' in portType '" << portTypeRef->name << "'" << endl; - break; - } - } - } - if (name && !operationRef) - { for (vector<wsdl__operation>::iterator j = portTypeRef->operation.begin(); j != portTypeRef->operation.end(); ++j) - { if ((*j).name && !strcmp((*j).name, name)) - { if (input - && input->name - && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput1.input->name && !strcmp((*j).__ioput1.input->name, input->name)) - || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput2.input->name && !strcmp((*j).__ioput2.input->name, input->name)) - )) - cerr << "Warning: no matching portType operation input name '" << input->name << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - if (output - && output->name - && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput1.output->name && !strcmp((*j).__ioput1.output->name, output->name)) - || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput2.output->name && !strcmp((*j).__ioput2.output->name, output->name)) - )) - cerr << "Warning: no matching portType operation output name '" << output->name << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - operationRef = &(*j); - if (vflag) - cerr << " Found operation '" << name << "'" << endl; - break; - } - } - } - } - if (!operationRef) - { if (!Wflag) - { if (ref) - cerr << "Warning: no matching interface operation '" << (ref?ref:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - else - cerr << "Warning: no matching portType operation '" << (name?name:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - } - else - { for (vector<wsdl__ext_fault>::iterator i = fault.begin(); i != fault.end(); ++i) - { if ((*i).name) - { for (vector<wsdl__fault>::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) - { if ((*j).name && !strcmp((*j).name, (*i).name)) - { (*i).faultPtr(&(*j)); - if (vflag) - cerr << " Found fault '" << (*j).name << "' message" << endl; - break; - } - } - } - else if ((*i).soap__fault_ && (*i).soap__fault_->name) // try the soap:fault name, this is not elegant, but neither is WSDL 1.1 - { for (vector<wsdl__fault>::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) - { if ((*j).name && !strcmp((*j).name, (*i).soap__fault_->name)) - { (*i).faultPtr(&(*j)); - if (vflag) - cerr << " Found fault '" << ((*j).name?(*j).name:"") << "' message" << endl; - break; - } - } - } - if (!(*i).faultPtr()) - if (!Wflag) - cerr << "Warning: no soap:fault '" << ((*i).name?(*i).name:"") << "' message in wsdl definitions '" << (definitions.name?definitions.name:"") << "' operation '" << (name?name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - } - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -void wsdl__ext_operation::operationPtr(wsdl__operation *operation) -{ operationRef = operation; - if (!operationRef && vflag) - cerr << "Warning: wsdl__ext_operation operation set to NULL" << endl; -} - -wsdl__operation *wsdl__ext_operation::operationPtr() const -{ return operationRef; -} - -int wsdl__ext_ioput::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing binding operation input/output in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - for (vector<soap__header>::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) - (*hd).traverse(definitions); - for (vector<wsoap__header>::iterator whd = wsoap__header_.begin(); whd != wsoap__header_.end(); ++whd) - (*whd).traverse(definitions); - if (mime__multipartRelated_) - mime__multipartRelated_->traverse(definitions); - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -wsdl__ext_fault::wsdl__ext_fault() -{ faultRef = NULL; -} - -int wsdl__ext_fault::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) -{ if (vflag) - cerr << " Analyzing binding operation fault in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - if (ref && portTypeRef) - { // WSDL 2.0, assumption: ref refers to a fault in the interface for this binding - const char *token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); - if (token) - { for (vector<wsdl__fault>::iterator fault = portTypeRef->fault.begin(); fault != portTypeRef->fault.end(); ++fault) - { if ((*fault).name && !strcmp((*fault).name, token)) - { faultRef = &(*fault); - if (vflag) - cerr << " Found fault '" << (*fault).name << endl; - break; - } - } - } - if (!faultRef) - if (!Wflag) - cerr << "Warning: no fault '" << (ref?ref:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' interface '" << (portTypeRef->name?portTypeRef->name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -void wsdl__ext_fault::faultPtr(wsdl__fault *fault) -{ faultRef = fault; - if (!faultRef && vflag) - cerr << "Warning: wsdl__ext_fault fault ref set to NULL" << endl; -} - -wsdl__fault *wsdl__ext_fault::faultPtr() const -{ return faultRef; -} - -wsdl__portType::wsdl__portType() -{ definitionsRef = NULL; -} - -int wsdl__portType::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing portType/interface '" << (name?name:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - definitionsRef = &definitions; - // traverse faults before operations, WSDL 2.0 - for (vector<wsdl__fault>::iterator f = fault.begin(); f != fault.end(); ++f) - (*f).traverse(definitions); - for (vector<wsdl__operation>::iterator i = operation.begin(); i != operation.end(); ++i) - (*i).traverse(definitions); - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -void wsdl__portType::definitionsPtr(wsdl__definitions *definitions) -{ definitionsRef = definitions; -} - -wsdl__definitions *wsdl__portType::definitionsPtr() const -{ return definitionsRef; -} - -int wsdl__operation::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing portType/interface operation '" << (name?name:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - if (__union1 == SOAP_UNION_wsdl__union_ioput_input) - if (__ioput1.input) - __ioput1.input->traverse(definitions); - if (__union1 == SOAP_UNION_wsdl__union_ioput_output) - if (__ioput1.output) - __ioput1.output->traverse(definitions); - if (__union2 == SOAP_UNION_wsdl__union_ioput_input) - if (__ioput2.input) - __ioput2.input->traverse(definitions); - if (__union2 == SOAP_UNION_wsdl__union_ioput_output) - if (__ioput2.output) - __ioput2.output->traverse(definitions); - for (vector<wsdl__fault>::iterator i = fault.begin(); i != fault.end(); ++i) - (*i).traverse(definitions); - // WSDL 2.0 - for (vector<wsdl__fault>::iterator fi = infault.begin(); fi != infault.end(); ++fi) - (*fi).traverse(definitions); - for (vector<wsdl__fault>::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) - (*fo).traverse(definitions); - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -wsdl__ioput::wsdl__ioput() -{ messageRef = NULL; - elementRef = NULL; -} - -int wsdl__ioput::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing portType/interface operation input/output in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - messageRef = NULL; - 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 input/output '" << (messageLabel?messageLabel:"") << "' element '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - if (*element != '#' && !elementRef) - { if (is_builtin_qname(element)) - definitions.builtinElement(element); - else - if (!Wflag) - cerr << "Warning: no input/output '" << (messageLabel?messageLabel:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - } - else - { 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 input/output '" << (name?name:"") << "' 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 input/output '" << (name?name:"") << "' message '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - } - if (!messageRef) - if (!Wflag) - cerr << "Warning: no input/output '" << (name?name:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -void wsdl__ioput::messagePtr(wsdl__message *message) -{ messageRef = message; -} - -wsdl__message *wsdl__ioput::messagePtr() const -{ return messageRef; -} - -void wsdl__ioput::elementPtr(xs__element *element) -{ elementRef = element; -} - -xs__element *wsdl__ioput::elementPtr() const -{ return elementRef; -} - -wsdl__fault::wsdl__fault() -{ messageRef = NULL; - elementRef = NULL; -} - -int wsdl__fault::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing portType/interface operation faults in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - messageRef = NULL; - elementRef = NULL; - // WSDL 2.0 - if (ref) - { const char *token = qname_token(ref, definitions.targetNamespace); - if (token) - { for (vector<wsdl__portType>::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) - { for (vector<wsdl__fault>::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) - { if ((*fault).name && !strcmp((*fault).name, token)) - { elementRef = (*fault).elementPtr(); - if (vflag) - cerr << " Found fault '" << (ref?ref:"") << "' element '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - if (!elementRef) - { 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__portType>::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) - { for (vector<wsdl__fault>::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) - { if ((*fault).name && !strcmp((*fault).name, token)) - { elementRef = (*fault).elementPtr(); - if (vflag) - cerr << " Found fault '" << (ref?ref:"") << "' element '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - } - } - if (!elementRef) - { if (is_builtin_qname(element)) - definitions.builtinElement(element); - else - if (!Wflag) - cerr << "Warning: no fault '" << (messageLabel?messageLabel:"") << "' ref '" << ref << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - } - else 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 fault '" << (messageLabel?messageLabel:"") << "' element '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - if (!elementRef) - { if (is_builtin_qname(element)) - definitions.builtinElement(element); - else - if (!Wflag) - cerr << "Warning: no fault '" << (messageLabel?messageLabel:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - } - else - { 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 operation fault '" << (name?name:"") << "' 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 operation fault '" << (name?name:"") << "' message '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - } - if (!messageRef) - if (!Wflag) - cerr << "Warning: no operation fault '" << (name?name:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - if (wsp__Policy_) - wsp__Policy_->traverse(definitions); - if (wsp__PolicyReference_) - wsp__PolicyReference_->traverse(definitions); - return SOAP_OK; -} - -void wsdl__fault::messagePtr(wsdl__message *message) -{ messageRef = message; -} - -wsdl__message *wsdl__fault::messagePtr() const -{ return messageRef; -} - -void wsdl__fault::elementPtr(xs__element *element) -{ elementRef = element; -} - -xs__element *wsdl__fault::elementPtr() const -{ return elementRef; -} - -int wsdl__message::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing message '" << (name?name:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - for (vector<wsdl__part>::iterator i = part.begin(); i != part.end(); ++i) - (*i).traverse(definitions); - for (vector<wsp__Policy>::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) - (*p).traverse(definitions); - for (vector<wsp__PolicyReference>::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) - (*r).traverse(definitions); - return SOAP_OK; -} - -wsdl__part::wsdl__part() -{ elementRef = NULL; - simpleTypeRef = NULL; - complexTypeRef = NULL; -} - -int wsdl__part::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing message parts in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - elementRef = NULL; - simpleTypeRef = NULL; - complexTypeRef = NULL; - 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 message part '" << (name?name:"") << "' element '" << (token?token:"") << "'" << endl; - break; - } - } - } - token = qname_token(type, (*schema)->targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) - { if ((*simpleType).name && !strcmp((*simpleType).name, token)) - { simpleTypeRef = &(*simpleType); - if (vflag) - cerr << " Found message part '" << (name?name:"") << "' simpleType '" << (token?token:"") << "'" << endl; - break; - } - } - } - token = qname_token(type, (*schema)->targetNamespace); - if (token) - { for (vector<xs__complexType>::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) - { if ((*complexType).name && !strcmp((*complexType).name, token)) - { complexTypeRef = &(*complexType); - if (vflag) - cerr << " Found message part '" << (name?name:"") << "' complexType '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - if (!elementRef && !simpleTypeRef && !complexTypeRef) - { if (element) - { if (is_builtin_qname(element)) - definitions.builtinElement(element); - else - if (!Wflag) - cerr << "Warning: no message part '" << (name?name:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - else if (type) - { if (is_builtin_qname(type)) - definitions.builtinType(type); - else - if (!Wflag) - cerr << "Warning: no message part '" << (name?name:"") << "' type '" << type << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - else - if (!Wflag) - cerr << "Warning: no message part '" << (name?name:"") << "' element or type in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - } - return SOAP_OK; -} - -void wsdl__part::elementPtr(xs__element *element) -{ elementRef = element; - if (!elementRef && vflag) - cerr << "Warning: wsdl__part element set to NULL" << endl; -} - -void wsdl__part::simpleTypePtr(xs__simpleType *simpleType) -{ simpleTypeRef = simpleType; - if (!simpleTypeRef && vflag) - cerr << "Warning: wsdl__part simpleType set to NULL" << endl; -} - -void wsdl__part::complexTypePtr(xs__complexType *complexType) -{ complexTypeRef = complexType; - if (!complexTypeRef && vflag) - cerr << "Warning: wsdl__part complexType set to NULL" << endl; -} - -xs__element *wsdl__part::elementPtr() const -{ return elementRef; -} - -xs__simpleType *wsdl__part::simpleTypePtr() const -{ return simpleTypeRef; -} - -xs__complexType *wsdl__part::complexTypePtr() const -{ return complexTypeRef; -} - -int wsdl__types::preprocess(wsdl__definitions& definitions) -{ if (vflag) - cerr << "Preprocessing wsdl types" << endl; - if (!empty()) // WSDL 2.0 <types> - { targetNamespace = definitions.targetNamespace; - xs__schema_.push_back(this); - } - // set the location of each schema in <types> to the WSDL's location - for (vector<xs__schema*>::iterator schema0 = xs__schema_.begin(); schema0 != xs__schema_.end(); ++schema0) - { if (!(*schema0)->sourceLocation()) - (*schema0)->sourceLocation(definitions.sourceLocation()); - } -again: - // link imported schemas, need to repeat when <types> is extended with new imported schema (from inside another schema, etc.) - for (vector<xs__schema*>::iterator schema1 = xs__schema_.begin(); schema1 != xs__schema_.end(); ++schema1) - { for (vector<xs__import>::iterator import = (*schema1)->import.begin(); import != (*schema1)->import.end(); ++import) - { if ((*import).namespace_ && !(*import).schemaPtr() && strcmp((*import).namespace_, targetNamespace)) - { for (vector<xs__schema*>::const_iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) - { if (schema2 != schema1 && (*schema2)->targetNamespace && !strcmp((*import).namespace_, (*schema2)->targetNamespace)) - { (*import).schemaPtr(*schema2); - break; - } - } - } - } - } - // if a schema is imported but not in <types> then get it - for (vector<xs__schema*>::iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) - { for (vector<xs__import>::iterator import = (*schema2)->import.begin(); import != (*schema2)->import.end(); ++import) - { bool found = false; - if ((*import).schemaPtr()) - found = true; - if (vflag) - cerr << "Preprocessing schema '" << (*schema2)->targetNamespace << "' import '" << ((*import).namespace_?(*import).namespace_:"") << "'" << endl; - if (!found && (*import).namespace_) - { if ((*import).schemaPtr()) - found = true; - else if (strcmp((*import).namespace_, targetNamespace)) - { for (vector<xs__schema*>::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) - { if (schema3 != schema2 && (*schema3)->targetNamespace && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) - { found = true; - if (vflag) - cerr << "Schema '" << (*schema2)->targetNamespace << "' already found and present" << endl; - break; - } - } - } - if (!found) - { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) - { if (!soap_tag_cmp((*import).namespace_, *i)) - { found = true; - break; - } - } - } - } - if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) - { xs__schema *importschema; - importschema = (*import).schemaPtr(); - if (!importschema) - { const char *s = (*import).schemaLocation; - if (!s) - s = (*import).namespace_; - if (!s) - continue; - importschema = new xs__schema(definitions.soap, (*schema2)->sourceLocation(), s); - if (!(*import).namespace_) - { if ((*schema2)->targetNamespace) - (*import).namespace_ = (*schema2)->targetNamespace; - else if (importschema->targetNamespace) - (*import).namespace_ = importschema->targetNamespace; - else - (*import).namespace_ = soap_strdup(definitions.soap, ""); - } - if (!importschema->targetNamespace || !*importschema->targetNamespace) - importschema->targetNamespace = (*import).namespace_; - else if ((*import).namespace_ && strcmp(importschema->targetNamespace, (*import).namespace_)) - cerr << "Schema import namespace '" << ((*import).namespace_?(*import).namespace_:"") << "' does not correspond to imported namespace '" << importschema->targetNamespace << "'" << endl; - } - if (strcmp((*import).namespace_, targetNamespace)) - { for (vector<xs__schema*>::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) - { if (schema3 != schema2 && (*schema3)->targetNamespace && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) - { found = true; - (*import).schemaPtr(*schema3); - break; - } - } - } - if (!found) - { (*import).schemaPtr(importschema); - xs__schema_.push_back(importschema); - if (vflag) - cerr << "Adding schema '" << importschema->targetNamespace << "'" << endl; - goto again; - } - } - } - } - return SOAP_OK; -} - -int wsdl__types::traverse(wsdl__definitions& definitions) -{ if (vflag) - cerr << " Analyzing types in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - for (vector<xs__schema*>::iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) - { // artificially extend the <import> of each schema to include others so when we traverse schemas we can resolve references - for (vector<xs__schema*>::iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) - { if (schema3 != importschema && (*importschema)->targetNamespace) - { xs__import *import = soap_new_xs__import(definitions.soap, -1); - import->namespace_ = (*importschema)->targetNamespace; - import->schemaPtr(*importschema); - (*schema3)->import.push_back(*import); - } - } - // check and report - for (vector<xs__import>::iterator import = (*schema3)->import.begin(); import != (*schema3)->import.end(); ++import) - { if ((*import).namespace_) - { bool found = false; - for (vector<xs__schema*>::const_iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) - { if ((*importschema)->targetNamespace && !strcmp((*import).namespace_, (*importschema)->targetNamespace)) - { found = true; - break; - } - } - if (!found && vflag) - cerr << "Schema import namespace '" << (*import).namespace_ << "' refers to an unknown Schema" << endl; - } - else if (!Wflag) - cerr << "Warning: schema import '" << ((*import).schemaLocation ? (*import).schemaLocation : "") << "' has no namespace" << endl; - } - } - // traverse the schemas - for (vector<xs__schema*>::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) - (*schema4)->traverse(); - // find all built-in types, elements, and attributes - for (vector<xs__schema*>::iterator schema5 = xs__schema_.begin(); schema5 != xs__schema_.end(); ++schema5) - { if (vflag) - for (SetOfString::const_iterator i = (*schema5)->builtinTypes().begin(); i != (*schema5)->builtinTypes().end(); ++i) - cerr << " Built-in schema type '" << (*i) << "'" << endl; - definitions.builtinTypes((*schema5)->builtinTypes()); - definitions.builtinElements((*schema5)->builtinElements()); - definitions.builtinAttributes((*schema5)->builtinAttributes()); - } - return SOAP_OK; -} - -int wsdl__import::preprocess(wsdl__definitions& definitions) -{ static map<const char*, wsdl__definitions*, ltstr> included; - bool found = false; - if (vflag) - cerr << "Preprocess wsdl import '" << (location?location:"") << "'" << endl; - definitionsRef = NULL; - if (namespace_) - { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) - { if (!soap_tag_cmp(namespace_, *i)) - { found = true; - break; - } - } - } - if (!found && location) - { map<const char*, wsdl__definitions*, ltstr>::iterator i = included.find(location); - if (i != included.end()) - { if (vflag) - fprintf(stderr, "\nWSDL/XSD '%s' already imported\n", location); - found = true; - definitionsRef = (*i).second; - } - } - if (!found && location) - { // parse imported definitions - const char *source = definitions.sourceLocation(); - if (vflag) - cerr << "Importing '" << location << "' into '" << (source?source:"(source location not set)") << "'" << endl; - included[location] = definitionsRef = new wsdl__definitions(definitions.soap, source, location); - if (!definitionsRef) - return SOAP_EOF; - if (!namespace_) - namespace_ = definitionsRef->targetNamespace; - else if (!definitionsRef->targetNamespace || !*definitionsRef->targetNamespace) - definitionsRef->targetNamespace = namespace_; - else if (strcmp(namespace_, definitionsRef->targetNamespace)) - cerr << "Error: wsdl definitions/import '" << location << "' namespace '" << namespace_ << "' does not match imported targetNamespace '" << definitionsRef->targetNamespace << "'" << endl; - } - else if (!location) - cerr << "Warning: wsdl definitions/import has no location attribute" << endl; - return SOAP_OK; -} - -int wsdl__import::traverse(wsdl__definitions& definitions) -{ if (definitionsRef) - { if (vflag) - cerr << " Analyzing imported wsdl namespace '" << (namespace_?namespace_:"") << "' in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; - // process import first - for (vector<wsdl__import>::iterator im = definitionsRef->import.begin(); im != definitionsRef->import.end(); ++im) - (*im).traverse(definitions); - // then process the types - if (definitionsRef->types) - definitionsRef->types->traverse(definitions); - // process messages before portTypes - for (vector<wsdl__message>::iterator mg = definitionsRef->message.begin(); mg != definitionsRef->message.end(); ++mg) - (*mg).traverse(definitions); - // process portTypes before bindings - for (vector<wsdl__portType>::iterator pt = definitionsRef->portType.begin(); pt != definitionsRef->portType.end(); ++pt) - (*pt).traverse(definitions); - // process bindings - for (vector<wsdl__binding>::iterator bg = definitionsRef->binding.begin(); bg != definitionsRef->binding.end(); ++bg) - (*bg).traverse(definitions); - // process services - for (vector<wsdl__service>::iterator sv = definitionsRef->service.begin(); sv != definitionsRef->service.end(); ++sv) - (*sv).traverse(definitions); - if (vflag) - cerr << " End of imported wsdl namespace '" << (namespace_?namespace_:"") << "'" << endl; - } - return SOAP_OK; -} - -void wsdl__import::definitionsPtr(wsdl__definitions *definitions) -{ definitionsRef = definitions; - if (!definitionsRef && vflag) - cerr << "Warning: wsdl__import definitions set to NULL" << endl; -} - -wsdl__definitions *wsdl__import::definitionsPtr() const -{ return definitionsRef; -} - -wsdl__import::wsdl__import() -{ definitionsRef = NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// streams -// -//////////////////////////////////////////////////////////////////////////////// - -ostream &operator<<(ostream &o, const wsdl__definitions &e) -{ if (!e.soap) - { struct soap soap; - soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); - soap_set_namespaces(&soap, namespaces); - e.soap_serialize(&soap); - soap_begin_send(&soap); - e.soap_out(&soap, "wsdl:definitions", 0, NULL); - soap_end_send(&soap); - soap_destroy(&soap); - soap_end(&soap); - soap_done(&soap); - } - else - { ostream *os = e.soap->os; - e.soap->os = &o; - e.soap_serialize(e.soap); - soap_begin_send(e.soap); - e.soap_out(e.soap, "wsdl:definitions", 0, NULL); - soap_end_send(e.soap); - e.soap->os = os; - } - return o; -} - -istream &operator>>(istream &i, wsdl__definitions &e) -{ if (!e.soap) - { e.soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); - soap_set_namespaces(e.soap, namespaces); - } - istream *is = e.soap->is; - e.soap->is = &i; - if (soap_begin_recv(e.soap) - || !e.soap_in(e.soap, "wsdl:", NULL) - || soap_end_recv(e.soap)) - { // handle error? Note: e.soap->error is set and app should check - } - e.soap->is = is; - return i; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// Miscellaneous -// -//////////////////////////////////////////////////////////////////////////////// - -extern "C" { - -int warn_ignore(struct soap *soap, const char *tag) -{ // We don't warn if the omitted element was an annotation or a documentation in an unexpected place - if (soap->mustUnderstand) - fprintf(stderr, "Error: element '%s' at level %d must be understood\n", tag, soap->level); - if (!Wflag - && soap_match_tag(soap, tag, "xs:annotation") - && soap_match_tag(soap, tag, "xs:documentation") - && soap_match_tag(soap, tag, "xs:appinfo")) - fprintf(stderr, "Warning: unexpected element '%s' at level %d is skipped (safe to ignore)\n", tag, soap->level); - if (soap->body && !soap_string_in(soap, 0, -1, -1)) - return soap->error; - return SOAP_OK; -} - -int show_ignore(struct soap *soap, const char *tag) -{ warn_ignore(soap, tag); - soap_print_fault_location(soap, stderr); - return SOAP_OK; -} - -} // end extern "C"