Mercurial > repos > ktnyt > gembassy
diff GEMBASSY-1.0.3/gsoap/wsdl/schema.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/schema.cpp Fri Jun 26 05:20:29 2015 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1699 +0,0 @@ -/* - schema.cpp - - XSD 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" // cannot include "schemaH.h" -#include "includes.h" - -extern struct Namespace namespaces[]; - -extern "C" { -extern int warn_ignore(struct soap*, const char*); -} - -extern const char *qname_token(const char*, const char*); -extern int is_builtin_qname(const char*); - -//////////////////////////////////////////////////////////////////////////////// -// -// schema -// -//////////////////////////////////////////////////////////////////////////////// - -xs__schema::xs__schema() -{ 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); - 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; - targetNamespace = NULL; - version = NULL; - updated = false; - location = NULL; - redirs = 0; -} - -xs__schema::xs__schema(struct soap *copy) -{ soap = soap_copy(copy); - soap->socket = SOAP_INVALID_SOCKET; - soap->recvfd = 0; - soap->sendfd = 1; - soap_default(soap); - soap->fignore = warn_ignore; - soap->encodingStyle = NULL; - targetNamespace = NULL; - version = NULL; - updated = false; - location = NULL; - redirs = 0; -} - -xs__schema::xs__schema(struct soap *copy, const char *cwd, const char *loc) -{ soap = soap_copy(copy); - soap->socket = SOAP_INVALID_SOCKET; - soap->recvfd = 0; - soap->sendfd = 1; - /* no longer required, since we keep the host name: - strcpy(soap->host, copy->host); - */ - soap_default(soap); - soap->fignore = warn_ignore; - soap->encodingStyle = NULL; - targetNamespace = NULL; - version = NULL; - updated = false; - location = NULL; - redirs = 0; - read(cwd, loc); -} - -xs__schema::~xs__schema() -{ } - -int xs__schema::get(struct soap *soap) -{ return preprocess(); -} - -int xs__schema::preprocess() -{ // process xs:include recursively - // NOTE: includes are context sensitive (take context info), so keep including - for (vector<xs__include>::iterator in = include.begin(); in != include.end(); ++in) - { (*in).preprocess(*this); // read schema and recurse over <include> - if ((*in).schemaPtr()) - insert(*(*in).schemaPtr()); - } - for (vector<xs__redefine>::iterator re = redefine.begin(); re != redefine.end(); ++re) - { (*re).preprocess(*this); // read schema and recurse over <redefine> - if ((*re).schemaPtr()) - insert(*(*re).schemaPtr()); - } - return SOAP_OK; -} - -int xs__schema::insert(xs__schema& schema) -{ bool found; - if (targetNamespace && schema.targetNamespace && strcmp(targetNamespace, schema.targetNamespace)) - if (!Wflag) - fprintf(stderr, "Warning: attempt to include schema with mismatching targetNamespace '%s' in schema '%s'\n", schema.targetNamespace, targetNamespace); - if (elementFormDefault != schema.elementFormDefault) - if (!Wflag) - fprintf(stderr, "Warning: attempt to include schema with mismatching elementFormDefault in schema '%s'\n", targetNamespace?targetNamespace:""); - if (attributeFormDefault != schema.attributeFormDefault) - if (!Wflag) - fprintf(stderr, "Warning: attempt to include schema with mismatching attributeFormDefault in schema '%s'\n", targetNamespace?targetNamespace:""); - // insert imports, but only add imports with new namespace - for (vector<xs__import>::const_iterator im = schema.import.begin(); im != schema.import.end(); ++im) - { found = false; - if ((*im).namespace_) - { for (vector<xs__import>::const_iterator i = import.begin(); i != import.end(); ++i) - { if ((*i).namespace_ && !strcmp((*im).namespace_, (*i).namespace_)) - { found = true; - break; - } - } - } - if (!found) - import.push_back(*im); - } - // insert attributes, but only add attributes with new name (limited conflict check) - for (vector<xs__attribute>::const_iterator at = schema.attribute.begin(); at != schema.attribute.end(); ++at) - { found = false; - if ((*at).name) - { for (vector<xs__attribute>::const_iterator a = attribute.begin(); a != attribute.end(); ++a) - { if ((*a).name && !strcmp((*at).name, (*a).name)) - { found = true; - if ((*at).type && (*a).type && strcmp((*at).type, (*a).type)) - if (!Wflag) - fprintf(stderr, "Warning: attempt to redefine attribute '%s' with type '%s' in schema '%s'\n", (*at).name, (*at).type, targetNamespace?targetNamespace:""); - break; - } - } - } - if (!found) - { attribute.push_back(*at); - attribute.back().schemaPtr(this); - } - } - // insert elements, but only add elements with new name (limited conflict check) - for (vector<xs__element>::const_iterator el = schema.element.begin(); el != schema.element.end(); ++el) - { found = false; - if ((*el).name) - { for (vector<xs__element>::const_iterator e = element.begin(); e != element.end(); ++e) - { if ((*e).name && !strcmp((*el).name, (*e).name)) - { found = true; - if ((*el).type && (*e).type && strcmp((*el).type, (*e).type)) - if (!Wflag) - fprintf(stderr, "Warning: attempt to redefine element '%s' with type '%s' in schema '%s'\n", (*el).name, (*el).type, targetNamespace?targetNamespace:""); - break; - } - } - } - if (!found) - { element.push_back(*el); - element.back().schemaPtr(this); - } - } - // insert groups, but only add groups with new name (no conflict check) - for (vector<xs__group>::const_iterator gp = schema.group.begin(); gp != schema.group.end(); ++gp) - { found = false; - if ((*gp).name) - { for (vector<xs__group>::const_iterator g = group.begin(); g != group.end(); ++g) - { if ((*g).name && !strcmp((*gp).name, (*g).name)) - { found = true; - break; - } - } - } - if (!found) - { group.push_back(*gp); - group.back().schemaPtr(this); - } - } - // insert attributeGroups, but only add attributeGroups with new name (no conflict check) - for (vector<xs__attributeGroup>::const_iterator ag = schema.attributeGroup.begin(); ag != schema.attributeGroup.end(); ++ag) - { found = false; - if ((*ag).name) - { for (vector<xs__attributeGroup>::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) - { if ((*g).name && !strcmp((*ag).name, (*g).name)) - { found = true; - break; - } - } - } - if (!found) - { attributeGroup.push_back(*ag); - attributeGroup.back().schemaPtr(this); - } - } - // insert simpleTypes, but only add simpleTypes with new name (no conflict check) - for (vector<xs__simpleType>::const_iterator st = schema.simpleType.begin(); st != schema.simpleType.end(); ++st) - { found = false; - if ((*st).name) - { for (vector<xs__simpleType>::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) - { if ((*s).name && !strcmp((*st).name, (*s).name)) - { found = true; - break; - } - } - } - if (!found) - { simpleType.push_back(*st); - simpleType.back().schemaPtr(this); - } - } - // insert complexTypes, but only add complexTypes with new name (no conflict check) - for (vector<xs__complexType>::const_iterator ct = schema.complexType.begin(); ct != schema.complexType.end(); ++ct) - { found = false; - if ((*ct).name) - { for (vector<xs__complexType>::const_iterator c = complexType.begin(); c != complexType.end(); ++c) - { if ((*c).name && !strcmp((*ct).name, (*c).name)) - { found = true; - break; - } - } - } - if (!found) - { complexType.push_back(*ct); - complexType.back().schemaPtr(this); - } - } - return SOAP_OK; -} - -int xs__schema::traverse() -{ if (updated) - return SOAP_OK; - if (vflag) - cerr << " Analyzing schema '" << (targetNamespace?targetNamespace:"") << "'" << endl; - updated = true; - if (!targetNamespace) - { if (vflag) - fprintf(stderr, "Warning: Schema has no targetNamespace\n"); - targetNamespace = soap_strdup(soap, ""); - } - else if (exturis.find(targetNamespace) != exturis.end()) - { if (vflag) - fprintf(stderr, "Warning: Built-in schema '%s' content encountered\n", targetNamespace); - } - // process import - for (vector<xs__import>::iterator im = import.begin(); im != import.end(); ++im) - (*im).traverse(*this); - // process attributes - for (vector<xs__attribute>::iterator at = attribute.begin(); at != attribute.end(); ++at) - (*at).traverse(*this); - // process elements - for (vector<xs__element>::iterator el = element.begin(); el != element.end(); -++el) - (*el).traverse(*this); - // process simpleTypes, check conflicts with complexTypes - for (vector<xs__simpleType>::iterator st = simpleType.begin(); st != simpleType.end(); ++st) - { (*st).traverse(*this); - if ((*st).name) - { for (vector<xs__complexType>::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) - if ((*ct).name && !strcmp((*st).name, (*ct).name)) - if (!Wflag) - fprintf(stderr, "Warning: top-level simpleType name and complexType name '%s' clash in schema '%s'\n", (*st).name, targetNamespace?targetNamespace:""); - } - } - // process complexTypes - for (vector<xs__complexType>::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) - (*ct).traverse(*this); - // process groups - for (vector<xs__group>::iterator gp = group.begin(); gp != group.end(); ++gp) - (*gp).traverse(*this); - // process attributeGroups - for (vector<xs__attributeGroup>::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) - (*ag).traverse(*this); - if (vflag) - cerr << " End of schema '" << (targetNamespace?targetNamespace:"") << "'" << endl; - return SOAP_OK; -} - -int xs__schema::read(const char *cwd, const char *loc) -{ const char *cwd_temp; - if (!cwd) - cwd = cwd_path; - if (vflag) - fprintf(stderr, "\nOpening schema '%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 with SSL (default) or download the files and rerun wsdl2h\n"); - exit(1); - } - else if (!strncmp(loc, "http://", 7)) -#endif - { fprintf(stderr, "\nConnecting to '%s' to retrieve schema...\n", loc); - location = soap_strdup(soap, loc); - if (soap_connect_command(soap, SOAP_GET, location, NULL)) - { fprintf(stderr, "\nConnection failed\n"); - 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' schema...\n", location, loc); - if (soap_connect_command(soap, SOAP_GET, location, NULL)) - { fprintf(stderr, "\nConnection 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' to retrieve schema\n", loc); - exit(1); - } - } - else - location = soap_strdup(soap, loc); - fprintf(stderr, "\nReading schema file '%s'...\n", location); - } - } - cwd_temp = cwd_path; - cwd_path = location; - if (!soap_begin_recv(soap)) - this->soap_in(soap, "xs:schema", NULL); - if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) // HTTP redirect, socket was closed - { 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; - } - if (soap->error) - { fprintf(stderr, "\nAn error occurred while parsing schema from '%s'\n", loc?loc:""); - soap_print_fault(soap, stderr); - if (soap->error < 200) - soap_print_fault_location(soap, stderr); - fprintf(stderr, "\nIf this schema namespace is considered \"built-in\", then add\n namespaceprefix = <namespaceURI>\nto typemap.dat.\n"); - 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; -} - -void xs__schema::sourceLocation(const char *loc) -{ location = soap_strdup(soap, loc); -} - -const char *xs__schema::sourceLocation() -{ return location; -} - -int xs__schema::error() -{ return soap->error; -} - -void xs__schema::print_fault() -{ soap_print_fault(soap, stderr); - if (soap->error < 200) - soap_print_fault_location(soap, stderr); -} - -void xs__schema::builtinType(const char *type) -{ builtinTypeSet.insert(type); -} - -void xs__schema::builtinElement(const char *element) -{ builtinElementSet.insert(element); -} - -void xs__schema::builtinAttribute(const char *attribute) -{ builtinAttributeSet.insert(attribute); -} - -const SetOfString& xs__schema::builtinTypes() const -{ return builtinTypeSet; -} - -const SetOfString& xs__schema::builtinElements() const -{ return builtinElementSet; -} - -const SetOfString& xs__schema::builtinAttributes() const -{ return builtinAttributeSet; -} - -bool xs__schema::empty() const -{ return include.empty() && redefine.empty() && import.empty() && attribute.empty() && element.empty() && group.empty() && attributeGroup.empty() && simpleType.empty() && complexType.empty(); -} - -xs__include::xs__include() -{ schemaLocation = NULL; - schemaRef = NULL; -} - -int xs__include::preprocess(xs__schema &schema) -{ if (!schemaRef && schemaLocation) - { // only read from include locations not read already, uses static std::map - static map<const char*, xs__schema*, ltstr> included; - map<const char*, xs__schema*, ltstr>::iterator i = included.end(); - if (schema.targetNamespace) - for (i = included.begin(); i != included.end(); ++i) - if ((*i).second->targetNamespace - && !strcmp(schemaLocation, (*i).first) - && !strcmp(schema.targetNamespace, (*i).second->targetNamespace)) - break; - if (i == included.end()) - { if (vflag) - cerr << "Preprocessing schema include '" << (schemaLocation?schemaLocation:"") << "' into schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - included[schemaLocation] = schemaRef = new xs__schema(schema.soap); - schemaRef->read(schema.sourceLocation(), schemaLocation); - schemaRef->targetNamespace = schema.targetNamespace; - } - else - { if (vflag) - cerr << "Schema '" << (schemaLocation?schemaLocation:"") << "' already included into schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - schemaRef = (*i).second; - } - } - return SOAP_OK; -} - -int xs__include::traverse(xs__schema &schema) -{ return SOAP_OK; -} - -void xs__include::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema *xs__include::schemaPtr() const -{ return schemaRef; -} - -xs__redefine::xs__redefine() -{ schemaLocation = NULL; - schemaRef = NULL; -} - -int xs__redefine::preprocess(xs__schema &schema) -{ if (vflag) - cerr << "Preprocessing schema redefine '" << (schemaLocation?schemaLocation:"") << "' into schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - if (!schemaRef) - { if (schemaLocation) - { schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation); - for (vector<xs__group>::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) - { if ((*gp).name) - { for (vector<xs__group>::const_iterator g = group.begin(); g != group.end(); ++g) - { if ((*g).name && !strcmp((*gp).name, (*g).name)) - { *gp = *g; - break; - } - } - } - } - for (vector<xs__attributeGroup>::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) - { if ((*ag).name) - { for (vector<xs__attributeGroup>::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) - { if ((*g).name && !strcmp((*ag).name, (*g).name)) - { *ag = *g; - break; - } - } - } - } - for (vector<xs__simpleType>::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) - { if ((*st).name) - { for (vector<xs__simpleType>::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) - { if ((*s).name && !strcmp((*st).name, (*s).name)) - { *st = *s; - break; - } - } - } - } - for (vector<xs__complexType>::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) - { if ((*ct).name) - { for (vector<xs__complexType>::const_iterator c = complexType.begin(); c != complexType.end(); ++c) - { if ((*c).name && !strcmp((*ct).name, (*c).name)) - { *ct = *c; - break; - } - } - } - } - } - } - return SOAP_OK; -} - -int xs__redefine::traverse(xs__schema &schema) -{ return SOAP_OK; -} - -void xs__redefine::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema *xs__redefine::schemaPtr() const -{ return schemaRef; -} - -xs__import::xs__import() -{ namespace_ = NULL; - schemaLocation = NULL; - schemaRef = NULL; -} - -int xs__import::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema import '" << (namespace_?namespace_:"") << "'" << endl; - if (!schemaRef) - { bool found = false; - if (namespace_) - { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) - { if (!soap_tag_cmp(namespace_, *i)) - { found = true; - break; - } - } - } - else if (!Wflag) - fprintf(stderr, "Warning: no namespace in <import>\n"); - if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) - { const char *s = schemaLocation; - if (!s) - s = namespace_; - // only read from import locations not read already, uses static std::map - static map<const char*, xs__schema*, ltstr> included; - map<const char*, xs__schema*, ltstr>::iterator i = included.find(s); - if (i == included.end()) - { included[s] = schemaRef = new xs__schema(schema.soap); - schemaRef->read(schema.sourceLocation(), s); - } - else - schemaRef = (*i).second; - if (schemaRef) - { if (!schemaRef->targetNamespace || !*schemaRef->targetNamespace) - schemaRef->targetNamespace = namespace_; - else - if (!namespace_ || strcmp(schemaRef->targetNamespace, namespace_)) - if (!Wflag) - fprintf(stderr, "Warning: schema import '%s' with schema targetNamespace '%s' mismatch\n", namespace_?namespace_:"", schemaRef->targetNamespace); - } - } - } - if (schemaRef) - schemaRef->traverse(); - return SOAP_OK; -} - -void xs__import::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema *xs__import::schemaPtr() const -{ return schemaRef; -} - -xs__attribute::xs__attribute() -{ schemaRef = NULL; - attributeRef = NULL; - simpleTypeRef = NULL; -} - -int xs__attribute::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema attribute '" << (name?name:"") << "'" << endl; - schemaRef = &schema; - const char *token = qname_token(ref, schema.targetNamespace); - attributeRef = NULL; - if (token) - { for (vector<xs__attribute>::iterator i = schema.attribute.begin(); i != schema.attribute.end(); ++i) - if (!strcmp((*i).name, token)) - { attributeRef = &(*i); - if (vflag) - cerr << " Found attribute '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (!attributeRef) - { for (vector<xs__import>::iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(ref, s->targetNamespace); - if (token) - { for (vector<xs__attribute>::iterator j = s->attribute.begin(); j != s->attribute.end(); ++j) - { if (!strcmp((*j).name, token)) - { attributeRef = &(*j); - if (vflag) - cerr << " Found attribute '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (attributeRef) - break; - } - } - } - } - if (simpleType) - { simpleType->traverse(schema); - simpleTypeRef = simpleType; - } - else - { token = qname_token(type, schema.targetNamespace); - simpleTypeRef = NULL; - if (token) - { for (vector<xs__simpleType>::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) - if (!strcmp((*i).name, token)) - { simpleTypeRef = &(*i); - if (vflag) - cerr << " Found attribute '" << (name?name:"") << "' type '" << (token?token:"") << "'" << endl; - break; - } - } - if (!simpleTypeRef) - { for (vector<xs__import>::iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(type, s->targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) - { if (!strcmp((*j).name, token)) - { simpleTypeRef = &(*j); - if (vflag) - cerr << " Found attribute '" << (name?name:"") << "' type '" << (token?token:"") << "'" << endl; - break; - } - } - if (simpleTypeRef) - break; - } - } - } - } - } - if (!attributeRef && !simpleTypeRef) - { if (ref) - { if (is_builtin_qname(ref)) - schema.builtinAttribute(ref); - else if (!Wflag) - cerr << "Warning: could not find attribute '" << (name?name:"") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - else if (type) - { if (is_builtin_qname(type)) - schema.builtinType(type); - else if (!Wflag) - cerr << "Warning: could not find attribute '" << (name?name:"") << "' type '" << type << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - } - return SOAP_OK; -} - -void xs__attribute::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema* xs__attribute::schemaPtr() const -{ return schemaRef; -} - -void xs__attribute::attributePtr(xs__attribute *attribute) -{ attributeRef = attribute; -} - -void xs__attribute::simpleTypePtr(xs__simpleType *simpleType) -{ simpleTypeRef = simpleType; -} - -xs__attribute *xs__attribute::attributePtr() const -{ return attributeRef; -} - -xs__simpleType *xs__attribute::simpleTypePtr() const -{ return simpleTypeRef; -} - -xs__element::xs__element() -{ schemaRef = NULL; - elementRef = NULL; - simpleTypeRef = NULL; - complexTypeRef = NULL; -} - -int xs__element::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema element '" << (name?name:"") << "'" << endl; - schemaRef = &schema; - const char *token = qname_token(ref, schema.targetNamespace); - elementRef = NULL; - if (token) - { for (vector<xs__element>::iterator i = schema.element.begin(); i != schema.element.end(); ++i) - { if ((*i).name && !strcmp((*i).name, token)) - { elementRef = &(*i); - if (vflag) - cerr << " Found element '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - } - if (!elementRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(ref, s->targetNamespace); - if (token) - { for (vector<xs__element>::iterator j = s->element.begin(); j != s->element.end(); ++j) - { if ((*j).name && !strcmp((*j).name, token)) - { elementRef = &(*j); - if (vflag) - cerr << " Found element '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (elementRef) - break; - } - } - } - } - if (simpleType) - { simpleType->traverse(schema); - simpleTypeRef = simpleType; - } - else - { token = qname_token(type, schema.targetNamespace); - simpleTypeRef = NULL; - if (token) - { for (vector<xs__simpleType>::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) - if ((*i).name && !strcmp((*i).name, token)) - { simpleTypeRef = &(*i); - if (vflag) - cerr << " Found element '" << (name?name:"") << "' simpleType '" << (token?token:"") << "'" << endl; - break; - } - } - if (!simpleTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(type, s->targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) - { if ((*j).name && !strcmp((*j).name, token)) - { simpleTypeRef = &(*j); - if (vflag) - cerr << " Found element '" << (name?name:"") << "' simpleType '" << (token?token:"") << "'" << endl; - break; - } - } - if (simpleTypeRef) - break; - } - } - } - } - } - if (complexType) - { complexType->traverse(schema); - complexTypeRef = complexType; - } - else - { token = qname_token(type, schema.targetNamespace); - complexTypeRef = NULL; - if (token) - { for (vector<xs__complexType>::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) - if ((*i).name && !strcmp((*i).name, token)) - { complexTypeRef = &(*i); - if (vflag) - cerr << " Found element '" << (name?name:"") << "' complexType '" << (token?token:"") << "'" << endl; - break; - } - } - if (!complexTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(type, s->targetNamespace); - if (token) - { for (vector<xs__complexType>::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) - { if ((*j).name && !strcmp((*j).name, token)) - { complexTypeRef = &(*j); - if (vflag) - cerr << " Found element '" << (name?name:"") << "' complexType '" << (token?token:"") << "'" << endl; - break; - } - } - if (complexTypeRef) - break; - } - } - } - } - } - token = qname_token(substitutionGroup, schema.targetNamespace); - if (token) - { for (vector<xs__element>::iterator i = schema.element.begin(); i != schema.element.end(); ++i) - if (!strcmp((*i).name, token)) - { (*i).substitutions.push_back(this); - if (vflag) - cerr << " Found substitutionGroup element '" << (name?name:"") << "' for abstract element '" << (token?token:"") << "'" << endl; - break; - } - } - for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(substitutionGroup, s->targetNamespace); - if (token) - { for (vector<xs__element>::iterator j = s->element.begin(); j != s->element.end(); ++j) - { if (!strcmp((*j).name, token)) - { (*j).substitutions.push_back(this); - if (vflag) - cerr << " Found substitutionGroup element '" << (name?name:"") << "' for abstract element '" << (token?token:"") << "'" << endl; - break; - } - } - } - } - } - if (!elementRef && !simpleTypeRef && !complexTypeRef) - { if (ref) - { if (is_builtin_qname(ref)) - schema.builtinElement(ref); - else if (!Wflag) - cerr << "Warning: could not find element '" << (name?name:"") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - else if (type) - { if (is_builtin_qname(type)) - schema.builtinType(type); - else if (!Wflag) - cerr << "Warning: could not find element '" << (name?name:"") << "' type '" << type << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - } - return SOAP_OK; -} - -void xs__element::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema* xs__element::schemaPtr() const -{ return schemaRef; -} - -void xs__element::elementPtr(xs__element *element) -{ elementRef = element; -} - -void xs__element::simpleTypePtr(xs__simpleType *simpleType) -{ simpleTypeRef = simpleType; -} - -void xs__element::complexTypePtr(xs__complexType *complexType) -{ complexTypeRef = complexType; -} - -xs__element *xs__element::elementPtr() const -{ return elementRef; -} - -const std::vector<xs__element*>* xs__element::substitutionsPtr() const -{ return &substitutions; -} - -xs__simpleType *xs__element::simpleTypePtr() const -{ return simpleTypeRef; -} - -xs__complexType *xs__element::complexTypePtr() const -{ return complexTypeRef; -} - -xs__simpleType::xs__simpleType() -{ schemaRef = NULL; - level = 0; -} - -int xs__simpleType::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema simpleType '" << (name?name:"") << "'" << endl; - schemaRef = &schema; - if (list) - list->traverse(schema); - else if (restriction) - restriction->traverse(schema); - else if (union_) - union_->traverse(schema); - return SOAP_OK; -} - -void xs__simpleType::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema *xs__simpleType::schemaPtr() const -{ return schemaRef; -} - -int xs__simpleType::baseLevel() -{ if (!level) - { if (restriction) - { level = -1; - if (restriction->simpleTypePtr()) - level = restriction->simpleTypePtr()->baseLevel() + 1; - else - level = 2; - } - else if (list && list->restriction) - { level = -1; - if (list->restriction->simpleTypePtr()) - level = list->restriction->simpleTypePtr()->baseLevel() + 1; - else - level = 2; - } - else - level = 1; - } - else if (level < 0) - { cerr << "Error: cyclic simpleType restriction/extension base dependency in '" << (name?name:"") << "'" << endl; - } - return level; -} - -xs__complexType::xs__complexType() -{ schemaRef = NULL; - level = 0; -} - -int xs__complexType::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema complexType '" << (name?name:"") << "'" << endl; - schemaRef = &schema; - if (simpleContent) - simpleContent->traverse(schema); - else if (complexContent) - complexContent->traverse(schema); - else if (all) - all->traverse(schema); - else if (choice) - choice->traverse(schema); - else if (sequence) - sequence->traverse(schema); - else if (any) - any->traverse(schema); - for (vector<xs__attribute>::iterator at = attribute.begin(); at != attribute.end(); ++at) - (*at).traverse(schema); - for (vector<xs__attributeGroup>::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) - (*ag).traverse(schema); - return SOAP_OK; -} - -void xs__complexType::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema *xs__complexType::schemaPtr() const -{ return schemaRef; -} - -int xs__complexType::baseLevel() -{ if (!level) - { if (simpleContent) - { if (simpleContent->restriction) - { level = -1; - if (simpleContent->restriction->simpleTypePtr()) - level = simpleContent->restriction->simpleTypePtr()->baseLevel() + 1; - else if (simpleContent->restriction->complexTypePtr()) - level = simpleContent->restriction->complexTypePtr()->baseLevel() + 1; - else - level = 2; - } - else if (simpleContent->extension) - { level = -1; - if (simpleContent->extension->simpleTypePtr()) - level = simpleContent->extension->simpleTypePtr()->baseLevel() + 1; - else if (simpleContent->extension->complexTypePtr()) - level = simpleContent->extension->complexTypePtr()->baseLevel() + 1; - else - level = 2; - } - } - else if (complexContent) - { if (complexContent->restriction) - { level = -1; - if (complexContent->restriction->simpleTypePtr()) - level = complexContent->restriction->simpleTypePtr()->baseLevel() + 1; - else if (complexContent->restriction->complexTypePtr()) - level = complexContent->restriction->complexTypePtr()->baseLevel() + 1; - else - level = 2; - } - else if (complexContent->extension) - { level = -1; - if (complexContent->extension->simpleTypePtr()) - level = complexContent->extension->simpleTypePtr()->baseLevel() + 1; - else if (complexContent->extension->complexTypePtr()) - level = complexContent->extension->complexTypePtr()->baseLevel() + 1; - else - level = 2; - } - } - else - level = 1; - } - else if (level < 0) - { cerr << "Error: cyclic complexType restriction/extension base dependency in '" << (name?name:"") << "'" << endl; - } - return level; -} - -int xs__simpleContent::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema simpleContent" << endl; - if (extension) - extension->traverse(schema); - else if (restriction) - restriction->traverse(schema); - return SOAP_OK; -} - -int xs__complexContent::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema complexContent" << endl; - if (extension) - extension->traverse(schema); - else if (restriction) - restriction->traverse(schema); - return SOAP_OK; -} - -xs__extension::xs__extension() -{ simpleTypeRef = NULL; - complexTypeRef = NULL; -} - -int xs__extension::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema extension '" << (base?base:"") << "'" << endl; - if (group) - group->traverse(schema); - else if (all) - all->traverse(schema); - else if (choice) - choice->traverse(schema); - else if (sequence) - sequence->traverse(schema); - for (vector<xs__attribute>::iterator at = attribute.begin(); at != attribute.end(); ++at) - (*at).traverse(schema); - for (vector<xs__attributeGroup>::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) - (*ag).traverse(schema); - const char *token = qname_token(base, schema.targetNamespace); - simpleTypeRef = NULL; - if (token) - { for (vector<xs__simpleType>::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) - if (!strcmp((*i).name, token)) - { simpleTypeRef = &(*i); - if (vflag) - cerr << " Found extension base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (!simpleTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(base, s->targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) - { if (!strcmp((*j).name, token)) - { simpleTypeRef = &(*j); - if (vflag) - cerr << " Found extension base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (simpleTypeRef) - break; - } - } - } - } - token = qname_token(base, schema.targetNamespace); - complexTypeRef = NULL; - if (token) - { for (vector<xs__complexType>::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) - if ((*i).name && !strcmp((*i).name, token)) - { complexTypeRef = &(*i); - if (vflag) - cerr << " Found extension base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (!complexTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(base, s->targetNamespace); - if (token) - { for (vector<xs__complexType>::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) - { if ((*j).name && !strcmp((*j).name, token)) - { complexTypeRef = &(*j); - if (vflag) - cerr << " Found extension base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (complexTypeRef) - break; - } - } - } - } - if (!simpleTypeRef && !complexTypeRef) - { if (base) - { if (is_builtin_qname(base)) - schema.builtinType(base); - else if (!Wflag) - cerr << "Warning: could not find extension base type '" << base << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - else - cerr << "Extension has no base" << endl; - } - return SOAP_OK; -} - -void xs__extension::simpleTypePtr(xs__simpleType *simpleType) -{ simpleTypeRef = simpleType; -} - -void xs__extension::complexTypePtr(xs__complexType *complexType) -{ complexTypeRef = complexType; -} - -xs__simpleType *xs__extension::simpleTypePtr() const -{ return simpleTypeRef; -} - -xs__complexType *xs__extension::complexTypePtr() const -{ return complexTypeRef; -} - -xs__restriction::xs__restriction() -{ simpleTypeRef = NULL; - complexTypeRef = NULL; -} - -int xs__restriction::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema restriction '" << (base?base:"") << "'" << endl; - if (simpleType) - simpleType->traverse(schema); - if (attributeGroup) - attributeGroup->traverse(schema); - if (group) - group->traverse(schema); - else if (all) - all->traverse(schema); - else if (choice) - choice->traverse(schema); - else if (sequence) - sequence->traverse(schema); - else - { for (vector<xs__enumeration>::iterator en = enumeration.begin(); en != enumeration.end(); ++en) - (*en).traverse(schema); - for (vector<xs__pattern>::iterator pn = pattern.begin(); pn != pattern.end(); ++pn) - (*pn).traverse(schema); - } - for (vector<xs__attribute>::iterator at = attribute.begin(); at != attribute.end(); ++at) - (*at).traverse(schema); - const char *token = qname_token(base, schema.targetNamespace); - simpleTypeRef = NULL; - if (token) - { for (vector<xs__simpleType>::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) - if (!strcmp((*i).name, token)) - { simpleTypeRef = &(*i); - if (vflag) - cerr << " Found restriction base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (!simpleTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(base, s->targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) - { if (!strcmp((*j).name, token)) - { simpleTypeRef = &(*j); - if (vflag) - cerr << " Found restriction base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (simpleTypeRef) - break; - } - } - } - } - token = qname_token(base, schema.targetNamespace); - complexTypeRef = NULL; - if (token) - { for (vector<xs__complexType>::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) - if ((*i).name && !strcmp((*i).name, token)) - { complexTypeRef = &(*i); - if (vflag) - cerr << " Found restriction base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (!complexTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(base, s->targetNamespace); - if (token) - { for (vector<xs__complexType>::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) - { if ((*j).name && !strcmp((*j).name, token)) - { complexTypeRef = &(*j); - if (vflag) - cerr << " Found restriction base type '" << (token?token:"") << "'" << endl; - break; - } - } - if (complexTypeRef) - break; - } - } - } - } - if (!simpleTypeRef && !complexTypeRef) - { if (base) - { if (is_builtin_qname(base)) - schema.builtinType(base); - else if (!Wflag) - cerr << "Warning: could not find restriction base type '" << base << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - else if (!simpleType) - cerr << "Restriction has no base" << endl; - } - return SOAP_OK; -} - -void xs__restriction::simpleTypePtr(xs__simpleType *simpleType) -{ simpleTypeRef = simpleType; -} - -void xs__restriction::complexTypePtr(xs__complexType *complexType) -{ complexTypeRef = complexType; -} - -xs__simpleType *xs__restriction::simpleTypePtr() const -{ return simpleTypeRef; -} - -xs__complexType *xs__restriction::complexTypePtr() const -{ return complexTypeRef; -} - -xs__list::xs__list() -{ itemTypeRef = NULL; -} - -int xs__list::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema list" << endl; - if (restriction) - restriction->traverse(schema); - for (vector<xs__simpleType>::iterator i = simpleType.begin(); i != simpleType.end(); ++i) - (*i).traverse(schema); - itemTypeRef = NULL; - const char *token = qname_token(itemType, schema.targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) - if (!strcmp((*i).name, token)) - { itemTypeRef = &(*i); - if (vflag) - cerr << " Found list itemType '" << (token?token:"") << "'" << endl; - break; - } - } - if (!itemTypeRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(itemType, s->targetNamespace); - if (token) - { for (vector<xs__simpleType>::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) - { if (!strcmp((*j).name, token)) - { itemTypeRef = &(*j); - if (vflag) - cerr << " Found list itemType '" << (token?token:"") << "'" << endl; - break; - } - } - if (itemTypeRef) - break; - } - } - } - } - if (itemType && !itemTypeRef) - { if (is_builtin_qname(itemType)) - schema.builtinType(itemType); - else if (!Wflag) - cerr << "Warning: could not find list itemType '" << itemType << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - return SOAP_OK; -} - -void xs__list::itemTypePtr(xs__simpleType *simpleType) -{ itemTypeRef = simpleType; -} - -xs__simpleType *xs__list::itemTypePtr() const -{ return itemTypeRef; -} - -int xs__union::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema union" << endl; - for (vector<xs__simpleType>::iterator i = simpleType.begin(); i != simpleType.end(); ++i) - (*i).traverse(schema); - return SOAP_OK; -} - -int xs__all::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema all" << endl; - for (vector<xs__element>::iterator i = element.begin(); i != element.end(); ++i) - (*i).traverse(schema); - return SOAP_OK; -} - -int xs__contents::traverse(xs__schema &schema) -{ switch (__union) - { case SOAP_UNION_xs__union_content_element: - if (__content.element) - __content.element->traverse(schema); - break; - case SOAP_UNION_xs__union_content_group: - if (__content.group) - __content.group->traverse(schema); - break; - case SOAP_UNION_xs__union_content_choice: - if (__content.choice) - __content.choice->traverse(schema); - break; - case SOAP_UNION_xs__union_content_sequence: - if (__content.sequence) - __content.sequence->traverse(schema); - break; - case SOAP_UNION_xs__union_content_any: - if (__content.any) - __content.any->traverse(schema); - break; - } - return SOAP_OK; -} - -xs__seqchoice::xs__seqchoice() -{ schemaRef = NULL; -} - -int xs__seqchoice::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema sequence/choice" << endl; - schemaRef = &schema; - for (vector<xs__contents>::iterator c = __contents.begin(); c != __contents.end(); ++c) - (*c).traverse(schema); - return SOAP_OK; -} - -void xs__seqchoice::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema *xs__seqchoice::schemaPtr() const -{ return schemaRef; -} - -xs__attributeGroup::xs__attributeGroup() -{ schemaRef = NULL; - attributeGroupRef = NULL; -} - -int xs__attributeGroup::traverse(xs__schema& schema) -{ if (vflag) - cerr << " Analyzing schema attributeGroup" << endl; - schemaRef = &schema; - for (vector<xs__attribute>::iterator at = attribute.begin(); at != attribute.end(); ++at) - (*at).traverse(schema); - for (vector<xs__attributeGroup>::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) - (*ag).traverse(schema); - attributeGroupRef = NULL; - if (ref) - { const char *token = qname_token(ref, schema.targetNamespace); - if (token) - { for (vector<xs__attributeGroup>::iterator i = schema.attributeGroup.begin(); i != schema.attributeGroup.end(); ++i) - if (!strcmp((*i).name, token)) - { attributeGroupRef = &(*i); - if (vflag) - cerr << " Found attributeGroup '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (!attributeGroupRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(ref, s->targetNamespace); - if (token) - { for (vector<xs__attributeGroup>::iterator j = s->attributeGroup.begin(); j != s->attributeGroup.end(); ++j) - { if (!strcmp((*j).name, token)) - { attributeGroupRef = &(*j); - if (vflag) - cerr << " Found attribute Group '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (attributeGroupRef) - break; - } - } - } - } - if (!attributeGroupRef) - if (!Wflag) - cerr << "Warning: could not find attributeGroup '" << (name?name:"") << "' ref '" << (ref?ref:"") << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - return SOAP_OK; -} - -void xs__attributeGroup::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -void xs__attributeGroup::attributeGroupPtr(xs__attributeGroup *attributeGroup) -{ attributeGroupRef = attributeGroup; -} - -xs__schema *xs__attributeGroup::schemaPtr() const -{ return schemaRef; -} - -xs__attributeGroup *xs__attributeGroup::attributeGroupPtr() const -{ return attributeGroupRef; -} - -int xs__any::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema any" << endl; - for (vector<xs__element>::iterator i = element.begin(); i != element.end(); ++i) - (*i).traverse(schema); - return SOAP_OK; -} - -xs__group::xs__group() -{ schemaRef = NULL; - groupRef = NULL; -} - -int xs__group::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema group" << endl; - schemaRef = &schema; - if (all) - all->traverse(schema); - else if (choice) - choice->traverse(schema); - else if (sequence) - sequence->traverse(schema); - groupRef = NULL; - if (ref) - { const char *token = qname_token(ref, schema.targetNamespace); - if (token) - { for (vector<xs__group>::iterator i = schema.group.begin(); i != schema.group.end(); ++i) - if (!strcmp((*i).name, token)) - { groupRef = &(*i); - if (vflag) - cerr << " Found group '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (!groupRef) - { for (vector<xs__import>::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) - { xs__schema *s = (*i).schemaPtr(); - if (s) - { token = qname_token(ref, s->targetNamespace); - if (token) - { for (vector<xs__group>::iterator j = s->group.begin(); j != s->group.end(); ++j) - { if (!strcmp((*j).name, token)) - { groupRef = &(*j); - if (vflag) - cerr << " Found group '" << (name?name:"") << "' ref '" << (token?token:"") << "'" << endl; - break; - } - } - if (groupRef) - break; - } - } - } - } - if (!groupRef) - if (!Wflag) - cerr << "Warning: could not find group '" << (name?name:"") << "' ref '" << (ref?ref:"") << "' in schema '" << (schema.targetNamespace?schema.targetNamespace:"") << "'" << endl; - } - return SOAP_OK; -} - -void xs__group::schemaPtr(xs__schema *schema) -{ schemaRef = schema; -} - -xs__schema* xs__group::schemaPtr() const -{ return schemaRef; -} - -void xs__group::groupPtr(xs__group *group) -{ groupRef = group; -} - -xs__group* xs__group::groupPtr() const -{ return groupRef; -} - -int xs__enumeration::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema enumeration '" << (value?value:"") << "'" << endl; - return SOAP_OK; -} - -int xs__pattern::traverse(xs__schema &schema) -{ if (vflag) - cerr << " Analyzing schema pattern" << endl; - return SOAP_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// I/O -// -//////////////////////////////////////////////////////////////////////////////// - -ostream &operator<<(ostream &o, const xs__schema &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, "xs:schema", 0, NULL); - soap_end_send(&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, "xs:schema", 0, NULL); - soap_end_send(e.soap); - e.soap->os = os; - } - return o; -} - -istream &operator>>(istream &i, xs__schema &e) -{ if (!e.soap) - { e.soap = soap_new(); - 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, "xs:schema", NULL) - || soap_end_recv(e.soap)) - { // handle error? Note: e.soap->error is set and app should check - } - e.soap->is = is; - return i; -} -