Mercurial > repos > ktnyt > gembassy
view GEMBASSY-1.0.3/gsoap/src/symbol2.c @ 0:8300eb051bea draft
Initial upload
author | ktnyt |
---|---|
date | Fri, 26 Jun 2015 05:19:29 -0400 |
parents | |
children |
line wrap: on
line source
/* symbol2.c Symbol table handling, type analysis, and code generation. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the 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 This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif char *envURI = "http://schemas.xmlsoap.org/soap/envelope/"; char *encURI = "http://schemas.xmlsoap.org/soap/encoding/"; char *rpcURI = "http://www.w3.org/2003/05/soap-rpc"; char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance"; char *xsdURI = "http://www.w3.org/2001/XMLSchema"; char *tmpURI = "http://tempuri.org"; static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */ static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */ static Tnode *Tptr[TYPES]; Service *services = NULL; FILE *fout, *fhead, *fclient, *fserver, *fheader, *flib, *fmatlab, *fmheader; int partnum = 0; int typeNO = 1; /* unique no. assigned to all types */ static int is_anytype_flag = 0; /* anytype is used */ static int has_nsmap = 0; int tagcmp(const char *s, const char *t); int tagncmp(const char *s, const char *t, size_t n); long minlen(Tnode *typ); long maxlen(Tnode *typ); int is_soap12(const char*); int has_detail_string(void); int has_Detail_string(void); void needs_lang(Entry *e); int is_mutable(Tnode *typ); int is_header_or_fault(Tnode *typ); int is_body(Tnode *typ); int is_volatile(Tnode* typ); int is_untyped(Tnode* typ); int is_primclass(Tnode* typ); int is_imported(Tnode* typ); int is_template(Tnode* typ); int is_mask(Tnode* typ); int is_attachment(Tnode* typ); int has_attachment(Tnode* typ); int is_void(Tnode* typ); int has_external(Tnode *typ); int has_volatile(Tnode *typ); int is_invisible(const char *name); int is_invisible_empty(Tnode *p); int is_eq_nons(const char *s, const char *t); int is_eq(const char *s, const char *t); int is_item(Entry *p); int is_self(Entry *p); const char *cstring(const char*); const char *xstring(const char*); /* install - add new symbol */ Symbol * install(const char *name, Token token) { Symbol *p; p = (Symbol*)emalloc(sizeof(Symbol)); p->name = emalloc(strlen(name)+1); strcpy(p->name, name); p->token = token; p->next = symlist; symlist = p; return p; } /* lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found. */ Symbol * lookup(const char *name) { Symbol *p; for (p = symlist; p; p = p->next) if (!strcmp(p->name, name)) return p; return NULL; } /* gensymidx - generate new symbol from base name and index */ Symbol * gensymidx(const char *base, int idx) { char buf[1024]; Symbol *s; sprintf(buf, "%s_%d", base, idx); s = lookup(buf); if (s) return s; return install(buf, ID); } /* gensym - generate new symbol from base name */ Symbol * gensym(const char *base) { static int num = 1; return gensymidx(base, num++); } /* mktable - make a new symbol table with a pointer to a previous table */ Table * mktable(Table *table) { Table *p; p = (Table*)emalloc(sizeof(Table)); p->sym = lookup("/*?*/"); p->list = (Entry*) 0; if (table == (Table*) 0) p->level = INTERNAL; else p->level = table->level+1; p->prev = table; return p; } /* mkmethod - make a new method by calling mktype */ Tnode * mkmethod(Tnode *ret, Table *args) { FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo)); fn->ret = ret; fn->args = args; return mktype(Tfun, fn, 0); } /* freetable - free space by removing a table */ void freetable(Table *table) { Entry *p, *q; if (table == (Table*) 0) return; for (p = table->list; p != (Entry*) 0; p = q) { q = p->next; free(p); } free(table); } /* unlinklast - unlink last entry added to table */ Entry * unlinklast(Table *table) { Entry **p, *q; if (table == (Table*)0) return (Entry*)0; for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0; p = &(*p)->next); q = *p; *p = (Entry*)0; return q; } /* enter - enter a symbol in a table. Error if already in the table */ Entry * enter(Table *table, Symbol *sym) { Entry *p, *q = NULL; again: for (p = table->list; p; q = p, p = p->next) { if (p->sym == sym && p->info.typ->type != Tfun) { char *s; sprintf(errbuf, "Duplicate declaration of '%s' (already declared at line %d), changing conflicting identifier name to new name '%s_'. Note: this problem may be caused by importing invalid XML schemas", sym->name, p->lineno, sym->name); semwarn(errbuf); s = (char*)emalloc(strlen(sym->name) + 2); strcpy(s, sym->name); strcat(s, "_"); sym = lookup(s); if (!sym) sym = install(s, ID); free(s); goto again; } } p = (Entry*)emalloc(sizeof(Entry)); p->sym = sym; p->tag = NULL; p->info.typ = NULL; p->info.sto = Snone; p->info.hasval = False; p->info.minOccurs = 1; p->info.maxOccurs = 1; p->info.offset = 0; p->level = table->level; p->lineno = yylineno; p->next = NULL; if (!q) table->list = p; else q->next = p; return p; } /* entry - return pointer to table entry of a symbol */ Entry * entry(Table *table, Symbol *sym) { Table *t; Entry *p; for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->sym == sym) return p; return NULL; } /* reenter - re-enter a symbol in a table. */ Entry * reenter(Table *table, Symbol *sym) { Entry *p, *q = NULL; for (p = table->list; p; q = p, p = p->next) if (p->sym == sym) break; if (p && p->next) { if (q) q->next = p->next; else table->list = p->next; for (q = p->next; q->next; q = q->next) ; q->next = p; p->next = NULL; } return p; } /* merge - append two tables if members are not duplicated */ int merge(Table *dest, Table *src) { Entry *p, *q; for (p = src->list; p; p = p->next) { q = entry(dest, p->sym); if (!q || q->info.typ != p->info.typ) { q = enter(dest, p->sym); q->info = p->info; } } return 0; } Entry * enumentry(Symbol *sym) { Table *t; Entry *p, *q; for (t = enumtable; t; t = t->prev) { for (p = t->list; p; p = p->next) { q = entry((Table*)p->info.typ->ref, sym); if (q) return q; } } return NULL; } char *get_mxClassID(Tnode*); char *t_ident(Tnode*); char *c_ident(Tnode*); char *ident(char*); char *soap_type(Tnode*); char *c_storage(Storage); char *c_init(Entry*); char *c_type(Tnode*); char *c_type_id(Tnode*, char*); char *xsi_type_cond(Tnode*, int); char *xsi_type(Tnode*); char *xsi_type_cond_u(Tnode*, int); char *xsi_type_u(Tnode*); char *the_type(Tnode*); char *wsdl_type(Tnode*, char*); char *base_type(Tnode*, char*); char *xml_tag(Tnode*); char *ns_qualifiedElement(Tnode*); char *ns_qualifiedAttribute(Tnode*); char *ns_convert(char*); char *field(Entry *p, char *ns); char *field_overridden(Table *t, Entry *p, char *ns); char *ns_add(Entry *p, char *ns); char *ns_addx(char *tag, char *ns); char *ns_add_overridden(Table *t, Entry *p, char *ns); char *ns_remove(char*); char *ns_remove1(char*); char *ns_remove2(char*); char *res_remove(char*); char *ns_name(char*); char *ns_cname(char*, char*); char *ns_fname(char*); int has_class(Tnode*); int has_constructor(Tnode*); int has_destructor(Tnode*); int has_getter(Tnode*); int has_setter(Tnode*); int has_ns(Tnode*); int has_ns_t(Tnode*); int has_ns_eq(char*, char*); char *strict_check(void); char *ns_of(char*); int eq_ns(char*, char*); char *prefix_of(char*); int has_offset(Tnode*); int reflevel(Tnode *typ); Tnode* reftype(Tnode *typ); int is_response(Tnode*); int is_XML(Tnode*); int is_stdXML(Tnode *p); Entry *get_response(Tnode*); int is_primitive_or_string(Tnode*); int is_primitive(Tnode*); Entry *is_discriminant(Tnode*); Entry *is_dynamic_array(Tnode*); int is_transient(Tnode*); int is_external(Tnode*); int is_anyType(Tnode*); int is_anyAttribute(Tnode*); int is_binary(Tnode*); int is_hexBinary(Tnode*); int is_fixedstring(Tnode*); int is_string(Tnode*); int is_wstring(Tnode*); int is_stdstring(Tnode*); int is_stdwstring(Tnode*); int is_stdstr(Tnode*); int is_typedef(Tnode*); int get_dimension(Tnode*); char *has_soapref(Tnode*); int is_document(const char*); int is_literal(const char*); int is_keyword(const char *); int is_repetition(Entry*); int is_choice(Entry*); int is_sequence(Entry*); int is_anytype(Entry*); char *xsi_type_Tarray(Tnode*); char *xsi_type_Darray(Tnode*); void matlab_def_table(Table*); void def_table(Table*); void generate(Tnode *); int no_of_var(Tnode*); char *pointer_stuff(Tnode*); void in_defs(Table*); void in_defs2(Table*); void in_defs3(Table*); void out_defs(Table*); void mark_defs(Table*); void in_attach(Table*); void out_attach(Table*); void soap_serialize(Tnode*); void soap_traverse(Tnode*); void soap_default(Tnode*); void soap_put(Tnode*); void soap_out(Tnode*); void soap_out_Darray(Tnode *); void soap_get(Tnode*); void soap_in(Tnode*); void soap_in_Darray(Tnode *); void soap_instantiate_class(Tnode *); int get_Darraydims(Tnode *typ); const char *nillable(Tnode *typ); void soap_serve(Table*); void generate_proto(Table*, Entry*); /* void generate_call(Table*, Entry*); void generate_server(Table*, Entry*); */ void generate_header(Table*); void get_namespace_prefixes(void); void generate_schema(Table*); void gen_schema(FILE*,Table*,char*,char*,int,int,char*,char*,char*,char*); void gen_type_documentation(FILE *fd, Entry *type, char *ns); int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns); void gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *encoding, char *style); void gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1); int gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1); void gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1); void gen_wsdl(FILE*,Table*,char*,char*,char*,char*,char*,char*,char*,char*); void gen_nsmap(FILE*,Symbol*,char*); void gen_proxy(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); void gen_object(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); void gen_proxy_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); void gen_proxy_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); void gen_object_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); void gen_object_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); void gen_method(FILE *fd, Table *table, Entry *method, int server); void gen_params(FILE *fd, Table *params, Entry *result, int flag); void gen_args(FILE *fd, Table *params, Entry *result, int flag); void gen_query_url(FILE *fd, Table *params); void gen_query_form(FILE *fd, Table *params); const char* gen_format(FILE *fd, Tnode *typ); void gen_call_method(FILE *fd, Table *table, Entry *method, char *name); void gen_serve_method(FILE *fd, Table *table, Entry *param, char *name); void gen_data(char*,Table*,char*,char*,char*,char*,char*,char*); FILE *gen_env(char*,char*,int,Table*,char*,char*,char*,char*,char*,char*,int); void gen_xmlns(FILE*); void gen_field(FILE*,int,Entry*,char*,char*,char*); void gen_val(FILE*,int,Tnode*,char*,char*,char*); void gen_atts(FILE*,int,Table*,char*); /* mktype - make a (new) type with a reference to additional information and the width in bytes required to store objects of that type. A pointer to the type is returned which can be compared to check if types are identical. */ Tnode * mktype(Type type, void *ref, int width) { Tnode *p; int t = 0; if (transient != -2 || type > Ttime) t = transient; if (type != Tstruct && type != Tclass && type != Tunion && (type != Tenum || ref)) { for (p = Tptr[type]; p; p = p->next) { if (p->ref == ref && p->sym == (Symbol*) 0 && p->width == width && p->transient == t) { if (imported && !p->imported) p->imported = imported; return p; /* type alrady exists in table */ } } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = type; p->ref = ref; p->id = lookup("/*?*/"); p->base = NULL; p->sym = (Symbol*)0; p->response = (Entry*)0; p->width = width; p->generated = False; p->classed = False; p->wsdl = False; p->next = Tptr[type]; p->transient = t; p->imported = imported; p->pattern = NULL; p->minLength = MINLONG64; p->maxLength = MAXLONG64; p->num = typeNO++; Tptr[type] = p; DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported)); if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass)) p->imported = ((Tnode*)ref)->imported; else if (lflag && !is_transient(p) && (type == Tenum || type == Tstruct || type == Tclass)) mkpointer(p); return p; } Tnode * mksymtype(Tnode *typ, Symbol *sym) { Tnode *p; p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = typ->type; p->ref = typ->ref; if (typ->id == lookup("/*?*/")) p->id = sym; else p->id = typ->id; p->sym = sym; p->response = (Entry*)0; p->width = typ->width; p->generated = False; p->classed = True; /* copy of existing (generated) type */ p->wsdl = False; p->next = Tptr[typ->type]; p->transient = transient; p->imported = imported; p->pattern = NULL; p->minLength = MINLONG64; p->maxLength = MAXLONG64; p->num = typeNO++; Tptr[typ->type] = p; DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported)); return p; } Tnode * mktemplate(Tnode *typ, Symbol *id) { Tnode *p; for (p = Tptr[Ttemplate]; p; p = p->next) if (p->ref == typ && p->id == id && p->transient == transient) { if (imported && !p->imported) p->imported = imported; return p; /* type alrady exists in table */ } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = Ttemplate; p->ref = typ; p->id = id; p->sym = NULL; p->response = (Entry*)0; p->width = 0; p->generated = False; p->classed = False; /* copy of existing (generated) type */ p->wsdl = False; p->next = Tptr[Ttemplate]; p->transient = transient; p->imported = imported; p->pattern = NULL; p->minLength = MINLONG64; p->maxLength = MAXLONG64; p->num = typeNO++; Tptr[Ttemplate] = p; return p; } /* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */ void copyrightnote(FILE *fd, char *fn) { fprintf(fd, "\ /* %s\n Generated by gSOAP "VERSION" from %s\n\ \n\ Copyright(C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The generated code is released under one of the following licenses:\n\ GPL or Genivia's license for commercial use.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ */", fn, filename); } void banner(FILE *fd, const char *text) { int i; fprintf(fd, "\n\n/"); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, ""); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "/\n"); } void identify(FILE *fd, char *fn) { time_t t = time(NULL), *p = &t; char tmp[256]; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver "VERSION" %s\")\n", fn, tmp); } void compile(Table *table) { Entry *p; Tnode *typ; Pragma *pragma; int classflag = 0; int found; int filenum; char *s; char base[1024]; char soapStub[1024]; char soapH[1024]; char soapC[1024]; char soapClient[1024]; char soapServer[1024]; char soapClientLib[1024]; char soapServerLib[1024]; char pathsoapStub[1024]; char pathsoapH[1024]; char pathsoapC[1024]; char pathsoapClient[1024]; char pathsoapServer[1024]; char pathsoapClientLib[1024]; char pathsoapServerLib[1024]; char soapMatlab[1024]; char pathsoapMatlab[1024]; char soapMatlabHdr[1024]; char pathsoapMatlabHdr[1024]; found = 0; for (p = table->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) found = 1; if (!found) Sflag = Cflag = Lflag = 1; /* no service operations were found */ if (*dirpath) fprintf(fmsg, "Using project directory path: %s\n", dirpath); if (namespaceid) { prefix = namespaceid; fprintf(fmsg, "Using code namespace: %s\n", namespaceid); } strcpy(base, prefix); if (cflag) s = ".c"; else s = ".cpp"; strcpy(soapMatlab, base); strcat(soapMatlab, "Matlab.c"); strcpy(pathsoapMatlab, dirpath); strcat(pathsoapMatlab, soapMatlab ); strcpy(soapMatlabHdr, base); strcat(soapMatlabHdr, "Matlab.h"); strcpy(pathsoapMatlabHdr, dirpath); strcat(pathsoapMatlabHdr, soapMatlabHdr); strcpy(soapStub, base); strcat(soapStub, "Stub.h"); strcpy(pathsoapStub, dirpath); strcat(pathsoapStub, soapStub); strcpy(soapH, base); strcat(soapH, "H.h"); strcpy(pathsoapH, dirpath); strcat(pathsoapH, soapH); strcpy(soapC, base); if (fflag) strcat(soapC, "C_nnn"); else strcat(soapC, "C"); strcat(soapC, s); strcpy(pathsoapC, dirpath); strcat(pathsoapC, soapC); strcpy(soapClient, base); strcat(soapClient, "Client"); strcat(soapClient, s); strcpy(pathsoapClient, dirpath); strcat(pathsoapClient, soapClient); strcpy(soapServer, base); strcat(soapServer, "Server"); strcat(soapServer, s); strcpy(pathsoapServer, dirpath); strcat(pathsoapServer, soapServer); strcpy(soapClientLib, base); strcat(soapClientLib, "ClientLib"); strcat(soapClientLib, s); strcpy(pathsoapClientLib, dirpath); strcat(pathsoapClientLib, soapClientLib); strcpy(soapServerLib, base); strcat(soapServerLib, "ServerLib"); strcat(soapServerLib, s); strcpy(pathsoapServerLib, dirpath); strcat(pathsoapServerLib, soapServerLib); if (mflag) { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab); fmatlab=fopen(pathsoapMatlab, "w"); if (!fmatlab) execerror("Cannot write to file"); copyrightnote(fmatlab, soapMatlab); fprintf(fmatlab,"\n#include \"%s\"\n", soapMatlabHdr); fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr); fmheader=fopen(pathsoapMatlabHdr, "w"); if (!fmheader) execerror("Cannot write to file"); copyrightnote(fmheader, soapMatlabHdr); fprintf(fmheader,"\n#include \"mex.h\"\n#include \"%s\"\n", soapStub); } fprintf(fmsg, "Saving %s annotated copy of the source input\n", pathsoapStub); fheader=fopen(pathsoapStub, "w"); if (!fheader) execerror("Cannot write to file"); copyrightnote(fheader, soapStub); fprintf(fheader,"\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix); for (pragma = pragmas; pragma; pragma = pragma->next) fprintf(fheader,"\n%s", pragma->pragma); if (nflag) fprintf(fheader,"\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif"); if (namespaceid) { fprintf(fheader,"\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); } fprintf(fheader,"\n#include \"stdsoap2.h\""); fprintf(fheader,"\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION MISMATCH IN GENERATED CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION); if (cflag) fprintf(fheader,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fheader,"\n\nnamespace %s {", namespaceid); fprintf(fmsg, "Saving %s interface declarations\n", pathsoapH); fhead=fopen(pathsoapH,"w"); if (!fhead) execerror("Cannot write to file"); copyrightnote(fhead, soapH); fprintf(fhead,"\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix); fprintf(fhead,"\n#include \"%s\"", soapStub); if (cflag) fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fhead,"\n\nnamespace %s {", namespaceid); fprintf(fhead, "\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);"); fprintf(fhead, "\n#endif"); if (!cflag && !namespaceid) fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);"); if (!cflag && !namespaceid) fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);"); generate_header(table); generate_schema(table); if (!Sflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s client calling stubs\n", pathsoapClient); fclient=fopen(pathsoapClient,"w"); if (!fclient) execerror("Cannot write to file"); copyrightnote(fclient, soapClient); fprintf(fclient,"\n\n#if defined(__BORLANDC__)"); fprintf(fclient,"\n#pragma option push -w-8060"); fprintf(fclient,"\n#pragma option push -w-8004"); fprintf(fclient,"\n#endif"); fprintf(fclient,"\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fclient,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fclient,"\n\nnamespace %s {", namespaceid); identify(fclient, soapClient); if (!Lflag) { flib=fopen(pathsoapClientLib,"w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapClientLib); fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapClient); fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapClient); fprintf(flib, "\n\n/* End of %s */\n", soapClientLib); fclose(flib); } } if (!Cflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer); fserver=fopen(pathsoapServer,"w"); if (!fserver) execerror("Cannot write to file"); copyrightnote(fserver, soapServer); fprintf(fserver,"\n\n#if defined(__BORLANDC__)"); fprintf(fserver,"\n#pragma option push -w-8060"); fprintf(fserver,"\n#pragma option push -w-8004"); fprintf(fserver,"\n#endif"); fprintf(fserver,"\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fserver,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fserver,"\n\nnamespace %s {", namespaceid); identify(fserver, soapServer); if (!Lflag) { flib = fopen(pathsoapServerLib,"w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapServerLib); fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapServer); fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapServer); fprintf(flib, "\n\n/* End of %s */\n", soapServerLib); fclose(flib); } } if (!iflag && !jflag) soap_serve(table); classflag = 0; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0) { classflag = 1; break; } } if (classflag || Tptr[Ttemplate]) { if (cflag) semwarn("Option -c conflicts with the use of classes"); } for (filenum = 1; partnum == 0; filenum++) { if (fflag) { char *t = strrchr(pathsoapC, '.'); sprintf(t-3, "%03d", filenum); *t = '.'; fprintf(fmsg, "Saving %s serializers (part %d)\n", pathsoapC, filenum); partnum = fflag; /* number of defs per file */ } else { fprintf(fmsg, "Saving %s serializers\n", pathsoapC); partnum = 1; } fout=fopen(pathsoapC,"w"); if (!fout) execerror("Cannot write to file"); copyrightnote(fout, soapC); fprintf(fout,"\n\n#if defined(__BORLANDC__)"); fprintf(fout,"\n#pragma option push -w-8060"); fprintf(fout,"\n#pragma option push -w-8004"); fprintf(fout,"\n#endif"); fprintf(fout,"\n\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fout,"\n\nnamespace %s {", namespaceid); identify(fout, soapC); if (filenum == 1) { if (!lflag) { fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap)\n{\n\tsoap->part = SOAP_IN_HEADER;\n\tsoap->header = soap_in_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", soap->header, NULL);\n\tsoap->part = SOAP_END_HEADER;\n\treturn soap->header == NULL;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t{\tsoap->part = SOAP_IN_HEADER;\n\t\tif (soap_out_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", 0, soap->header, NULL))\n\t\t\treturn soap->error;\n\t\tsoap->part = SOAP_END_HEADER;\n\t}\n\treturn SOAP_OK;\n}"); if (cflag) { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header))))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct) { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap, -1)))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap->header->soap_serialize(soap);\n}"); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap, -1)))\n\t\t\tsoap->header->soap_default(soap);\n\t}\n}"); } if (cflag) { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault));\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason));\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap, -1);\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); } else { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap, -1);\n\t\tsoap->fault->soap_default(soap);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap->fault->soap_serialize(soap);\n}"); } if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) { fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\treturn soap_put_SOAP_ENV__Fault(soap, soap->fault, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_OK;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\treturn (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, \"SOAP-ENV:Fault\", NULL)) == NULL;\n}"); } else { fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_put(soap, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_EOM;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_get(soap, \"SOAP-ENV:Fault\", NULL) == NULL;\n\treturn SOAP_EOM;\n}"); } fprintf(fhead,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap);"); fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code)\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;\n\treturn (const char**)&soap->fault->faultcode;\n}"); if (cflag) fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)&soap->fault->faultcode;\n}"); else fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap, -1);\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)&soap->fault->faultcode;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode)\n\t\t\treturn soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t\treturn NULL;\n\t}\n\treturn soap->fault->faultcode;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text;\n\treturn (const char**)&soap->fault->faultstring;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); if (has_Detail_string()) { if (cflag) fprintf(fout,"\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); else fprintf(fout,"\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1);\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); } if (has_detail_string()) { if (cflag) fprintf(fout,"\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)&soap->fault->detail->__any;\n}"); else fprintf(fout,"\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = soap_new_SOAP_ENV__Detail(soap, -1);\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)&soap->fault->detail->__any;\n}"); } if (!has_detail_string() && !has_Detail_string()) fprintf(fout,"\n\treturn NULL;\n}"); fprintf(fout,"\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); if (has_Detail_string()) fprintf(fout,"\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Detail)\n\t\treturn soap->fault->SOAP_ENV__Detail->__any;"); if (has_detail_string()) fprintf(fout,"\n\tif (soap->fault->detail)\n\t\treturn soap->fault->detail->__any;"); fprintf(fout,"\n\treturn NULL;\n}"); fprintf(fout,"\n\n#endif"); fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{"); fprintf(fout,"\n\tint t;\n\tif (soap->version == 1)\n\t{\tfor (;;)\n\t\t{\tif (!soap_getelement(soap, &t))\n\t\t\t\tif (soap->error || soap_ignore_element(soap))\n\t\t\t\t\tbreak;\n\t\t}\n\t}"); fprintf(fout,"\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)"); fprintf(fout,"\n\t\tsoap->error = SOAP_OK;"); fprintf(fout,"\n\treturn soap->error;"); fprintf(fout,"\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout,"\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type)\n{\t(void)type;"); fprintf(fout,"\n\tif (soap_peek_element(soap))\n\t\treturn NULL;"); fprintf(fout,"\n#ifndef WITH_NOIDREF\n\tif (!*soap->id || !(*type = soap_lookup_type(soap, soap->id)))\n\t\t*type = soap_lookup_type(soap, soap->href);"); fprintf(fout,"\n\tswitch (*type)\n\t{"); DBGLOG(fprintf(stderr,"\n Calling in_defs( ).")); fflush(fout); in_defs(table); DBGLOG(fprintf(stderr,"\n Completed in_defs( ).")); fprintf(fout,"\n\tdefault:\n#else\n\t*type = 0;\n#endif"); fprintf(fout,"\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;"); fflush(fout); in_defs2(table); fprintf(fout,"\n\t\tt = soap->tag;"); in_defs3(table); fprintf(fout,"\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{"); fprintf(fout,"\n\tif (!soap_peek_element(soap))"); fprintf(fout,"\n\t{\tint t;"); fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level=%%u, %%d)\\n\", soap->tag, soap->level, soap->body));"); fprintf(fout,"\n\t\tif (soap->mustUnderstand && !soap->other)"); fprintf(fout,"\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;"); fprintf(fout,"\n\t\tif (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}"); fprintf(fout,"\n\t\tif (!*soap->id || !soap_getelement(soap, &t))"); fprintf(fout,"\n\t\t{\tsoap->peeked = 0;"); fprintf(fout,"\n\t\t\tif (soap->fignore)\n\t\t\t\tsoap->error = soap->fignore(soap, soap->tag);\n\t\t\telse\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout,"\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));"); fprintf(fout,"\n\t\t\tif (!soap->error && soap->body)"); fprintf(fout,"\n\t\t\t{\tsoap->level++;"); fprintf(fout,"\n\t\t\t\twhile (!soap_ignore_element(soap))"); fprintf(fout,"\n\t\t\t\t\t;"); fprintf(fout,"\n\t\t\t\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout,"\n\t\t\t\t\tsoap->error = soap_element_end_in(soap, NULL);"); fprintf(fout,"\n\t\t\t}"); fprintf(fout,"\n\t\t}"); fprintf(fout,"\n\t}"); fprintf(fout,"\n\treturn soap->error;"); fprintf(fout,"\n}"); fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;"); fprintf(fout,"\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))"); fprintf(fout,"\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)"); fprintf(fout,"\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)"); fprintf(fout,"\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)"); fprintf(fout,"\n\t\t\t\t\tif (soap_putelement(soap, pp->ptr, \"id\", pp->id, pp->type))\n\t\t\t\t\t\treturn soap->error;"); fprintf(fout,"\n\treturn SOAP_OK;\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type)\n{\t(void)tag;"); fprintf(fout,"\n\tswitch (type)\n\t{"); fflush(fout); out_defs(table); fprintf(fout,"\n\t}\n\treturn SOAP_OK;\n}"); if (!cflag && !namespaceid) fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (is_anytype_flag) { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout,"\n\tswitch (type)\n\t{"); fflush(fout); mark_defs(table); fprintf(fout,"\n\t}\n}"); } else { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout,"\n}"); } if (!cflag && !namespaceid) fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout,"\n#endif"); } if (!cflag) { fprintf(fhead,"\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix); fprintf(fout,"\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n)\n{\t(void)type;\n\tswitch (t)\n\t{", prefix); if (classtable) for (p = classtable->list; p; p = p->next) if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#endif"); } if (typetable) for (p = typetable->list; p; p = p->next) if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#endif"); } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) if (typ->ref && !is_transient(typ)) fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), c_ident(typ)); fprintf(fout,"\n\t}\n\treturn NULL;\n}"); fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist*);", prefix); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist *p)", prefix); fprintf(fout,"\n{\tswitch (p->type)\n\t{"); if (classtable) { for (p = classtable->list; p; p = p->next) if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout,"\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE((%s*)p->ptr);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY((%s*)p->ptr);\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#endif"); } } if (typetable) { for (p = typetable->list; p; p = p->next) if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */ { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout,"\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE((%s*)p->ptr);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY((%s*)p->ptr);\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout,"\n#endif"); } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout,"\n\tcase %s:", soap_type(typ)); fprintf(fout,"\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE((%s*)p->ptr);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY((%s*)p->ptr);\n\t\tbreak;", c_type(typ), c_type(typ)); } } fprintf(fout,"\n\tdefault:\treturn SOAP_ERR;"); fprintf(fout,"\n\t}\n\treturn SOAP_OK;"); fprintf(fout,"\n}"); fprintf(fhead,"\nSOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap*, const char*, void*, int, size_t, const char*, const char*);"); if (!lflag) { fprintf(fout,"\n\nSOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType)"); fprintf(fout, "\n{\treturn soap_id_enter(soap, id, p, t, n, 0, type, arrayType, %s_instantiate);\n}", prefix); } if (Tptr[Ttemplate]) { fprintf(fhead, "\n\nSOAP_FMAC3 void* SOAP_FMAC4 soap_container_id_forward(struct soap*, const char*, void*, size_t, int, int, size_t, unsigned int);"); if (!lflag) { fprintf(fout, "\n\nSOAP_FMAC3 void* SOAP_FMAC4 soap_container_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k)"); fprintf(fout, "\n{\treturn soap_id_forward(soap, href, p, len, st, tt, n, k, %s_container_insert);\n}", prefix); } fprintf(fhead, "\n\nSOAP_FMAC3 void SOAP_FMAC4 %s_container_insert(struct soap*, int, int, void*, size_t, const void*, size_t);", prefix); if (!lflag) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 %s_container_insert(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n)", prefix); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n#pragma warning(disable:4065)\n#endif"); fprintf(fout,"\n{\n\t(void)soap; (void)st; (void)p; (void)len; (void)q; (void)n; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (tt)\n\t{"); for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s_container_insert type=%%d in %%d location=%%p object=%%p len=%%lu\\n\", st, tt, p, q, (unsigned long)len));", prefix); if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) fprintf(fout, "\n\t\t(*(%s)p)[len] = *(%s)q;", c_type_id(typ, "*"), c_type_id((Tnode*)typ->ref, "*")); else fprintf(fout, "\n\t\t((%s)p)->insert(((%s)p)->end(), *(%s)q);", c_type_id(typ, "*"), c_type_id(typ, "*"), c_type_id((Tnode*)typ->ref, "*")); fprintf(fout, "\n\t\tbreak;"); } } fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type=%%d in %%d\\n\", st, tt));"); fprintf(fout, "\n\t}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); fprintf(fout, "\n}"); } } } } def_table(table); if (namespaceid) fprintf(fout,"\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout,"\n\n#if defined(__BORLANDC__)"); fprintf(fout,"\n#pragma option pop"); fprintf(fout,"\n#pragma option pop"); fprintf(fout,"\n#endif"); fprintf(fout, "\n\n/* End of %s */\n", soapC); fclose(fout); } if (namespaceid) fprintf(fhead,"\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\n\n#endif"); fprintf(fhead, "\n\n/* End of %s */\n", soapH); fclose(fhead); if (namespaceid) fprintf(fheader,"\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fheader,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fheader, "\n\n#endif"); fprintf(fheader, "\n\n/* End of %s */\n", soapStub); fclose(fheader); if (mflag) { DBGLOG(fprintf(stderr,"\n Calling matlab_def_table( ).")); matlab_def_table(table); DBGLOG(fprintf(stderr,"\n Completed matlab_def_table( ).")); fclose(fmatlab); fclose(fmheader); } if (!Sflag && !iflag && !jflag) { if (namespaceid) fprintf(fclient,"\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fclient,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fclient,"\n\n#if defined(__BORLANDC__)"); fprintf(fclient,"\n#pragma option pop"); fprintf(fclient,"\n#pragma option pop"); fprintf(fclient,"\n#endif"); fprintf(fclient, "\n\n/* End of %s */\n", soapClient); fclose(fclient); } if (!Cflag && !iflag && !jflag) { if (namespaceid) fprintf(fserver,"\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fserver,"\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fserver,"\n\n#if defined(__BORLANDC__)"); fprintf(fserver,"\n#pragma option pop"); fprintf(fserver,"\n#pragma option pop"); fprintf(fserver,"\n#endif"); fprintf(fserver, "\n\n/* End of %s */\n", soapServer); fclose(fserver); } } void gen_class(FILE *fd, Entry *p) { Entry *Eptr; Tnode *typ = p->info.typ; char *x; x = xsi_type(typ); if (!x || !*x) x = wsdl_type(typ, ""); typ->classed = True; if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n\n#ifndef WITH_NOGLOBAL"); if (typ->ref) { fprintf(fd, "\n\n#ifndef %s", soap_type(typ)); fprintf(fd, "\n#define %s (%d)\n",soap_type(typ),typ->num); } else fprintf(fd, "\n\n"); if (is_volatile(typ)) fprintf(fd, "#if 0 /* volatile type: do not declare here, declared elsewhere */\n"); else if (is_transient(typ) && typ->ref) fprintf(fd, "/* Transient type: */\n"); else if (is_invisible(typ->id->name) && typ->ref) fprintf(fd, "/* Operation wrapper: */\n"); else if (is_hexBinary(typ)) fprintf(fd, "/* hexBinary schema type: */\n"); else if (is_binary(typ)) fprintf(fd, "/* Base64 schema type: */\n"); else if (is_discriminant(typ)) fprintf(fd, "/* Choice: */\n"); else if (is_dynamic_array(typ)) { Eptr = ((Table*)typ->ref)->list; if (has_ns(typ) || is_untyped(typ)) fprintf(fd, "/* Sequence of %s schema type: */\n", x); else { if (!eflag) { sprintf(errbuf, "array '%s' is not compliant with WS-I Basic Profile 1.0a, reason: SOAP encoded array", c_type(typ)); compliancewarn(errbuf); } fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); } } else if (is_primclass(typ)) fprintf(fd, "/* Primitive %s schema type: */\n", x); else if (!strcmp(typ->id->name, "SOAP_ENV__Header")) fprintf(fd, "/* SOAP Header: */\n"); else if (!strcmp(typ->id->name, "SOAP_ENV__Fault")) fprintf(fd, "/* SOAP Fault: */\n"); else if (!strcmp(typ->id->name, "SOAP_ENV__Code")) fprintf(fd, "/* SOAP Fault Code: */\n"); else if (x && *x && typ->ref) fprintf(fd, "/* %s */\n", x); fflush(fd); if (typ->type == Tstruct) { DBGLOG(fprintf(stderr,"\nstruct %s\n", typ->id->name)); if (typ->ref) { int permission = -1; fprintf(fd, "struct %s\n{", ident(typ->id->name)); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { if (!cflag && permission != (Eptr->info.sto & (Sprivate | Sprotected))) { if (Eptr->info.sto & Sprivate) fprintf(fd, "\nprivate:"); else if (Eptr->info.sto & Sprotected) fprintf(fd, "\nprotected:"); else fprintf(fd, "\npublic:"); permission = (Eptr->info.sto & (Sprivate | Sprotected)); } if (cflag && Eptr->info.typ->type == Tfun) continue; if (cflag && (Eptr->info.sto & Stypedef)) continue; fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); /*if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) fprintf(fd, "class "); */ if (Eptr->sym == typ->id && Eptr->info.typ->type == Tfun) /* a hack to emit constructor in a struct, where constructor has no return value */ ((FNinfo*)Eptr->info.typ->ref)->ret = mknone(); fprintf(fd, "%s", c_type_id(Eptr->info.typ,Eptr->sym->name)); if (Eptr->info.sto & Sconst) fprintf(fd, "%s;", c_init(Eptr)); else if (Eptr->info.sto & Sconstobj) fprintf(fd, " const;"); else fprintf(fd, ";"); if (Eptr->info.sto & Sreturn) fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient */"); if (is_imported(Eptr->info.typ)) fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); if (Eptr->info.sto & Sattribute) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required attribute of type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional attribute of type %s */", wsdl_type(Eptr->info.typ, "")); } if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* not serialized */"); else if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(Eptr)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name)); else fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name)); } else if (is_anytype(Eptr)) fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name)); else if (is_choice(Eptr)) fprintf(fd, "\t/* union discriminant (of union defined below) */"); else if (Eptr->info.typ->type != Tfun && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements of type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, wsdl_type(Eptr->info.typ, "")); else if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, "")); } if (!is_dynamic_array(typ) && !is_primclass(typ)) { if (!strncmp(Eptr->sym->name, "__size", 6)) { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (!strncmp(Eptr->sym->name, "__type", 6)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer or union member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } } } if (!cflag && !is_transient(typ) && !is_volatile(typ)) { fprintf(fd,"\npublic:\n\tint soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); #if 0 /* ctor not allowed in unions, so keep things simple for structs */ if (!has_constructor(typ)) { fprintf(fd,"\n\t %s()", ident(typ->id->name)); fprintf(fd, " { void soap_default_%s(struct soap*, %s); soap_default_%s(NULL, this); }", c_ident(typ), c_type_id(typ, "*"), c_ident(typ)); } if (!has_destructor(typ)) fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name)); #endif } if (!((Table*)typ->ref)->list) { if (cflag) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); else fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); } fprintf(fd, "\n};"); } else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) { sprintf(errbuf, "struct '%s' is empty", typ->id->name); semwarn(errbuf); } } else if (typ->type == Tclass) { DBGLOG(fprintf(stderr,"\nclass %s\n", typ->id->name)); if (typ->ref) { int permission = -1; fprintf(fd,"class SOAP_CMAC %s", ident(typ->id->name)); if (typ->base) fprintf(fd," : public %s", ident(typ->base->name)); fprintf(fd,"\n{"); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { if (permission != (Eptr->info.sto & (Sprivate | Sprotected))) { if (Eptr->info.sto & Sprivate) fprintf(fd, "\nprivate:"); else if (Eptr->info.sto & Sprotected) fprintf(fd, "\nprotected:"); else fprintf(fd, "\npublic:"); permission = (Eptr->info.sto & (Sprivate | Sprotected)); } fprintf(fd,"\n\t%s", c_storage(Eptr->info.sto)); /* if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) fprintf(fd, "class "); */ fprintf(fd,"%s", c_type_id(Eptr->info.typ,Eptr->sym->name)); if (Eptr->info.sto & Sconstobj) fprintf(fd, " const"); if (Eptr->info.sto & Sconst) fprintf(fd, "%s;", c_init(Eptr)); else if (Eptr->info.sto & Sabstract) fprintf(fd, " = 0;"); else fprintf(fd, ";"); if (Eptr->info.sto & Sreturn) fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient */"); if (is_imported(Eptr->info.typ)) fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); if (Eptr->info.sto & Sattribute) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required attribute */"); else fprintf(fd, "\t/* optional attribute */"); } if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* not serialized */"); else if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(Eptr)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name)); else fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name)); } else if (is_anytype(Eptr)) fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name)); else if (is_choice(Eptr)) fprintf(fd, "\t/* union discriminant (of union defined below) */"); else if (Eptr->info.typ->type != Tfun && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements */", Eptr->info.minOccurs, Eptr->info.maxOccurs); else if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, "")); } if (!is_dynamic_array(typ) && !is_primclass(typ)) { if (!strncmp(Eptr->sym->name, "__size", 6)) { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (!strncmp(Eptr->sym->name, "__type", 6)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer or union member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } } } if (!is_transient(typ) && !is_volatile(typ)) { fprintf(fd,"\npublic:\n\tvirtual int soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); fprintf(fd,"\n\tvirtual void soap_default(struct soap*);"); fprintf(fd,"\n\tvirtual void soap_serialize(struct soap*) const;"); if (kflag) fprintf(fd,"\n\tvirtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); fprintf(fd,"\n\tvirtual int soap_put(struct soap*, const char*, const char*) const;"); fprintf(fd,"\n\tvirtual int soap_out(struct soap*, const char*, int, const char*) const;"); fprintf(fd,"\n\tvirtual void *soap_get(struct soap*, const char*, const char*);"); fprintf(fd,"\n\tvirtual void *soap_in(struct soap*, const char*, const char*);"); if (!has_constructor(typ)) { fprintf(fd,"\n\t %s()", ident(typ->id->name)); fprintf(fd, " { %s::soap_default(NULL); }", ident(typ->id->name)); } if (!has_destructor(typ)) fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name)); /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) fprintf(fd,"\n\tfriend %s *soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", typ->id->name, typ->id->name); fprintf(fd,"\n\tfriend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); fprintf(fd,"\n\tfriend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); */ } else if (!((Table*)typ->ref)->list) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); fprintf(fd,"\n};"); } else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) { sprintf(errbuf, "class '%s' is empty", typ->id->name); semwarn(errbuf); } } else if (typ->type == Tunion) { int i = 1; if (typ->ref) { fprintf(fd, "union %s\n{", ident(typ->id->name)); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { fprintf(fd, "\n#define SOAP_UNION_%s_%s\t(%d)", c_ident(typ), ident(Eptr->sym->name), i); i++; fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); fprintf(fd, "%s;", c_type_id(Eptr->info.typ,Eptr->sym->name)); if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* const field cannot be deserialized */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient */"); if (Eptr->info.sto & Sattribute) { fprintf(fd, "\t/* attribute not allowed in union */"); sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); semwarn(errbuf); } if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); } fprintf(fd, "\n};"); } else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) { sprintf(errbuf, "union '%s' is empty", typ->id->name); semwarn(errbuf); } } if (is_volatile(typ)) fprintf(fd, "\n#endif"); if ((typ->type == Tstruct || typ->type == Tunion) && p->sym->token == TYPE) fprintf(fd, "\ntypedef %s %s;", c_type(typ), ident(p->sym->name)); if (typ->ref) fprintf(fd, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n\n#endif"); fflush(fd); } void generate_header(Table *t) { Entry *p, *q; banner(fheader, "Enumerations"); fflush(fheader); if (enumtable) for (p = enumtable->list; p; p = p->next) { char *x; if (is_imported(p->info.typ) || (is_transient(p->info.typ) && !p->info.typ->ref)) continue; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(fheader, "\n\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#if 0 /* volatile type: do not redeclare here */"); if (is_mask(p->info.typ)) fprintf(fheader, "\n/* Bitmask %s */", x); else fprintf(fheader, "\n/* %s */", x); fprintf(fheader, "\nenum %s { ", ident(p->info.typ->id->name)); if ((Table*)p->info.typ->ref) { const char *c = ""; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); else fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); c = ", "; } } fprintf(fheader, " };"); if (p->sym->token == TYPE) fprintf(fheader, "\ntypedef %s %s;", c_type(p->info.typ), ident(p->sym->name)); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#endif"); fprintf(fheader, "\n#endif"); } banner(fheader, "Types with Custom Serializers"); fflush(fheader); if (typetable) for (p = typetable->list; p; p = p->next) { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } if (typetable) for (p = typetable->list; p; p = p->next) { if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); fprintf(fheader,"\n%sstd::string %s;", c_storage(p->info.sto), p->sym->name); fprintf(fheader, "\n#endif\n"); } } banner(fheader, "Classes and Structs"); fflush(fheader); if (classtable) for (p = classtable->list; p; p = p->next) { if (!is_imported(p->info.typ)) gen_class(fheader, p); } banner(fheader, "Typedefs"); fflush(fheader); if (typetable) for (p = typetable->list; p; p = p->next) { if (!is_primitive_or_string(p->info.typ) && !is_external(p->info.typ) && !is_XML(p->info.typ) && !is_transient(p->info.typ) && !has_ns_t(p->info.typ) && !is_imported(p->info.typ) && !is_template(p->info.typ)) { sprintf(errbuf, "typedef '%s' is not namespace qualified: schema definition for '%s' in WSDL file output may be invalid", p->sym->name, p->sym->name); semwarn(errbuf); } if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) continue; if (!is_external(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); fprintf(fheader,"\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif\n"); } } banner(fheader, "Externals"); fflush(fheader); if (t) for (p = t->list; p; p = p->next) if (p->info.typ->type != Tfun || p->info.sto & Sextern) { fprintf(fheader,"\n\nextern %s", c_storage(p->info.sto)); fprintf(fheader,"%s;", c_type_id(p->info.typ, p->sym->name)); } fflush(fheader); } void get_namespace_prefixes(void) { Symbol *p, *q; int i, n; char *s, buf[256]; if (nslist) return; for (p = symlist; p; p = p->next) { if (*p->name != '~') { s = p->name; while (*s == '_') s++; n = (int)(strlen(s) - 2); for (i = 1; i < n; i++) { if (s[i] == ':' || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) || !strncmp(s+i, "___USCORE", 9) || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) { if (s[i+1] == ':') { i++; continue; } strncpy(buf, s, i); buf[i] = '\0'; if (!strcmp(buf, "SOAP_ENV") || !strcmp(buf, "SOAP_ENC") || !strcmp(buf, "xsd") || !strcmp(buf, "xsi") || !strcmp(buf, "xml") || !strcmp(buf, "std") || !strncmp(buf, "soap_", 5)) goto nsnext; for (q = nslist; q; q = q->next) if (!strcmp(q->name, buf)) goto nsnext; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(i+1); strcpy(q->name, buf); q->name[i] = '\0'; q->next = nslist; nslist = q; break; } } } nsnext: ; } q = (Symbol*)emalloc(sizeof(Symbol)); q->name = "xsd"; q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = "xsi"; q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = "SOAP-ENC"; q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = "SOAP-ENV"; q->next = nslist; nslist = q; } void generate_schema(Table *t) { Entry *p; Symbol *ns; char *name = NULL; char *URL = NULL; char *executable = NULL; char *URI = NULL; char *style = NULL; char *encoding = NULL; char *protocol = NULL; char *import = NULL; Service *sp = NULL; char buf[1024]; FILE *fd; int flag = 0; get_namespace_prefixes(); for (ns = nslist; ns; ns = ns->next) { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) continue; name = NULL; URL = NULL; executable = NULL; URI = NULL; style = NULL; encoding = NULL; import = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns->name)) { name = ns_cname(sp->name, NULL); URL = sp->URL; executable = sp->executable; URI = sp->URI; style = sp->style; encoding = sp->encoding; protocol = sp->protocol; import = sp->import; break; } } if (!URI) { URI = emalloc(strlen(tmpURI) + strlen(ns->name) + 6); sprintf(URI, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); } if (vflag >= 0 && is_document(style) && encoding && !*encoding) { semwarn("Cannot use document style with SOAP encoding"); encoding = NULL; } if (!name) name = "Service"; if (!URL) URL = "http://localhost:80"; if (!import) flag = 1; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { if (name) fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); if (protocol) fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); if (style && vflag >= 0) fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); else if (!eflag && vflag >= 0) fprintf(fmsg, "Using %s service style: document\n", ns->name); if (encoding && *encoding) fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); else if (encoding && !*encoding && vflag >= 0) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); else if (!eflag && vflag >= 0) fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); if (URL) fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); if (executable) fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); if (import) fprintf(fmsg, "Using %s schema import: %s\n", ns->name, import); else if (URI) fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); if (sp && sp->name) sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); else sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); if (!wflag && !import) { fprintf(fmsg, "Saving %s Web Service description\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write WSDL file"); gen_wsdl(fd, t, ns->name, name, URL, executable, URI, style, encoding, protocol); fclose(fd); } if (!cflag) { if (iflag || jflag) { char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; if (!Sflag) { char *name1 = ns_cname(sname, "Proxy"); sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); fprintf(fmsg, "Saving %s client proxy class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy class file"); sprintf(buf, "%s%s.h", prefix, name1); copyrightnote(fd, buf); gen_proxy_header(fd, t, ns, name1, URL, executable, URI, encoding); fclose(fd); sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); fprintf(fmsg, "Saving %s client proxy class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy class file"); sprintf(buf, "%s%s.cpp", prefix, name1); copyrightnote(fd, buf); gen_proxy_code(fd, t, ns, name1, URL, executable, URI, encoding); fclose(fd); } if (!Cflag) { char *name1 = ns_cname(sname, "Service"); sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); fprintf(fmsg, "Saving %s service class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write service class file"); sprintf(buf, "%s%s.h", prefix, name1); copyrightnote(fd, buf); gen_object_header(fd, t, ns, name1, URL, executable, URI, encoding); fclose(fd); sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); fprintf(fmsg, "Saving %s service class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write service class file"); sprintf(buf, "%s%s.cpp", prefix, name1); copyrightnote(fd, buf); gen_object_code(fd, t, ns, name1, URL, executable, URI, encoding); fclose(fd); } } else if (zflag == 1) { if (!Sflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, name, URL, executable, URI, encoding); fclose(fd); } else if (!Sflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, "Service", URL, executable, URI, encoding); fclose(fd); } if (!Cflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); copyrightnote(fd, buf); gen_object(fd, t, ns, name, URL, executable, URI, encoding); fclose(fd); } else if (!Cflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s.h", ns_cname(prefix, "Object")); copyrightnote(fd, buf); gen_object(fd, t, ns, "Service", URL, executable, URI, encoding); fclose(fd); } } } if (!xflag) { strcpy(buf, dirpath); if (sp && sp->name) strcat(buf, ns_fname(name)); else strcat(buf, ns_fname(ns->name)); strcat(buf, "."); gen_data(buf, t, ns->name, name, URL, executable, URI, encoding); } break; } } if (sp && sp->name) { has_nsmap = 1; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); fprintf(fd, "\n#include \"%sH.h\"", prefix); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); gen_nsmap(fd, ns, URI); fclose(fd); if (Tflag && !Cflag) { Entry *method; char soapTester[1024]; char pathsoapTester[1024]; char *name1 = NULL; Tflag = 0; strcpy(soapTester, prefix); strcat(soapTester, "Tester"); if (cflag) strcat(soapTester, ".c"); else strcat(soapTester, ".cpp"); strcpy(pathsoapTester, dirpath); strcat(pathsoapTester, soapTester); fprintf(fmsg, "Saving %s server auto-test code\n", pathsoapTester); fd = fopen(pathsoapTester,"w"); if (!fd) execerror("Cannot write to file"); copyrightnote(fd, soapTester); fprintf(fd, "\n/*\n Stand-alone server auto-test code:\n Takes request from standard input or over TCP/IP socket and returns\nresponse to standard output or socket\n\n Compile:\n cc soapTester.c soapServer.c soapC.c stdsoap2.c\n\n Command line usage with redirect over stdin/out:\n > ./a.out < SomeTest.req.xml\n > ./a.out 12288 < SomeTest.req.xml\n Note: 12288 = SOAP_XML_INDENT | SOAP_XML_STRICT (see codes in stdsoap2.h)\n Command line usage to start server at port 8080:\n > a.out 12288 8080\n*/\n\n#include \""); if (iflag || jflag) { char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; name1 = ns_cname(sname, "Service"); fprintf(fd, "%s%s%s.h\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\t%s service(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn service.serve();\n\treturn service.run(atoi(argv[2]));\n}\n", dirpath, prefix, name1, name1); } else fprintf(fd, "%s%s.nsmap\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\tstruct soap *soap = soap_new1(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn %s_serve(soap);\n\tif (soap_valid_socket(soap_bind(soap, NULL, atoi(argv[2]), 100)))\n\t\twhile (soap_valid_socket(soap_accept(soap)))\n\t\t{\t%s_serve(soap);\n\t\t\tsoap_destroy(soap);\n\t\t\tsoap_end(soap);\n\t\t}\n\tsoap_free(soap);\n\treturn 0;\n}\n", dirpath, nflag?prefix:ns_cname(name, NULL), nflag?prefix:"soap", nflag?prefix:"soap"); for (method = t->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p, *q = entry(t, method->sym); Table *r; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); r = (Table*)q->info.typ->ref; if (iflag || jflag) fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); gen_params(fd, r, p, !iflag && !jflag); /* single param to single param echo */ if (p && r && r->list && r->list->info.typ == p->info.typ) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ->type == Tpointer && r->list->info.typ->ref == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); /* params to wrapped params echo */ else { fprintf(fd, "\n{\t"); if (r && p && p->info.typ->ref && ((Tnode*)p->info.typ->ref)->ref && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { const char *s, *a; int d = 1; s = ident(p->sym->name); if (p->info.typ->type == Treference) a = "."; else a = "->"; for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) { if (p->info.typ == q->info.typ) fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); else d = 0; } if (!d) fprintf(fd, "\n\t/* Return incomplete response with default data values */"); } fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); } fflush(fd); } } fclose(fd); } } } if (!wflag && !import) { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); fprintf(fmsg, "Saving %s XML schema\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write schema file"); fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); if (t) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { gen_schema(fd, t, ns->name, ns->name, 0, 1, URL, URI, style, encoding); break; } if (!t || !p) gen_schema(fd, t, ns->name, ns->name, 0, 0, URL, URI, style, encoding); fclose(fd); } } if (!has_nsmap && flag) { if (Tflag && !Cflag && !iflag && !jflag) fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap service name\n"); for (ns = nslist; ns; ns = ns->next) if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) break; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else if (ns && ns->name) sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); else sprintf(buf, "%ssoap.nsmap", dirpath); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); fprintf(fd, "\n#include \"%sH.h\"", prefix); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); gen_nsmap(fd, ns, URI); fclose(fd); } } int chkhdr(char *part) { Entry *p; p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) return 1; sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member field is not qualified", part); semwarn(errbuf); return 0; } void gen_wsdl(FILE *fd, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *style, char *encoding, char *protocol) { Entry *p, *q, *r; Symbol *s; Service *sp, *sp2; Method *m; const char *mimein = NULL, *mimeout = NULL; int prot, mask = 0x0; /* 0x1 = SOAP, 0x2 = GET, 0x4 = PUT, 0x8 = POST */ char *action, *comment, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; char *portname; char *binding; fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns)) break; if (sp && sp->definitions) fprintf(fd, "<definitions name=\"%s\"\n", sp->definitions); else fprintf(fd, "<definitions name=\"%s\"\n", name); if (sp && sp->WSDL) fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); else fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); if (sp && sp->binding) binding = ns_cname(sp->binding, NULL); else binding = name; if (sp && sp->portname) portname = ns_cname(sp->portname, NULL); else portname = name; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); else if (!strcmp(s->name, "SOAP-ENC")) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } if (is_soap12(encoding)) fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); else fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); fprintf(fd, "<types>\n\n"); for (s = nslist; s; s = s->next) gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), 1, URL, URI, style, encoding); fprintf(fd, "</types>\n\n"); fflush(fd); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { mimein = NULL; mimeout = NULL; comment = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == COMMENT) comment = m->part; } } } if (!method_response_encoding) method_response_encoding = method_encoding; if (get_response(p->info.typ)) fprintf(fd, "<message name=\"%sRequest\">\n", ns_remove(p->sym->name)); else fprintf(fd, "<message name=\"%s\">\n", ns_remove(p->sym->name)); fflush(fd); if (is_document(method_style)) { if (is_invisible(p->sym->name)) { q = entry(classtable, p->sym); if (q) { q = ((Table*)q->info.typ->ref)->list; if (q) { if (is_invisible(q->sym->name)) { r = entry(classtable, q->sym); if (r) { r = ((Table*)r->info.typ->ref)->list; if (r) { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns)); if (gen_member_documentation(fd, p->sym, r, ns)) fprintf(fd, " </part>\n"); } } } else { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } } } } else { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(p, ns)); if (gen_member_documentation(fd, p->sym, p, ns)) fprintf(fd, " </part>\n"); } } else { q = entry(classtable, p->sym); if (q) { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_literal(method_encoding)) { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } else if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); else { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } } } } } if (mimein) fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); fprintf(fd, "</message>\n\n"); fflush(fd); q = (Entry*)p->info.typ->ref; for (r = t->list; r; r = r->next) if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) q = NULL; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) { fprintf(fd, "<message name=\"%sResponse\">\n", ns_remove(p->sym->name)); if (is_document(method_style)) fprintf(fd, " <part name=\"Body\" element=\"%sResponse\"/>\n", ns_add(p, ns)); else if (is_literal(method_response_encoding)) { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); else { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } if (mimeout) fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); fprintf(fd, "</message>\n\n"); } else if (q && q->info.typ->wsdl == False) { q->info.typ->wsdl = True; fprintf(fd, "<message name=\"%s\">\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (is_document(method_style)) { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) fprintf(fd, " <part name=\"Body\" element=\"%s\"/>\n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; if (r) { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns)); if (gen_member_documentation(fd, p->sym, r, ns)) fprintf(fd, " </part>\n"); } } else { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_convert(((Tnode*)q->info.typ->ref)->id->name)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } } else { if (((Tnode*)q->info.typ->ref)->ref) { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_literal(method_response_encoding)) { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } else if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); else { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </part>\n"); } } } } } if (mimeout) fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); fprintf(fd, "</message>\n\n"); } fflush(fd); } } if (custom_header) { Table *r; fprintf(fd, "<message name=\"%sHeader\">\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) fprintf(fd, " <part name=\"%s\" element=\"%s\"/>\n", ns_remove(q->sym->name), ns_add(q, ns)); } } fprintf(fd, "</message>\n\n"); } if (custom_fault) { Table *r; fprintf(fd, "<message name=\"%sFault\">\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && has_ns_eq(NULL, q->sym->name)) { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, q->sym, q, ns)) fprintf(fd, " </part>\n"); } fprintf(fd, "</message>\n\n"); } if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess&FAULT && m->part) { Method *m2; int flag = 0; for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) if (m2->mess&FAULT && !strcmp(m2->part, m->part)) flag = 1; if (!flag) { if (typetable) for (p = typetable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) break; if (!p && classtable) for (p = classtable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) break; if (p) { fprintf(fd, "<message name=\"%sFault\">\n", ns_remove(m->part)); fprintf(fd, " <part name=\"Fault\" element=\"%s\"/>\n", ns_convert(m->part)); fprintf(fd, "</message>\n\n"); flag = 0; if (custom_fault) { Table *r; r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && (!strcmp(q->sym->name, m->part) || !strcmp(q->sym->name + 1, m->part))) { flag = 1; break; } } if (!flag) { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to a member of struct SOAP_ENV__Detail: suggest to define struct SOAP_ENV__Detail with member %s", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } else { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to struct/class or typedef: should globablly define fault %s as type (typedef or struct/class)", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } } } } fflush(fd); if (sp && sp->porttype) fprintf(fd, "<portType name=\"%s\">\n", sp->porttype); else fprintf(fd, "<portType name=\"%s\">\n", ns_cname(name, "PortType")); if (protocol) { if (strncmp(protocol, "SOAP", 4)) { if (strstr(protocol, "GET")) mask = 0x2; else if (strstr(protocol, "PUT")) mask = 0x4; else /* POST */ mask = 0x8; } else mask = 0x1; } for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { comment = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess == COMMENT && is_eq_nons(m->name, p->sym->name)) comment = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) mask |= 0x2; else if (strstr(m->part, "PUT")) mask |= 0x4; else /* POST */ mask |= 0x8; } else mask |= 0x1; } } } if (!mask) { if (vflag < 0) mask = 0x8; /* -0 option: use POST */ else mask = 0x1; } fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); if (comment) fprintf(fd, " <documentation>%s</documentation>\n", comment); else fprintf(fd, " <documentation>Service definition of function %s</documentation>\n", p->sym->name); if (get_response(p->info.typ)) fprintf(fd, " <input message=\"tns:%sRequest\"/>\n", ns_remove(p->sym->name)); else fprintf(fd, " <input message=\"tns:%s\"/>\n", ns_remove(p->sym->name)); q = (Entry*)p->info.typ->ref; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) fprintf(fd, " <output message=\"tns:%sResponse\"/>\n", ns_remove(p->sym->name)); else if (q) fprintf(fd, " <output message=\"tns:%s\"/>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " <fault name=\"%s\" message=\"tns:%sFault\"/>\n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " </operation>\n"); } } fprintf(fd, "</portType>\n\n"); for (prot = 0x1; prot <= 0x8; prot <<= 1) { if ((prot & mask)) { const char *v = "", *b = ""; switch (prot) { case 0x1: v = ""; b = "SOAP"; break; case 0x2: v = "GET"; b = "HTTP"; break; case 0x4: v = "PUT"; b = "HTTP"; break; case 0x8: v = "POST"; b = "HTTP"; break; } fprintf(fd, "<binding name=\"%s%s\" ", binding, v); if (prot == 0x1) { if (is_document(style)) { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", sp->porttype); else fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", ns_cname(name, "PortType")); } else { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", sp->porttype); else fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", ns_cname(name, "PortType")); } if (sp && sp->transport) fprintf(fd, " transport=\"%s\"/>\n", sp->transport); else fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); } else { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", sp->porttype, v); else fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", ns_cname(name, "PortType"), v); } fflush(fd); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { action = ""; mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { int v = 0x1; if (sp->protocol) { if (strncmp(sp->protocol, "SOAP", 4)) { if (strstr(sp->protocol, "GET")) v = 0x2; else if (strstr(sp->protocol, "PUT")) v = 0x4; else /* POST */ v = 0x8; } } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) action = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) v = 0x2; else if (strstr(m->part, "PUT")) v = 0x4; else /* POST */ v = 0x8; } else v = 0x1; } } } if (vflag < 0) v = 0x8; if (prot != v) continue; } if (!method_response_encoding) method_response_encoding = method_encoding; fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); if (prot == 0x1) { if (is_document(style)) { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " <SOAP:operation/>\n"); else if (*action == '"') fprintf(fd, " <SOAP:operation soapAction=%s/>\n", action); else fprintf(fd, " <SOAP:operation soapAction=\"%s\"/>\n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n"); else if (*action == '"') fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action); else fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action); } else { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " <SOAP:operation style=\"document\"/>\n"); else if (*action == '"') fprintf(fd, " <SOAP:operation style=\"document\" soapAction=%s/>\n", action); else fprintf(fd, " <SOAP:operation style=\"document\" soapAction=\"%s\"/>\n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n"); else if (*action == '"') fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action); else fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action); } } else { if (!*action) fprintf(fd, " <HTTP:operation/>\n"); else if (*action == '"') fprintf(fd, " <HTTP:operation location=%s/>\n", action); else fprintf(fd, " <HTTP:operation location=\"%s\"/>\n", action); } fprintf(fd, " <input>\n"); q = entry(classtable, p->sym); if (prot == 0x1) { if (mimein) fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n"); if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) { if (is_document(method_style)) fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n"); else fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI); } else { if (encoding && *encoding) fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); else if (method_encoding && *method_encoding) fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_encoding); else fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI); if (!eflag) { sprintf(errbuf, "operation '%s' is not compliant with WS-I Basic Profile 1.0a, reason: uses SOAP encoding", p->sym->name); compliancewarn(errbuf); } } if (custom_header) { m = NULL; if (sp) { for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) { if (chkhdr(m->part)) fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part)); } } } if (mimein) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part); } } fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n"); } } else if (prot == 0x2) fprintf(fd, " <HTTP:urlEncoded/>\n"); else { if (mimein) fprintf(fd, " <MIME:content type=\"%s\"/>\n", mimein); else if (!q || is_document(method_style)) fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); else fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name)); } fprintf(fd, " </input>\n"); q = (Entry*)p->info.typ->ref; if (!q || !q->info.typ->ref) { fprintf(fd, " </operation>\n"); continue; } if (prot != 0x4) { fprintf(fd, " <output>\n"); if (prot == 0x1) { if (mimeout) fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n"); if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) { if (is_document(method_style)) fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n"); else fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI); } else if (encoding && *encoding) fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); else if (method_response_encoding && *method_response_encoding) fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_response_encoding); else fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI); if (custom_header) { if (sp) for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) { if (chkhdr(m->part)) fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part)); } } if (mimeout) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part); } } fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n"); } } else { q = (Entry*)p->info.typ->ref; if (is_document(method_style)) fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name)); else fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); } fprintf(fd, " </output>\n"); } if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " <fault name=\"%s\">\n <SOAP:fault name=\"%s\" use=\"literal\"/>\n </fault>\n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " </operation>\n"); fflush(fd); } } fprintf(fd, "</binding>\n\n"); } } } fprintf(fd, "<service name=\"%s\">\n", name); if (sp && sp->documentation) fprintf(fd, " <documentation>%s</documentation>\n", sp->documentation); else fprintf(fd, " <documentation>gSOAP "VERSION" generated service definition</documentation>\n"); if (executable) fprintf(fd, " <port name=\"%s\" binding=\"tns:%s\">\n <SOAP:address location=\"%s/%s\"/>\n </port>", portname, binding, URL, executable); for (prot = 0x1; prot <= 0x8; prot <<= 1) { if ((prot & mask)) { const char *s, *t, *v = "", *b = ""; switch (prot) { case 0x1: v = ""; b = "SOAP"; break; case 0x2: v = "GET"; b = "HTTP"; break; case 0x4: v = "PUT"; b = "HTTP"; break; case 0x8: v = "POST"; b = "HTTP"; break; } fprintf(fd, " <port name=\"%s%s\" binding=\"tns:%s%s\">\n", portname, v, binding, v); for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); } fprintf(fd, " </port>\n"); } } fprintf(fd, "</service>\n\n</definitions>\n"); } char * default_value(Entry *e, const char *a) { Entry *q; static char buf[1024]; buf[0] = '\0'; if (e->info.hasval) switch (e->info.typ->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, " %s=\"%g\"", a, e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: for (q = ((Table*)e->info.typ->ref)->list; q; q = q->next) if (q->info.val.i == e->info.val.i) { sprintf(buf, " %s=\"%s\"", a, ns_convert(q->sym->name)); break; } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); break; } return buf; } const char * nillable(Tnode *typ) { if (typ->type == Tpointer) return "true"; return "false"; } void gen_schema(FILE *fd, Table *t, char *ns1, char *ns, int all, int wsdl, char *URL, char *URI, char *style, char *encoding) { int i, d; char cbuf[4]; Entry *p, *q, *r; Tnode *n; Symbol *s; Service *sp, *sp2; Method *m; int flag; if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) return; for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns) && sp->URI) break; if (sp && sp->import) return; fprintf(fd, " <schema "); if (sp) fprintf(fd, "targetNamespace=\"%s\"", sp->URI); else fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); else if (!strcmp(s->name, "SOAP-ENC")) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); if (sp && (sp->elementForm || sp->attributeForm)) fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else if (style && !strcmp(style, "document")) fprintf(fd, " elementFormDefault=\"qualified\"\n attributeFormDefault=\"unqualified\">\n"); else fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); fflush(fd); flag = 0; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) { fprintf(fd, " <import namespace=\"%s\"", sp2->URI); if (sp2->import) fprintf(fd, " schemaLocation=\"%s\"", sp2->import); fprintf(fd, "/>\n"); if (!strcmp(sp2->URI, encURI)) flag = 1; } } if (!flag) fprintf(fd, " <import namespace=\"%s\"/>", encURI); fprintf(fd, "\n"); fflush(fd); if (typetable) { for (p = typetable->list; p; p = p->next) { if (p->info.typ->type != Ttemplate && !is_transient(p->info.typ) && !is_invisible(p->sym->name) && (!is_external(p->info.typ) || is_volatile(p->info.typ)) && ((has_ns_eq(ns, p->sym->name)))) { /* typedefs that are used for SOAP Fault details */ m = NULL; if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) { for (sp2 = services; sp2 && !m; sp2 = sp2->next) { for (m = sp2->list; m; m = m->next) { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; } } } if (m) { if (!uflag) fprintf(fd, " <!-- fault element -->\n"); fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " </element>\n"); continue; } if (is_primitive_or_string(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <restriction base=\"%s\">\n", base_type(p->info.typ, ns1)); if (p->info.typ->pattern) fprintf(fd, " <pattern value=\"%s\"/>\n", p->info.typ->pattern); if (is_primitive(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive((Tnode*)p->info.typ->ref) && !is_string(p->info.typ) && !is_wstring(p->info.typ))) { if (p->info.typ->minLength != MINLONG64) fprintf(fd, " <minInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); if (p->info.typ->maxLength != MAXLONG64) fprintf(fd, " <maxInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); } else { if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength) fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); else { if (p->info.typ->minLength > 0) fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); if (p->info.typ->maxLength != MAXLONG64) fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); } } fprintf(fd, " </restriction>\n </simpleType>\n"); } else { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <complexContent>\n <restriction base=\"%s\">\n", base_type(p->info.typ, ns1)); fprintf(fd, " </restriction>\n </complexContent>\n </complexType>\n"); } } } } fflush(fd); if (enumtable) { for (p = enumtable->list; p; p = p->next) { if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (is_mask(p->info.typ)) { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL)); gen_type_documentation(fd, p, ns); fprintf(fd, " <list>\n"); q = p; if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name))) break; } if (q) fprintf(fd, " <restriction base=\"xsd:string\">\n"); else fprintf(fd, " <restriction base=\"xsd:QName\">\n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </enumeration>"); if (!uflag) fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i); fprintf(fd, "\n"); } } fprintf(fd, " </restriction>\n </list>\n </simpleType>\n"); } else { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL)); gen_type_documentation(fd, p, ns); q = p; if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name))) break; } if (q) fprintf(fd, " <restriction base=\"xsd:string\">\n"); else fprintf(fd, " <restriction base=\"xsd:QName\">\n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name)); if (gen_member_documentation(fd, p->sym, q, ns)) fprintf(fd, " </enumeration>"); if (!uflag) fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i); fprintf(fd, "\n"); } } fprintf(fd, " </restriction>\n </simpleType>\n"); } } } } fflush(fd); if (classtable) { for (p = classtable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) continue; for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) break; /* omit the auto-generated and user-defined response struct/class (when necessary) */ if (!q) for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) { r = entry(t, q->sym); if (r && r->info.typ->ref && is_response(((Entry*)r->info.typ->ref)->info.typ) && p->info.typ == (Tnode*)((Entry*)r->info.typ->ref)->info.typ->ref) break; } if (q) continue; /* classes that are used for SOAP Fault details */ m = NULL; for (sp2 = services; sp2 && !m; sp2 = sp2->next) for (m = sp2->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (m) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (!uflag) fprintf(fd, " <!-- fault element and type -->\n"); fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " </element>\n"); } } if (p->info.typ->ref && is_binary(p->info.typ)) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (is_attachment(p->info.typ)) { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <simpleContent>\n <extension base=\"xsd:base64Binary\">\n"); if (!eflag) fprintf(fd, " <attribute name=\"href\" type=\"xsd:anyURI\" use=\"optional\"/>\n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); } else { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <restriction base=\"xsd:base64Binary\">\n"); if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength) fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); else { if (p->info.typ->minLength > 0) fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); if (p->info.typ->maxLength != MAXLONG64) fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); } fprintf(fd, " </restriction>\n </simpleType>\n"); } } } else if (p->info.typ->ref && !is_transient(p->info.typ) && is_primclass(p->info.typ)) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { q = ((Table*)p->info.typ->ref)->list; if (q && strncmp(q->sym->name, "xsd__anyType", 12)) { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) { fprintf(fd, " <complexType name=\"%s\" mixed=\"true\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); } else if (is_primitive(q->info.typ)) { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); } else { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </extension>\n </complexContent>\n </complexType>\n"); } } } } else if (p->info.typ->ref && !is_transient(p->info.typ)) { q = ((Table*)p->info.typ->ref)->list; if (entry(t, p->sym) && (!q || !is_XML(q->info.typ))) ; else if (is_dynamic_array(p->info.typ)) { if (eflag || (!has_ns(p->info.typ) && !is_untyped(p->info.typ))) { if (all) { d = get_Darraydims(p->info.typ)-1; for (i = 0; i < d; i++) cbuf[i] = ','; cbuf[i] = '\0'; if (q->info.maxOccurs == 1) fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"%s\"/>\n </sequence>\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[%s]\"/>\n </restriction>\n </complexContent>\n </complexType>\n", wsdl_type(p->info.typ, NULL), q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref), wsdl_type(q->info.typ, ns1), cbuf); else fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"%s\"/>\n </sequence>\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[%s]\"/>\n </restriction>\n </complexContent>\n </complexType>\n", wsdl_type(p->info.typ, NULL), q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref), wsdl_type(q->info.typ, ns1), cbuf); } } else if (p->info.typ->ref && ((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) { if (q->info.maxOccurs == 1) { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\"/>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </complexType>\n"); } else { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"%s\"/>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </complexType>\n"); } } else { if (q->info.maxOccurs == 1) { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"%s\"/>\n </sequence>\n </complexType>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref)); } else { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"%s\"/>\n </sequence>\n </complexType>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); } } } else if (is_discriminant(p->info.typ) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " <complexType name=\"%s\">\n", ns_remove(p->sym->name)); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " </complexType>\n"); } } else if (p->info.typ->type == Tstruct && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <sequence>\n"); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " </sequence>\n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </complexType>\n"); } } else if (p->info.typ->type == Tclass && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { if (((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </complexType>\n"); } else { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " <sequence>\n"); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " </sequence>\n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " </complexType>\n"); } } } } } } fflush(fd); for (n = Tptr[Tarray]; n; n = n->next) { if (is_transient(n) || is_fixedstring(n)) continue; if (1 /* wsdl */) fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[]\"/>\n </restriction>\n </complexContent>\n </complexType>\n", c_ident(n), wsdl_type((Tnode*)n->ref, ns1)); else fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <element name=\"item\" type=\"%s\" maxOccurs=\"unbounded\"/>\n </restriction>\n </complexContent>\n </complexType>\n", c_ident(n), xsi_type((Tnode*)n->ref)); fflush(fd); } gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); fprintf(fd, " </schema>\n\n"); } void gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1) { Entry *q; for (q = ((Table*)p->ref)->list; q; q = q->next) if (gen_schema_element(fd, p, q, ns, ns1)) q = q->next; } int gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1) { char *s, *t; if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) return 0; if (is_repetition(q)) { if (is_sequence(q->next)) { fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n"); if (q->next->info.typ->ref) gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, ns, ns1); fprintf(fd, " </sequence>\n"); return 1; } t = ns_convert(q->next->sym->name); if (*t == '-') fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->next->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) if (q->info.maxOccurs == 1) fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); else fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); else if (q->info.maxOccurs == 1) fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); else fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </element>\n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); else if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </element>\n"); } return 1; } else if (q->info.typ->type == Ttemplate || (q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Treference && ((Tnode*)q->info.typ->ref)->type == Ttemplate)) { t = ns_convert(q->sym->name); if (*t == '-') fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (((Tnode*)q->info.typ->ref)->type == Tpointer) if (q->info.maxOccurs == 1) fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); else fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); else if (q->info.maxOccurs == 1) fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); else fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </element>\n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->info.typ->ref)->type == Tpointer) if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); else if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </element>\n"); } } else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ { fprintf(fd, " <element name=\"%s\" type=\"xsd:anyType\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"/>\n", ns_convert(q->next->sym->name), q->info.minOccurs, q->info.maxOccurs); return 1; } else if (is_choice(q)) { if (q->info.minOccurs == 0) fprintf(fd, " <choice minOccurs=\"0\" maxOccurs=\"1\">\n"); else fprintf(fd, " <choice>\n"); if (q->next->info.typ->ref) gen_schema_elements(fd, q->next->info.typ, ns, ns1); fprintf(fd, " </choice>\n"); return 1; } else if (is_sequence(q)) { if (q->info.minOccurs == 0) fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"1\">\n"); else fprintf(fd, " <sequence>\n"); if (q->info.typ->type == Tpointer) gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); else if (q->info.typ->ref) gen_schema_elements(fd, q->info.typ, ns, ns1); fprintf(fd, " </sequence>\n"); return 0; } else { t = ns_convert(q->sym->name); if (*t == '-') fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"1\"/><!-- %s -->\n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); else fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </element>\n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"%s%s", s, wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q, "default"), form); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"%s%s", s, wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q, "default"), form); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </element>\n"); } } fflush(fd); return 0; } void gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *style, char *encoding) { Entry *p, *q, *e; Table *r; Service *sp; Method *m; char *method_style, *method_encoding, *method_response_encoding; int all = !strcmp(ns, ns1); r = mktable(NULL); for (p = classtable->list; p; p = p->next) { if (!p->info.typ->ref || /* is_invisible(p->info.typ->id->name) || */ is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && (!strchr(q->sym->name+1, ':') || !eq_ns(p->sym->name, q->sym->name)) && has_ns_eq(ns, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun) { Service *sp2; Method *m; m = NULL; for (sp2 = services; sp2 && !m; sp2 = sp2->next) for (m = sp2->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) break; if (m) continue; /* already generated element for fault */ e = entry(r, q->sym); if (e) { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute) || reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Field '%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for elements '<%s>' in the WSDL namespace based on literal encoding: use SOAP RPC encoding or rename or use a namespace qualifier", q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { if (q->info.sto & Sattribute) fprintf(fd, " <attribute name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); else fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(r, q->sym); e->info = q->info; } } } } if (t && all) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !is_invisible(p->sym->name) && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { method_encoding = encoding; method_response_encoding = NULL; method_style = style; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } } if (!eflag) { if (!method_response_encoding) method_response_encoding = method_encoding; q = entry(classtable, p->sym); if (q) { if (is_document(method_style)) { if (!uflag) fprintf(fd, " <!-- operation request element -->\n"); fprintf(fd, " <element name=\"%s\">\n <complexType>\n <sequence>\n", ns_remove(p->sym->name)); gen_schema_elements(fd, q->info.typ, ns, ns1); fprintf(fd, " </sequence>\n"); gen_schema_attributes(fd, q->info.typ, ns, ns1); fprintf(fd, " </complexType>\n </element>\n"); } else if (is_literal(method_encoding)) { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && !has_ns_eq(NULL, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun && !(q->info.sto & Sattribute)) { e = entry(r, q->sym); if (e) { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Parameter '%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for elements '<%s>' in the WSDL namespace based on literal encoding: use SOAP RPC encoding or rename or use a namespace qualifier", q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { if (!uflag) fprintf(fd, " <!-- operation request element -->\n"); fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(r, q->sym); e->info = q->info; } } } } q = (Entry*)p->info.typ->ref; for (e = t->list; e; e = e->next) if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) q = NULL; if (q && !is_transient(q->info.typ)) { if (!is_response(q->info.typ)) { if (is_document(method_style)) { if (!uflag) fprintf(fd, " <!-- operation response element -->\n"); fprintf(fd, " <element name=\"%sResponse\">\n <complexType>\n", ns_remove(p->sym->name)); fprintf(fd, " <sequence>\n"); gen_schema_element(fd, p->info.typ, q, ns, ns1); fprintf(fd, " </sequence>\n"); fprintf(fd, " </complexType>\n </element>\n"); } else if (is_literal(method_response_encoding)) { e = entry(r, q->sym); if (e) { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Qualified member field '%s' has a type that does not correspond to the unique type '%s' defined for elements '<%s>'", q->sym->name, c_type(q->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { if (!uflag) fprintf(fd, " <!-- operation response element -->\n"); fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(r, q->sym); e->info = q->info; } } } else if (((Tnode*)q->info.typ->ref)->ref) { if (is_document(method_style)) { if (!has_ns_eq(NULL, q->sym->name)) { e = entry(r, ((Tnode*)q->info.typ->ref)->id); if (!e) { if (!uflag) fprintf(fd, " <!-- operation response element -->\n"); fprintf(fd, " <element name=\"%s\">\n <complexType>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); fprintf(fd, " <sequence>\n"); gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); fprintf(fd, " </sequence>\n"); gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, ns, ns1); fprintf(fd, " </complexType>\n </element>\n"); e = enter(r, ((Tnode*)q->info.typ->ref)->id); e->info = q->info; } } } else if (is_literal(method_response_encoding)) { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && !has_ns_eq(NULL, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun && !(q->info.sto & Sattribute)) { e = entry(r, q->sym); if (e) { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Qualified member field '%s' has a type that does not correspond to the unique type '%s' defined for elements '<%s>'", q->sym->name, c_type(q->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { if (!uflag) fprintf(fd, " <!-- operation response element -->\n"); fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(r, q->sym); e->info = q->info; } } } } } } } } } } } if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && !eflag) { q = (Entry*)p->info.typ->ref; if (q && !is_transient(q->info.typ)) { if (is_response(q->info.typ)) { if (has_ns_eq(ns, q->sym->name)) { e = entry(r, q->sym); if (!e) { if (!uflag) fprintf(fd, " <!-- operation response element -->\n"); fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(r, q->sym); e->info = q->info; } } } } } } } freetable(r); } void gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1) { Entry *q; char *t, *s, *r; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.sto & Sattribute) { r = default_value(q, "default"); t = ns_convert(q->sym->name); if (*t == '-' || is_anyAttribute(q->info.typ)) fprintf(fd, " <anyAttribute processContents=\"lax\"/><!-- %s -->\n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (r && *r) fprintf(fd, " <attribute ref=\"%s\" use=\"default\"%s/>\n", t, r); else if (q->info.typ->type != Tpointer || q->info.minOccurs) fprintf(fd, " <attribute ref=\"%s\" use=\"required\"/>\n", t); else if (q->info.maxOccurs == 0) fprintf(fd, " <attribute ref=\"%s\" use=\"prohibited\"/>\n", t); else fprintf(fd, " <attribute ref=\"%s\" use=\"optional\"/>\n", t); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (r && *r) fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"default\"%s%s", s, wsdl_type(q->info.typ, ns1), r, form); else if ((q->info.typ->type != Tpointer && !is_stdstring(q->info.typ) && !is_stdwstring(q->info.typ)) || q->info.minOccurs) fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"required\"%s", s, wsdl_type(q->info.typ, ns1), form); else if (q->info.maxOccurs == 0) fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"prohibited\"", s, wsdl_type(q->info.typ, ns1)); else fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"optional\"%s", s, wsdl_type(q->info.typ, ns1), form); if (gen_member_documentation(fd, p->id, q, ns)) fprintf(fd, " </attribute>\n"); } fflush(fd); } } } void gen_type_documentation(FILE *fd, Entry *type, char *ns) { Service *sp; Data *d; if (!type->sym) { fprintf(fd, "\n"); return; } for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (!strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { fprintf(fd, "\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text); return; } } } } if (!uflag) fprintf(fd, "<!-- %s -->\n", type->sym->name); fprintf(fd, "\n"); } int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns) { Service *sp; Data *d; char *t; if (!type || !member->sym) { fprintf(fd, "/>\n"); return 0; } t = ns_remove(type->name); for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s-d->name) && !strcmp(s + 2, member->sym->name)) { fprintf(fd, ">\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text); return 1; } } } } fprintf(fd, "/>"); if (!uflag) fprintf(fd, "<!-- %s::%s -->", type->name, member->sym->name); fprintf(fd, "\n"); return 0; } void gen_nsmap(FILE *fd, Symbol *ns, char *URI) { Symbol *ns1; Service *sp; fprintf(fd, "{\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns1->name) && sp->URI) break; if (sp) { if (!strcmp(ns1->name, "SOAP-ENV")) { if (vflag < 0) fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); else fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (vflag < 0) fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); else fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); } else if (sp->URI2) fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2); else fprintf(fd, "\t{\"%s\", \"%s\", NULL, NULL},\n", ns_convert(ns1->name), sp->URI); } else if (!strcmp(ns1->name, "SOAP-ENV")) { if (vflag < 0) fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); else if (is_soap12(NULL)) fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL},\n", envURI); else fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL},\n", envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (vflag < 0) fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); else if (is_soap12(NULL)) fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL},\n", encURI); else fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL},\n", encURI); } else if (!strcmp(ns1->name, "xsi")) fprintf(fd, "\t{\"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n", xsiURI); else if (!strcmp(ns1->name, "xsd")) fprintf(fd, "\t{\"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL},\n", xsdURI); else fprintf(fd, "\t{\"%s\", \"%s/%s.xsd\", NULL, NULL},\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); } fprintf(fd, "\t{NULL, NULL, NULL, NULL}\n};\n"); } void gen_proxy(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { Entry *p, *q, *r; Table *t, *output; Service *sp; int flag; char *name1; name1 = ns_cname(name, NULL); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns->name)) break; fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); if (nflag) fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); if (namespaceid) fprintf(fd,"\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %s\n{ public:\n\t/// Runtime engine context allocated in constructor\n\tstruct soap *soap;\n\t/// Endpoint URL of service '%s' (change as needed)\n\tconst char *endpoint;\n\t/// Constructor allocates soap engine context, sets default endpoint URL, and sets namespace mapping table\n", name1, name); if (nflag) fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; endpoint = \"%s\"; };\n", name1, prefix, URL); else { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); endpoint = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = \n", name1, URL); gen_nsmap(fd, ns, URI); fprintf(fd, "\tsoap->namespaces = namespaces; } };\n"); } fprintf(fd, "\t/// Destructor frees deserialized data and soap engine context\n\tvirtual ~%s() { if (soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } };\n", name1); fflush(fd); for (r = table->list; r; r = r->next) if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) { p = entry(table, r->sym); if (p) q = (Entry*)p->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } p = entry(classtable, r->sym); if (!p) { fprintf(stderr, "Internal error: no parameter table entry\n"); return; } output = (Table*)p->info.typ->ref; /* if ((s = strstr(r->sym->name, "__"))) s += 2; else s = r->sym->name; fprintf(fd, "\tvirtual int %s(", s); */ fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); flag = 0; for (t = output; t; t = t->prev) { p = t->list; if (p) { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); for (p = p->next; p; p = p->next) fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); flag = 1; } } if (is_transient(q->info.typ)) fprintf(fd,") { return soap ? soap_send_%s(soap, endpoint, NULL", ident(r->sym->name)); else if (flag) fprintf(fd,", %s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); else fprintf(fd,"%s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); /* the action is now handled by the soap_call/soap_send operation when we pass NULL */ #if 0 m = NULL; if (sp && (s = strstr(r->sym->name, "__"))) for (m = sp->list; m; m = m->next) if (m->part && m->mess == ACTION && !strcmp(m->name, s+2)) { if (*m->part == '"') fprintf(fd, "%s", m->part); else fprintf(fd, "\"%s\"", m->part); break; } if (!m) fprintf(fd, "NULL"); #endif for (t = output; t; t = t->prev) for (p = t->list; p; p = p->next) fprintf(fd, ", %s", ident(p->sym->name)); if (is_transient(q->info.typ)) fprintf(fd,") : SOAP_EOM; };\n"); else fprintf(fd,", %s) : SOAP_EOM; };\n", ident(q->sym->name)); fflush(fd); } fprintf(fd, "};"); if (namespaceid) fprintf(fd,"\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_object(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { char *name1; Entry *method; name1 = ns_cname(name, NULL); fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); banner(fd, "Service Object"); if (namespaceid) fprintf(fd,"\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] =\n", name1); gen_nsmap(fd, ns, URI); fprintf(fd, "\n\tthis->namespaces = namespaces; };"); fprintf(fd, "\n\tvirtual ~%sService() { };", name1); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); if (nflag) fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); else fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); fprintf(fd, "\n};"); banner(fd, "Service Operations (you should define these globally)"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p, *q=entry(table, method->sym); Table *output; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); output = (Table*)q->info.typ->ref; fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); gen_params(fd, output, p, 1); fprintf(fd, ";"); } } if (namespaceid) fprintf(fd,"\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n\n#endif\n"); } void gen_proxy_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { Entry *p, *method; Table *t; fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); if (namespaceid) fprintf(fd,"\n\nnamespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\nclass SOAP_CMAC %s : public soap\n{ public:", name); else fprintf(fd, "\n\nclass SOAP_CMAC %s\n{ public:", name); if (!iflag) fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;"); fprintf(fd, "\n\t/// Endpoint URL of service '%s' (change as needed)", name); fprintf(fd, "\n\tconst char *soap_endpoint;"); fprintf(fd, "\n\t/// Constructor"); fprintf(fd, "\n\t%s();", name); if (iflag) { fprintf(fd, "\n\t/// Construct from another engine state"); fprintf(fd, "\n\t%s(const struct soap&);", name); } else { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); fprintf(fd, "\n\t%s(struct soap*);", name); } fprintf(fd, "\n\t/// Constructor with endpoint URL"); fprintf(fd, "\n\t%s(const char *url);", name); fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); fprintf(fd, "\n\t%s(soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with URL and input+output mode control"); fprintf(fd, "\n\t%s(const char *url, soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Destructor frees deserialized data"); fprintf(fd, "\n\tvirtual\t~%s();", name); fprintf(fd, "\n\t/// Initializer used by constructors"); fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); fprintf(fd, "\n\tvirtual\tvoid destroy();"); fprintf(fd, "\n\t/// Delete all deserialized data and reset to default"); fprintf(fd, "\n\tvirtual\tvoid reset();"); fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\t/// Put SOAP Header in message"); fprintf(fd, "\n\tvirtual\tvoid soap_header("); gen_params(fd, t, NULL, 0); fprintf(fd, ";"); } } } fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n\t/// Get SOAP Fault structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Fault *soap_fault();"); fprintf(fd, "\n\t/// Get SOAP Fault string (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst char *soap_fault_string();"); fprintf(fd, "\n\t/// Get SOAP Fault detail as string (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst char *soap_fault_detail();"); fprintf(fd, "\n\t/// Close connection (normally automatic, except for send_X ops)"); fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); fprintf(fd, "\n\t/// Print fault"); fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); fprintf(fd, "\n#ifndef WITH_COMPAT"); fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); fprintf(fd, "\n#endif\n"); fprintf(fd, "\n\t/// Put fault into buffer"); fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, table, method, 0); fprintf(fd, "\n};"); if (namespaceid) fprintf(fd,"\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_proxy_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { Entry *p, *method, *param; Table *t; char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd,"\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(const char *url)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode)\n{\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{ }", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tsoap_endpoint = NULL;\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); gen_nsmap(fd, ns, URI); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tdestroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params(fd, t, NULL, 0); fprintf(fd, "\n{\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\nconst SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn *soap_faultstring(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn *soap_faultdetail(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_call_method(fd, table, method, name); if (namespaceid) fprintf(fd,"\n\n} // namespace %s\n", namespaceid); fprintf(fd,"\n/* End of client proxy code */\n"); } void gen_object_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { Entry *p, *method; Table *t; fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); if (namespaceid) fprintf(fd,"\n\nnamespace %s {", namespaceid); if (iflag) fprintf(fd, "\nclass SOAP_CMAC %s : public soap\n{ public:", name); else { fprintf(fd, "\nclass SOAP_CMAC %s\n{ public:", name); fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;"); } fprintf(fd, "\n\t/// Constructor"); fprintf(fd, "\n\t%s();", name); if (iflag) { fprintf(fd, "\n\t/// Construct from another engine state"); fprintf(fd, "\n\t%s(const struct soap&);", name); } else { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); fprintf(fd, "\n\t%s(struct soap*);", name); } fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); fprintf(fd, "\n\t%s(soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Destructor, also frees all deserialized data"); fprintf(fd, "\n\tvirtual ~%s();", name); fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); fprintf(fd, "\n\tvirtual\tvoid destroy();"); fprintf(fd, "\n\t/// Delete all deserialized data and reset to defaults"); fprintf(fd, "\n\tvirtual\tvoid reset();"); fprintf(fd, "\n\t/// Initializer used by constructor"); fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Create a copy"); fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); fprintf(fd, "\n\t/// Close connection (normally automatic)"); fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); fprintf(fd, "\n\t/// Return sender-related fault to sender"); fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return sender-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return receiver-related fault to sender"); fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return receiver-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Print fault"); fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); fprintf(fd, "\n#ifndef WITH_COMPAT"); fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Put fault into buffer"); fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\t/// Put SOAP Header in message"); fprintf(fd, "\n\tvirtual\tvoid soap_header("); gen_params(fd, t, NULL, 0); fprintf(fd, ";"); } } } fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n\t/// Run simple single-thread iterative service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun"); fprintf(fd, "\n\tvirtual\tint run(int port);"); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog);"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept();"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept();"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); fprintf(fd, "\n\tvirtual\tint serve();"); fprintf(fd, "\n\t/// Used by serve() to dispatch a request (returns error code or SOAP_OK)"); fprintf(fd, "\n\tvirtual\tint dispatch();"); fprintf(fd, "\n\n\t///\n\t/// Service operations (you should define these):\n\t/// Note: compile with -DWITH_PURE_VIRTUAL for pure virtual methods\n\t///"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, table, method, 1); fprintf(fd, "\n};"); if (namespaceid) fprintf(fd,"\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_method(FILE *fd, Table *table, Entry *method, int server) { Table *params; Entry *result, *p; char *soap; if (iflag) soap = "this"; else soap = "this->soap"; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (server || !is_transient(result->info.typ)) { if (is_transient(result->info.typ)) fprintf(fd, "\n\n\t/// Web service one-way operation '%s' (return error code, SOAP_OK (no response), or send_%s_empty_response())", ns_remove(method->sym->name), ns_remove(method->sym->name)); else fprintf(fd, "\n\n\t/// Web service operation '%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); if (!server) { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); } if (server) fprintf(fd, " SOAP_PURE_VIRTUAL;"); else fprintf(fd, ";"); if (is_transient(result->info.typ)) fprintf(fd, "\n\tvirtual\tint send_%s_empty_response(int httpcode) { return soap_send_empty_response(%s, httpcode); }", ns_cname(method->sym->name, NULL), soap); } else { fprintf(fd, "\n\n\t/// Web service one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint send_%s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint send_%s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); fprintf(fd, ";\n\t/// Web service one-way receive operation 'recv_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, ";\n\tvirtual\tint recv_%s(", ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s&);", ident(method->sym->name)); fprintf(fd, "\n\t/// Web service receive of HTTP Accept acknowledgment for one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); fprintf(fd, "\n\t/// Web service one-way synchronous send operation '%s' with HTTP Accept/OK response receive (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); fprintf(fd, " { if (this->send_%s(endpoint, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, " || soap_recv_empty_response(%s)) return %s->error; return SOAP_OK; }", soap, soap); } } void gen_params(FILE *fd, Table *params, Entry *result, int flag) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s%s", flag || param != params->list ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", flag || params->list ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_args(FILE *fd, Table *params, Entry *result, int flag) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s", flag || param != params->list ? ", " : "", param->sym->name); if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s)", flag || params->list ? ", " : "", result->sym->name); } void gen_query_url(FILE *fd, Table *params) { Entry *param; int flag = 0; fprintf(fd, "\n\tif (\n#ifdef HAVE_SNPRINTF\n\tsoap_snprintf(soap->msgbuf, sizeof(soap->msgbuf),\n#else\n\tsprintf(soap->msgbuf,\n#endif\n\t\t\"%%s?"); for (param = params->list; param; param = param->next) if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) fprintf(fd, "%s%s=%s", flag++ ? "&" : "", ns_remove(param->sym->name), gen_format(fd, param->info.typ)); fprintf(fd, "\", soap_endpoint"); for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) { if (is_stdstring(param->info.typ)) fprintf(fd, ", soap_encode_url_string(soap, %s.c_str())", ident(param->sym->name)); else if (is_string(param->info.typ)) fprintf(fd, ", soap_encode_url_string(soap, %s)", ident(param->sym->name)); else if (is_primitive(param->info.typ)) fprintf(fd, ", %s", ident(param->sym->name)); } } fprintf(fd, ") < 0)\n\t{\tsoap->error = SOAP_EOM;\n\t\treturn soap_closesock(soap);\n\t}"); } void gen_query_form(FILE *fd, Table *params) { Entry *param; int flag = 0; fprintf(fd, "\n\tif ("); for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) { fprintf(fd, "soap_send(soap, \"%s%s=\")", flag++ ? "&" : "", ns_remove(param->sym->name)); if (is_stdstring(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s.c_str()))\n\t || ", ident(param->sym->name)); else if (is_string(param->info.typ)) fprintf(fd, " || soap_send(soap_encode_url_string(soap, %s))\n\t || ", ident(param->sym->name)); else if (is_primitive(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_%s2s(soap, %s))\n\t || ", c_ident(param->info.typ), ident(param->sym->name)); } } } const char* gen_format(FILE *fd, Tnode *typ) { if (is_string(typ) || is_stdstring(typ)) return "%s"; switch (typ->type) { case Tchar: return "%hhd"; case Tshort: return "%hd"; case Tint: return "%d"; case Tlong: return "%ld"; case Tllong: return SOAP_LONG_FORMAT; case Tfloat: return "%.9G"; case Tdouble: return "%.17lG"; case Tuchar: return "%hhu"; case Tushort: return "%hu"; case Tuint: return "%u"; case Tulong: return "%lu"; case Tullong: return SOAP_ULONG_FORMAT; default: return ""; } } void gen_call_method(FILE *fd, Table *table, Entry *method, char *name) { Service *sp; Method *m; int soap = (vflag >= 0); int version = vflag; int get = 0; int put = 0; int post = 0; int mime = 0; const char *style, *encoding; const char *xtag, *xtyp; const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Table *params; Entry *param, *result, *p, *response = NULL; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(method->info.typ); if (name) { if (!is_transient(result->info.typ)) fprintf(fd, "\n\nint %s::%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\nint %s::send_%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); } else if (!is_transient(result->info.typ)) { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fheader, params, result, 1); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fd, params, result, 1); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fheader, params, result, 1); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fd, params, result, 1); } if (name) { if (iflag) fprintf(fd, "\n{\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); } else { fprintf(fheader, ";"); fprintf(fd, "\n{"); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "POST")) post = 1; else if (strstr(sp->protocol, "PUT")) put = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "POST")) post = 1; else if (strstr(m->part, "PUT")) put = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) mime = 1; } } break; } } if (!get && !mime) fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); if (response) fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); if (name) fprintf(fd, "\n\tif (endpoint)\n\t\tsoap_endpoint = endpoint;"); if (sp && sp->URL) fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); if (action) { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); if (*action == '"') fprintf(fd, "%s;", action); else fprintf(fd, "\"%s\";", action); } if (!method_response_encoding) method_response_encoding = method_encoding; if (!get && !mime) { fprintf(fd, "\n\tsoap_begin(soap);"); if (soap && sp && sp->URI && method_encoding) { if (is_literal(method_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); else if (method_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_encoding); } else if (!soap || !eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); for (param = params->list; param; param = param->next) { if (param->info.typ->type == Tarray) fprintf(fd, "\n\tmemcpy(soap_tmp_%s.%s, %s, sizeof(%s));", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name), c_type(param->info.typ)); else fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); } if (!soap) fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); else if (version) fprintf(fd, "\n\tsoap_set_version(soap, %d); /* SOAP1.%d */", version, version); if (soap) fprintf(fd, "\n\tsoap_serializeheader(soap);"); fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t}"); fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); if (soap) fprintf(fd, "\n\tif (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)"); else { fprintf(fd, "\n\tsoap->http_content = \"text/xml\";"); if (put) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action)"); else fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action)"); } fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (get) { if (params->list) { gen_query_url(fd, params); fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap->msgbuf, soap_action))"); } else if (soap) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, NULL), soap_action))"); else fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, soap_action), soap_action))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (mime) { fprintf(fd, "\n\tsoap->http_content = \"application/x-www-form-urlencoded\";"); if (post) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action))"); else if (put) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_form(fd, params); fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); } if (is_transient(result->info.typ)) { fprintf(fd, "\n\treturn SOAP_OK;\n}"); if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); if (iflag) fprintf(fd, "\n{\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fheader, "struct %s *%s);\n", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); } fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "\n\tsoap_begin(soap);"); } else if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\t%s.soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t%s->soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, &%s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); else if (!is_void(result->info.typ)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, %s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); fprintf(fd,"\n\tif (soap_begin_recv(soap)"); fprintf(fd,"\n\t || soap_envelope_begin_in(soap)"); fprintf(fd,"\n\t || soap_recv_header(soap)"); fprintf(fd,"\n\t || soap_body_begin_in(soap))"); fprintf(fd,"\n\t\treturn soap_closesock(soap);"); if (is_transient(result->info.typ)) { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); fprintf(fd,"\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); fprintf(fd,"\n\tif (soap->error"); fprintf(fd,"\n\t || soap_body_end_in(soap)"); fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); fprintf(fd,"\n\t || soap_end_recv(soap))"); fprintf(fd,"\n\t\treturn soap_closesock(soap);"); fprintf(fd,"\n\treturn soap_closesock(soap);\n}"); fflush(fd); return; } /* With RPC encoded responses, try to parse the fault first */ if (!is_literal(method_response_encoding)) { fprintf(fd,"\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); xtag = xtyp = ""; } else if (has_ns_eq(NULL, result->sym->name)) { if (response) xtag = xml_tag(response->info.typ); else xtag = ns_convert(result->sym->name); xtyp = xsi_type(result->info.typ); } else { if (response) xtag = xml_tag(response->info.typ); else xtag = xml_tag(result->info.typ); xtyp = ""; } if (response) { fprintf(fd,"\n\tsoap_tmp_%s = soap_get_%s(soap, NULL, \"%s\", \"%s\");", c_ident(response->info.typ), c_ident(response->info.typ), xtag, xtyp); fprintf(fd,"\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); } else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty(result->info.typ->ref)) { if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd,"\n\t%s.soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp); else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd,"\n\t%s->soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp); else if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp); } else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, %s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, &%s);", ident(result->sym->name)); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, %s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, &%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference) { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp); } else { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp); } fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); } fflush(fd); fprintf(fd,"\n\tif (soap_body_end_in(soap)"); fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); fprintf(fd,"\n\t || soap_end_recv(soap))"); fprintf(fd,"\n\t\treturn soap_closesock(soap);"); if (response) { if (result->info.typ->type == Tarray) fprintf(fd,"\n\tmemcpy(%s, soap_tmp_%s->%s, sizeof(%s));", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference) fprintf(fd,"\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); else if (!is_external((Tnode*)result->info.typ->ref)) { fprintf(fd,"\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); fprintf(fd,"\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); } } fprintf(fd,"\n\treturn soap_closesock(soap);"); fprintf(fd ,"\n}"); fflush(fd); } void gen_serve_method(FILE *fd, Table *table, Entry *param, char *name) { Service *sp = NULL; char *style, *encoding; Entry *result, *p, *q, *pin, *pout, *response = NULL; Table *input; char *xtag; Method *m; char *method_encoding = NULL, *method_response_encoding = NULL; result = (Entry*)param->info.typ->ref; p = entry(classtable, param->sym); if (!p) execerror("no table entry"); if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(param->info.typ); q = entry(table, param->sym); if (!q) execerror("no table entry"); pout = (Entry*)q->info.typ->ref; if (name) { if (iflag) fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); else fprintf(fd, "\n\nstatic int serve_%s(%s *service)\n{\tstruct soap *soap = service->soap;\n", ident(param->sym->name), name); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); } fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); for (sp = services; sp; sp = sp->next) if (has_ns_eq(sp->ns, param->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, param->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; } } break; } if (!method_response_encoding) method_response_encoding = method_encoding; fflush(fd); if (!is_transient(pout->info.typ)) { if (pout->info.typ->type == Tarray && response) { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_external((Tnode*)pout->info.typ->ref) && !is_volatile((Tnode*)pout->info.typ->ref) && !is_typedef((Tnode*)pout->info.typ->ref)) fprintf(fd,"\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd,"\n\tsoap_tmp_%s.%s = &soap_tmp_%s;", c_ident(response->info.typ), ident(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); } else if (response) { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd,"\n\t%s.soap_default(soap);", ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); } else { fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); } } fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); fflush(fd); q = entry(classtable, param->sym); if (!is_invisible_empty(q->info.typ)) { fprintf(fd,"\n\tif (!soap_get_%s(soap, &soap_tmp_%s, \"%s\", NULL))", ident(param->sym->name), ident(param->sym->name), ns_convert(param->sym->name)); fprintf(fd,"\n\t\treturn soap->error;"); } fprintf(fd,"\n\tif (soap_body_end_in(soap)"); fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); fprintf(fd,"\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); if (name) { if (iflag) fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); else fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); } else fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); fflush(fd); input = (Table*) q->info.typ->ref; for (pin = input->list; pin; pin = pin->next) fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); if (is_transient(pout->info.typ)) fprintf(fd, ");"); else { if (!name || input->list) fprintf(fd, ", "); if (response) fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); else if (pout->info.typ->type == Treference && (((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "%s);", ident(pout->sym->name)); else if ((((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "&%s);", ident(pout->sym->name)); else if(pout->info.typ->type == Treference) fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); } fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap->error;"); if (!is_transient(pout->info.typ)) { if (sp && sp->URI && method_response_encoding) { if (is_literal(method_response_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); else if (sp->encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", sp->encoding); else if (method_response_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_response_encoding); else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); } else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); fprintf(fd,"\n\tsoap_serializeheader(soap);"); if (pout->info.typ->type == Tarray && response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if(((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (!is_XML((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (has_ns_eq(NULL, pout->sym->name)) xtag = ns_convert(pout->sym->name); else xtag = xml_tag(pout->info.typ); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); fprintf(fd,"\n\t\t || soap_putheader(soap)"); fprintf(fd,"\n\t\t || soap_body_begin_out(soap)"); if (response) fprintf(fd,"\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd,"\n\t\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd,"\n\t\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd,"\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd,"\n\t\t || soap_body_end_out(soap)"); fprintf(fd,"\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd,"\n\t\t\t return soap->error;"); fprintf(fd,"\n\t};"); fprintf(fd,"\n\tif (soap_end_count(soap)"); fprintf(fd,"\n\t || soap_response(soap, SOAP_OK)"); fprintf(fd,"\n\t || soap_envelope_begin_out(soap)"); fprintf(fd,"\n\t || soap_putheader(soap)"); fprintf(fd,"\n\t || soap_body_begin_out(soap)"); if (response) fprintf(fd,"\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if(((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd,"\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd,"\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd,"\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd,"\n\t || soap_body_end_out(soap)"); fprintf(fd,"\n\t || soap_envelope_end_out(soap)"); fprintf(fd,"\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd,"\n\treturn soap_closesock(soap);"); fprintf(fd,"\n}"); fflush(fd); } void gen_object_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { Entry *p, *method, *catch_method, *param; Table *t; char *soap, *catch_action; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd,"\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{ }", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); gen_nsmap(fd, ns, URI); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tdestroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); if (iflag) fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); else fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s);\n\tif (dup)\n\t\tsoap_copy_context(dup->soap, this->soap);\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params(fd, t, NULL, 0); fprintf(fd, "\n{\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\nint %s::run(int port)\n{\tif (soap_valid_socket(%s->master) || soap_valid_socket(bind(NULL, port, 100)))\n\t{\tfor (;;)\n\t\t{\tif (!soap_valid_socket(accept()) || serve())\n\t\t\t\treturn %s->error;\n\t\t\tsoap_destroy(%s);\n\t\t\tsoap_end(%s);\n\t\t}\n\t}\n\telse\n\t\treturn %s->error;\n\treturn SOAP_OK;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n\nSOAP_SOCKET %s::bind(const char *host, int port, int backlog)\n{\treturn soap_bind(%s, host, port, backlog);\n}", name, soap); fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nint %s::serve()", name); fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = %s->max_keep_alive;\n#endif\n\tdo\n\t{", soap); fprintf(fd,"\n\n#ifndef WITH_FASTCGI\n\t\tif (%s->max_keep_alive > 0 && !--k)\n\t\t\t%s->keep_alive = 0;\n#endif", soap, soap); fprintf(fd,"\n\n\t\tif (soap_begin_serve(%s))\n\t\t{\tif (%s->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn %s->error;\n\t\t}", soap, soap, soap); fprintf(fd,"\n\t\tif (dispatch() || (%s->fserveloop && %s->fserveloop(%s)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(%s);\n#else\n\t\t\treturn soap_send_fault(%s);\n#endif\n\t\t}", soap, soap, soap, soap, soap); fprintf(fd,"\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(%s);\n\t\tsoap_end(%s);\n\t} while (1);\n#else\n\t} while (%s->keep_alive);\n#endif", soap, soap, soap); fprintf(fd, "\n\treturn SOAP_OK;"); fprintf(fd, "\n}\n"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); fprintf(fd, "\n\nint %s::dispatch()\n{", name); if (!iflag) fprintf(fd, "\t%s_init(this->soap->imode, this->soap->omode);\n", name); fprintf(fd, "\tsoap_peek_element(%s);", soap); catch_method = NULL; catch_action = NULL; for (method = table->list; method; method = method->next) { char *action = NULL; if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (aflag) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; } } } } } if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (action) { if (*action == '"') { fprintf(fd, "\n\tif ("); if (param && !Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); } else { fprintf(fd, "\n\tif ("); if (param && !Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); } fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); if (param) { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); } else { catch_method = method; catch_action = action; } } } else { if (action) { if (*action == '"') { fprintf(fd, "\n\tif ("); if (!Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); } else { fprintf(fd, "\n\tif ("); if (!Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); } } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); } fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); } } } if (catch_method) { if (Aflag && catch_action) { if (*catch_action == '"') { fprintf(fd, "\n\tif ("); fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, catch_action); fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); } else { fprintf(fd, "\n\tif ("); fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, catch_action); fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); } fprintf(fd,"\n\treturn %s->error = SOAP_NO_METHOD;", soap); } fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); } else fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_serve_method(fd, table, method, name); if (namespaceid) fprintf(fd,"\n\n} // namespace %s\n", namespaceid); fprintf(fd,"\n/* End of server object code */\n"); } void gen_response_begin(FILE *fd, int n, char *s) { if (!is_invisible(s)) { fprintf(fd, "%*s<%sResponse", n, "", s); if (vflag < 0) gen_xmlns(fd); fprintf(fd, ">\n"); } } void gen_response_end(FILE *fd, int n, char *s) { if (!is_invisible(s)) fprintf(fd, "%*s</%sResponse>\n", n, "", s); } void gen_element_begin(FILE *fd, int n, char *s, char *t) { if (!is_invisible(s)) { if (tflag && t && *t) fprintf(fd, "%*s<%s xsi:type=\"%s\"", n, "", s, t); else fprintf(fd, "%*s<%s", n, "", s); } } void gen_element_end(FILE *fd, int n, char *s) { if (!is_invisible(s)) fprintf(fd, "%*s</%s>\n", n, "", s); else fprintf(fd, "\n"); } void gen_data(char *buf, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding) { Entry *p, *q, *r; FILE *fd; char *method_encoding = NULL; char *method_response_encoding = NULL; if (t) { for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { int get = 0, soap = 1, mime = 0; Service *sp; Method *m; char *nse = ns_qualifiedElement(p->info.typ); char *nsa = ns_qualifiedAttribute(p->info.typ); method_encoding = encoding; method_response_encoding = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) mime = 1; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) soap = 0; if (strstr(m->part, "GET")) get = 1; } } } } } if (!method_response_encoding) method_response_encoding = method_encoding; /* request */ if (!get && !mime) { fd = gen_env(buf, ns_remove(p->sym->name), 0, t, ns, name, URL, executable, URI, method_encoding, soap); if (!fd) return; q = entry(classtable, p->sym); if (yflag) { fprintf(fd, "%*s<!-- %s(...", 2, "", ident(p->sym->name)); if (q) { Table *r = (Table*)q->info.typ->ref; while (r) { Entry *e; for (e = r->list; e; e = e->next) fprintf(fd, ", %s", c_type_id(e->info.typ, e->sym->name)); r = r->prev; } } fprintf(fd, ", ...) -->\n"); } gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); if (q) { if (!is_invisible(p->sym->name)) { if (soap && vflag < 0) gen_xmlns(fd); gen_atts(fd, 2, (Table*)q->info.typ->ref, nsa); fprintf(fd, "\n"); } for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) gen_field(fd, 3, q, nse, nsa, method_encoding); } gen_element_end(fd, 2, ns_convert(p->sym->name)); if (soap && vflag >= 0) fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"); fclose(fd); } /* response */ q = (Entry*)p->info.typ->ref; if (!mime && q && !is_transient(q->info.typ)) { fd = gen_env(buf, ns_remove(p->sym->name), 1, t, ns, name, URL, executable, URI, method_response_encoding, soap); if (!fd) return; if (q && !is_response(q->info.typ)) { if (is_XML((Tnode*)q->info.typ->ref)) { gen_response_begin(fd, 2, ns_convert(p->sym->name)); gen_response_end(fd, 2, ns_convert(p->sym->name)); } else { gen_response_begin(fd, 2, ns_convert(p->sym->name)); gen_field(fd, 3, q, nse, nsa, method_response_encoding); gen_response_end(fd, 2, ns_convert(p->sym->name)); } } else if (q && q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) { char *xtag; nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); if (has_ns_eq(NULL, q->sym->name)) xtag = q->sym->name; else xtag = ((Tnode*)q->info.typ->ref)->id->name; if (yflag) fprintf(fd, "%*s<!-- %s(..., %s) -->\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); gen_element_begin(fd, 2, ns_addx(xtag, nse), NULL); if (!is_invisible(xtag)) { if (soap && vflag < 0) gen_xmlns(fd); gen_atts(fd, 2, ((Tnode*)q->info.typ->ref)->ref, nsa); fprintf(fd, "\n"); } for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) gen_field(fd, 3, r, nse, nsa, method_response_encoding); gen_element_end(fd, 2, ns_addx(xtag, nse)); } fflush(fd); if (soap && vflag >= 0) fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"); fclose(fd); } } } } void gen_field(FILE *fd, int n, Entry *p, char *nse, char *nsa, char *encoding) { Entry *q; char tmp[32]; LONG64 i; int d; if (!(p->info.sto & (Sattribute | Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && p->info.typ->type != Tfun && strncmp(p->sym->name, "__size", 6) && strncmp(p->sym->name, "__type", 6) && !is_choice(p)) { if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) fprintf(fd, "%*s<SOAP-RPC:result xmlns:SOAP-RPC=\"%s\">%s</SOAP-RPC:result>\n", n, "", rpcURI, ns_add(p, nse)); if (is_XML(p->info.typ)) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), NULL); if (!is_invisible(p->sym->name)) fprintf(fd, ">"); else fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); gen_element_end(fd, n, ns_add(p, nse)); } else { if (!is_string(p->info.typ) && n >= 10 && p->info.minOccurs <= 0) { /* Do not generate nil, since some tools don't accept it: if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p->sym->name, nse), NULL); fprintf(fd, " xsi:nil=\"true\"/>"); } */ return; } else if (n >= 20) { fprintf(fd, "%*s<!-- WARNING max depth exceeded: schema appears to incorrectly define infinitely large documents in recursion over mandatory elements with minOccurs>0 -->\n", n, ""); return; } else if (is_fixedstring(p->info.typ)) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); fprintf(fd, ">"); fflush(fd); if (p->info.hasval) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if (p->info.typ->type == Tarray) { i = ((Tnode*) p->info.typ->ref)->width; if (i) { i = p->info.typ->width / i; if (i > 4) i = 2; } if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\">", xsi_type_Tarray(p->info.typ), i); fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if (is_dynamic_array(p->info.typ) && !is_binary(p->info.typ)) { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); gen_atts(fd, n, (Table*)p->info.typ->ref, nsa); } else { d = get_Darraydims(p->info.typ); if (d) { for (i = 0; i < d-1; i++) { tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (((Table*)p->info.typ->ref)->list->info.minOccurs > 0) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\">", wsdl_type(((Table*)p->info.typ->ref)->list->info.typ, ""), ((Table*)p->info.typ->ref)->list->info.minOccurs, tmp); else fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)p->info.typ->ref)->list->info.typ, ""), tmp); } fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference) && is_dynamic_array((Tnode*)p->info.typ->ref) && !is_binary((Tnode*)p->info.typ->ref)) { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type((Tnode*)p->info.typ->ref)); gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); } else { d = get_Darraydims((Tnode*)p->info.typ->ref); if (d) { for (i = 0; i < d-1; i++) { tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if ((((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass) && ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs > 0) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\">", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs, tmp); else fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); } fflush(fd); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); } else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { /* if (!is_primclass(p->info.typ)) { char *nse1 = ns_qualifiedElement(p->info.typ); char *nsa1 = ns_qualifiedAttribute(p->info.typ); if (nse1) nse = nse1; if (nsa1) nsa = nsa1; } */ if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); gen_atts(fd, n, (Table*)p->info.typ->ref, nsa); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); } else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference) && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { /* if (!is_primclass(p->info.typ->ref)) { char *nse1 = ns_qualifiedElement(p->info.typ->ref); char *nsa1 = ns_qualifiedAttribute(p->info.typ->ref); if (nse1) nse = nse1; if (nsa1) nsa = nsa1; } */ if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); } else if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); if (p->info.typ->type == Ttemplate) { if (((Tnode*)p->info.typ->ref)->type == Tpointer && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } switch (p->info.typ->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: if (p->info.hasval) fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); else fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (p->info.hasval) fprintf(fd, "%g", p->info.val.r); else fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } break; case Tenum: if (p->info.hasval && p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name)); break; } } else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding); break; case Tpointer: case Treference: if (is_string(p->info.typ) || is_wstring(p->info.typ)) { if (p->info.hasval) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); break; case Tclass: if (is_stdstr(p->info.typ)) { if (p->info.hasval) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; } case Tstruct: if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; case Tunion: gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; case Ttemplate: i = p->info.maxOccurs; if (i <= 1 || i > 4) i = p->info.minOccurs; if (i <= 1) i = 2; do { /* a bit of a hack, I don't like the copy of the code above */ { gen_val(fd, n, p->info.typ, nse, nsa, encoding); if (i > 1) { gen_element_end(fd, 0, ns_add(p, nse)); if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); if (p->info.typ->type == Ttemplate) { if (((Tnode*)p->info.typ->ref)->type == Tpointer && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } fflush(fd); } } while (--i); break; default: break; } if (p->info.typ->type != Tunion) gen_element_end(fd, 0, ns_add(p, nse)); fflush(fd); } } } void gen_atts(FILE *fd, int n, Table *t, char *nsa) { static unsigned long idnum = 0; Entry *q, *r; Tnode *p; int i; for (; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) { fprintf(fd, " %s=\"", ns_add(q, nsa)); if ((q->info.typ->type == Tpointer || q->info.typ->type == Treference) && !is_string(q->info.typ)) p = (Tnode*)q->info.typ->ref; else p = q->info.typ; if (is_eq(q->sym->name, "id")) fprintf(fd, "%lu", ++idnum); /* id="#" should be unique */ else switch (p->type) { case Tchar: case Tshort: case Tint: case Tuchar: case Tushort: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: if (q->info.hasval) fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); else fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (q->info.hasval) fprintf(fd, "%g", q->info.val.r); else fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: if (q->info.hasval && p->ref) { for (r = ((Table*)p->ref)->list; r; r = r->next) { if (r->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(r->sym->name)); break; } } } else if (p->ref) fprintf(fd, "%s", ns_remove2((((Table*)p->ref)->list)->sym->name)); else fprintf(fd, "0"); break; case Tpointer: case Treference: if (is_string(p)) { if (q->info.hasval) fprintf(fd, "%s", xstring(q->info.val.s)); else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000) for (i = 0; i < (int)q->info.typ->minLength; i++) fprintf(fd, "X"); } break; case Tclass: if (is_stdstr(p)) { if (q->info.hasval) fprintf(fd, "%s", xstring(q->info.val.s)); else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000) for (i = 0; i < (int)q->info.typ->minLength; i++) fprintf(fd, "X"); } break; default: break; } if (yflag) fprintf(fd, " // %s //", c_type_id(q->info.typ, q->sym->name)); fprintf(fd, "\""); } } } fprintf(fd, ">"); fflush(fd); } void gen_val(FILE *fd, int n, Tnode *p, char *nse, char *nsa, char *encoding) { Entry *q; LONG64 i; if (!is_transient(p) && p->type != Tfun && !is_XML(p)) { if (is_fixedstring(p)) { for (i = 0; i < p->width / ((Tnode*)p->ref)->width - 1; i++) fprintf(fd, "X"); } else if (p->type == Tarray) { i = ((Tnode*) p->ref)->width; if (i) { i = p->width / i; if (i > 4) i = 2; fprintf(fd, "\n"); for (; i > 0; i--) { fprintf(fd, "%*s<item>", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding); fprintf(fd, "</item>\n"); } fprintf(fd, "%*s", n, ""); } } else if (is_dynamic_array(p)) { if (!is_binary(p)) { Table *t; fprintf(fd, "\n"); for (t = (Table*)p->ref; t && !t->list; t = t->prev) ; if (t) gen_field(fd, n+1, t->list, nse, nsa, encoding); fprintf(fd, "%*s", n, ""); } } switch (p->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: if (p->ref && (q = ((Table*)p->ref)->list)) fprintf(fd, "%s", ns_remove2(q->sym->name)); else fprintf(fd, "0"); break; case Tpointer: case Treference: if (is_string(p) || is_wstring(p)) { if (p->minLength > 0 && p->minLength < 10000) for (i = 0; i < (int)p->minLength; i++) fprintf(fd, "X"); } else gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); break; case Tclass: case Tstruct: nse = ns_qualifiedElement(p); nsa = ns_qualifiedAttribute(p); if (is_stdstr(p)) { if (p->minLength > 0 && p->minLength < 10000) for (i = 0; i < (int)p->minLength; i++) fprintf(fd, "X"); } else if (is_primclass(p)) { Table *t; for (t = (Table*)p->ref; t; t = t->prev) { Entry *r = entry(classtable, t->sym); r = t->list; if (r && is_item(r)) { gen_val(fd, n, r->info.typ, nse, nsa, encoding); return; } } } else if (!is_dynamic_array(p) && p->ref) { Table *t; fprintf(fd, "\n"); for (t = (Table*)p->ref; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (is_repetition(q)) { i = q->info.maxOccurs; if (i <= 1 || i > 4) i = q->info.minOccurs; if (i <= 1) i = 2; do gen_field(fd, n+1, q->next, nse, nsa, encoding); while (--i); q = q->next; } else gen_field(fd, n+1, q, nse, nsa, encoding); } } fprintf(fd, "%*s", n, ""); } break; case Tunion: if (((Table*)p->ref)->list) gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding); break; case Ttemplate: gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); break; default: break; } } } void gen_header(FILE *fd, char *method, int response, char *encoding) { if (custom_header) { Service *sp; Method *m = NULL; Entry *q; Table *r; if (yflag) { if (cflag) fprintf(fd, " <!-- struct SOAP_ENV__Header -->\n"); else fprintf(fd, " <!-- SOAP_ENV__Header *soap::header -->\n"); } fprintf(fd, " <SOAP-ENV:Header>\n"); q = entry(classtable, lookup("SOAP_ENV__Header")); if (q) { r = (Table*)q->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) { for (sp = services; sp; sp = sp->next) for (m = sp->list; m; m = m->next) if (is_eq(m->name, method) && (!strcmp(m->part, q->sym->name) || is_eq_nons(m->part, q->sym->name)) && ((!response && (m->mess&HDRIN)) || (response && (m->mess&HDROUT)))) { gen_field(fd, 2, q, NULL, NULL, encoding); break; } } } fprintf(fd, " </SOAP-ENV:Header>\n"); } } } } FILE * gen_env(char *buf, char *method, int response, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding, int soap) { char tmp[1024]; FILE *fd; strcpy(tmp, buf); if (!soap) strcat(tmp, "REST."); #ifdef __vms if (!response) { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #else strcpy(strrchr(tmp, '.')+1, method); if (!response) { strcat(tmp, ".req.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { strcat(tmp, ".res.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #endif fd = fopen(tmp, "w"); if (!fd) execerror("Cannot write XML file"); fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); if (soap && vflag >= 0) { fprintf(fd, "<SOAP-ENV:Envelope"); gen_xmlns(fd); fprintf(fd, ">\n"); gen_header(fd, method, response, encoding); fprintf(fd, " <SOAP-ENV:Body"); if (eflag && !encoding) fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI); else if (encoding && !*encoding) fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI); else if (encoding && strcmp(encoding, "literal")) fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encoding); fprintf(fd, ">\n"); } return fd; } void gen_xmlns(FILE *fd) { Symbol *s; Service *sp = NULL; for (s = nslist; s; s = s->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s->name) && sp->URI) break; if (sp) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (vflag >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (vflag >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } } char * emalloc(size_t n) { char *p; if ((p = (char*)malloc(n)) == NULL) execerror("out of memory"); return p; } void soap_serve(Table *table) { Entry *method, *catch_method = NULL; char *catch_action = NULL; if (!Cflag) { fprintf(fserver,"\n\n"); if (!cflag && !namespaceid) fprintf(fserver,"extern \"C\" "); fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); fprintf(fserver,"\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = soap->max_keep_alive;\n#endif\n\tdo\n\t{"); fprintf(fserver,"\n#ifndef WITH_FASTCGI\n\t\tif (soap->max_keep_alive > 0 && !--k)\n\t\t\tsoap->keep_alive = 0;\n#endif"); fprintf(fserver,"\n\t\tif (soap_begin_serve(soap))\n\t\t{\tif (soap->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn soap->error;\n\t\t}"); if (namespaceid) fprintf(fserver,"\n\t\tif (%s::%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", namespaceid, nflag?prefix:"soap"); else fprintf(fserver,"\n\t\tif (%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", nflag?prefix:"soap"); fprintf(fserver,"\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(soap);\n\t\tsoap_end(soap);\n\t} while (1);\n#else\n\t} while (soap->keep_alive);\n#endif"); fprintf(fserver,"\n\treturn SOAP_OK;"); fprintf(fserver,"\n}"); fprintf(fserver,"\n\n#ifndef WITH_NOSERVEREQUEST\n"); if (!cflag && !namespaceid) fprintf(fserver,"extern \"C\" "); fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); fprintf(fserver, "\n\tsoap_peek_element(soap);"); for (method = table->list; method; method = method->next) { char *action = NULL; if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (aflag) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; } } } } } if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (action) { if (*action == '"') { fprintf(fserver, "\n\tif ("); if (param && !Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); } else { fprintf(fserver, "\n\tif ("); if (param && !Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); } fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); if (param) { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(param->sym->name)); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } else { catch_method = method; catch_action = action; } } } else { if (action) { if (*action == '"') { fprintf(fserver, "\n\tif ("); if (!Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); } else { fprintf(fserver, "\n\tif ("); if (!Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); } } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(method->sym->name)); } fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } } } if (catch_method) { if (Aflag && catch_action) { if (*catch_action == '"') { fprintf(fserver, "\n\tif ("); fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", catch_action); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } else { fprintf(fserver, "\n\tif ("); fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", catch_action); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;"); } else fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } else fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;"); fprintf(fserver,"\n}\n#endif"); banner(fheader, "Server-Side Operations"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) generate_proto(table, method); banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); fprintf(fheader, "\n"); if (!cflag && !namespaceid) fprintf(fheader,"extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); fprintf(fheader, "\n\n"); if (!cflag && !namespaceid) fprintf(fheader,"extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_serve_method(fserver, table, method, NULL); } if (!Sflag) { banner(fheader, "Client-Side Call Stubs"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_call_method(fclient, table, method, NULL); } } void generate_proto(Table *table, Entry *param) { Entry *q, *pout; Table *output; q = entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); output = (Table*)q->info.typ->ref; fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); gen_params(fheader, output, pout, 1); fprintf(fheader, ";"); } int tagcmp(const char *s, const char *t) { size_t i, n; n = strlen(s); for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return -(t[i] != 0); } int tagncmp(const char *s, const char *t, size_t n) { size_t i; for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return 0; } int is_qname(Tnode *p) { if (p->sym && is_string(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && is_string(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_stdqname(Tnode *p) { if (p->sym && p->type == Tclass && is_volatile(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && p->type == Tclass && is_volatile(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_XML(Tnode *p) { return (p->sym && (is_string(p) || is_wstring(p)) && is_eq(p->sym->name, "XML")) || ((p->type == Tpointer || p->type == Treference) && is_XML((Tnode*)p->ref)); } int is_stdXML(Tnode *p) { return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); } int is_response(Tnode *p) { return (p->type == Tpointer || p->type == Treference) && p->ref && has_ns((Tnode*)p->ref) && ((((Tnode*)p->ref)->type == Tstruct || ((Tnode*)p->ref)->type == Tclass) && !is_primclass((Tnode*)p->ref) && !is_dynamic_array((Tnode*)p->ref) && !is_stdstring((Tnode*)p->ref) && !is_stdwstring((Tnode*)p->ref)); } Entry* get_response(Tnode *p) { if (p->type == Tfun) return p->response; return 0; } int is_unmatched(Symbol *sym) { return sym->name[0] == '_' && sym->name[1] != '_' && strncmp(sym->name, "_DOT", 4) && strncmp(sym->name, "_USCORE", 7) && (strncmp(sym->name, "_x", 2) || !isxdigit(sym->name[2]) || !isxdigit(sym->name[3]) || !isxdigit(sym->name[4]) || !isxdigit(sym->name[5])); } int is_invisible(const char *name) { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); } int is_invisible_empty(Tnode *p) { if (p->type == Tstruct || p->type == Tclass) if (is_invisible(p->id->name)) if (!p->ref || !((Table*)p->ref)->list) return 1; return 0; } int is_element(Tnode *typ) { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) return 0; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tstruct || typ->type == Tclass) return is_unmatched(typ->id); return 0; } int is_untyped(Tnode *typ) { Tnode *p; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tpointer || typ->type == Treference || typ->type == Tarray) return is_untyped((Tnode*)typ->ref); if (typ->type == Tstruct || typ->type == Tclass) { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; return is_untyped(p); } else return is_unmatched(typ->id); } return 0; } int is_primclass(Tnode *typ) { Table *t; if (typ->type == Tstruct || typ->type == Tclass) { if (!is_dynamic_array(typ)) { t = (Table*)typ->ref; while (t) { if (t->list && is_item(t->list)) break; t = t->prev; } if (!t) return 0; t = (Table*)typ->ref; while (t) { Entry *p; for (p = t->list; p; p = p->next) if (!is_item(p)) if (p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) return 0; t = t->prev; } return 1; } } else if (typ->type == Tpointer || typ->type == Treference) return is_primclass((Tnode*)typ->ref); return 0; } int is_mask(Tnode *typ) { return (typ->type == Tenum && typ->width == 8); } int is_void(Tnode *typ) { if (!typ) return 1; if (typ->type == Tvoid) return 1; if (typ->type == Tpointer) return is_void((Tnode*)typ->ref); if (typ->type == Treference) return is_void((Tnode*)typ->ref); if (typ->type == Tarray) return is_void((Tnode*)typ->ref); if (typ->type == Ttemplate) return is_void((Tnode*)typ->ref); return 0; } int is_transient(Tnode *typ) { if (!typ) return 1; if (typ->type == Tstruct && typ->id == lookup("soap")) return 1; if (is_external(typ) || is_volatile(typ)) return 0; if (typ->transient > 0) return 1; switch (typ->type) { case Tpointer: case Treference: case Tarray: case Ttemplate: return is_transient((Tnode*)typ->ref); case Tnone: case Tvoid: return 1; default: break; } return 0; } int is_imported(Tnode* typ) { return typ->imported != NULL; } int is_external(Tnode* typ) { return typ->transient == -1; } int is_anyType(Tnode* typ) { if (typ->type == Tpointer) return is_anyType((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element"); } int is_anyAttribute(Tnode* typ) { if (typ->type == Tpointer) return is_anyAttribute((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); } int is_volatile(Tnode* typ) { return typ->transient == -2; } int is_template(Tnode *p) { if (p->type == Tpointer) return is_template((Tnode*)p->ref); return p->type == Ttemplate; } int is_repetition(Entry *p) { if (p) return p->next && p->next->info.typ->type == Tpointer && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__size", 6)); return 0; } int is_item(Entry *p) { if (p) return !strcmp(p->sym->name, "__item"); return 0; } int is_self(Entry *p) { if (p) return !strcmp(p->sym->name, "__self"); return 0; } int is_choice(Entry *p) { if (p) if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) return 1; return 0; } int is_sequence(Entry *p) { if (p) { Tnode *q = p->info.typ; if (q->type == Tpointer) q = (Tnode*)q->ref; if (q->type == Tstruct && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) return 1; } return 0; } int is_anytype(Entry *p) { if (p) if (p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type == Tvoid && p->info.typ->type == Tint && !strncmp(p->sym->name, "__type", 6)) { is_anytype_flag = 1; return 1; } return 0; } int is_keyword(const char *name) { Symbol *s = lookup(name); if (s) return s->token != ID; return 0; } int has_ptr(Tnode *typ) { Tnode *p; if (typ->type == Tpointer || typ->type == Treference) return 0; for (p = Tptr[Tpointer]; p; p = p->next) if ((Tnode*)p->ref == typ && p->transient != 1) return 1; return 0; } int has_detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_Detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_class(Tnode *typ) { Entry *p; if (typ->type == Tstruct && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.sto & Stypedef) continue; if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) return 1; if (p->info.typ->type == Tstruct && has_class(p->info.typ)) return 1; } } return 0; } int has_external(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_external(p->info.typ) || has_external(p->info.typ)) return 1; } } } return 0; } int has_volatile(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) if (!is_stdstr(p->info.typ)) return 1; } } } return 0; } int has_ns(Tnode *typ) { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum) return has_ns_eq(NULL, typ->id->name); return 0; } int has_ns_t(Tnode *typ) { char *s; if (typ->sym) { s = strstr(typ->sym->name + 1, "__"); if (!s) { s = strchr(typ->sym->name, ':'); if (s && s[1] == ':') s = NULL; } return s && s[1] && s[2] && (s[2] != '_' || (s[2] == '_' && s[3] == 'x' && isxdigit(s[4]) && isxdigit(s[5]) && isxdigit(s[6]) && isxdigit(s[7])) || !strncmp(s+2, "_DOT", 4) || !strncmp(s+2, "_USCORE", 7)); } return has_ns(typ); } /* needs_lang adds xml:lang attribute to matching struct/class member name we should use an annotation for soapcpp2's input this in the future instead of a hard-coded member name */ void needs_lang(Entry *e) { if (!strcmp(e->sym->name, "SOAP_ENV__Text")) fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); } int is_eq_nons(const char *s, const char *t) { size_t n, m; char *r; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; r = strstr(t, "__"); if (r) t = r + 2; n = strlen(s) - 1; m = strlen(t) - 1; #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING while (n > 0 && s[n] == '_') n--; while (m > 0 && t[m] == '_') m--; #endif if (n != m) return 0; return !strncmp(s, t, n + 1); } int is_eq(const char *s, const char *t) { size_t n, m; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; for (m = strlen(t) - 1; m && t[m] == '_'; m--) ; if (n != m) return 0; return !strncmp(s, t, n + 1); } int has_ns_eq(char *ns, char *s) { size_t n; while (*s == '_' || *s == ':') s++; if (!ns) { char *t = strstr(s + 1, "__"); if (!t || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+2, "DOT", 3) || !strncmp(t+2, "USCORE", 6)) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } return t && t[1] && t[2] && t[2] != '_'; } if ((n = strlen(ns)) < strlen(s)) return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); return 0; } char * strict_check(void) { if (sflag) return ""; return "(soap->mode & SOAP_XML_STRICT) && "; } char * ns_of(char *name) { Service *sp; for (sp = services; sp; sp = sp->next) if (has_ns_eq(sp->ns, name)) break; if (sp) return sp->URI; return NULL; } int eq_ns(char *s, char *t) { return ns_of(s) == ns_of(t); } char * prefix_of(char *s) { char *t; while (*s == '_' || *s == ':') s++; t = strstr(s + 1, "__"); if (!t) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } if (t && t[1] && t[2] && t[2] != '_') { char *r = (char*)emalloc(t - s + 1); strncpy(r, s, t - s); r[t - s] = '\0'; return r; } return s; } char * ns_add_overridden(Table *t, Entry *p, char *ns) { Entry *q; Symbol *s = t->sym; if (s) { do { for (q = t->list; q; q = q->next) if (!strcmp(q->sym->name, p->sym->name)) return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); } while ((t = t->prev) != NULL); } return ns_add(p, ns); } char * c_ident(Tnode *typ) { if (typ->sym && strcmp(typ->sym->name, "/*?*/")) return res_remove(typ->sym->name); return t_ident(typ); } char * soap_type(Tnode *typ) { char *s, *t = c_ident(typ); if (namespaceid) { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); strcpy(s, "SOAP_TYPE_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + 11); strcpy(s, "SOAP_TYPE_"); } strcat(s, t); return s; } char * ident(char *name) { char *s = strrchr(name, ':'); if (s && *(s+1) && *(s-1) != ':') return s+1; return name; } /*t_ident gives the name of a type in identifier format*/ char * t_ident(Tnode *typ) { char *p, *q; switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint: return "int"; case Tlong: return "long"; case Tllong: return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: return "unsignedLong"; case Tullong: return "unsignedLONG64"; case Ttime: return "time"; case Tstruct: case Tclass: case Tunion: case Tenum: if ((Table*)typ->ref == booltable) return "bool"; return res_remove(typ->id->name); case Treference: return c_ident((Tnode*)typ->ref); case Tpointer: if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wstring"; p=(char*) emalloc((10+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char)); strcpy(p,"PointerTo"); strcat(p,q); return p; case Tarray: p=(char*) emalloc((16+strlen(c_ident((Tnode*)typ->ref)))*sizeof(char)); if (((Tnode*)typ->ref)->width) sprintf(p, "Array%dOf%s",typ->width / ((Tnode*) typ->ref)->width,c_ident(typ->ref)); else sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); return p; case Ttemplate: if (typ->ref) { p=(char*) emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char)); strcpy(p, res_remove(typ->id->name)); strcat(p, "TemplateOf"); strcat(p, q); return p; } case Tfun: return "Function"; } return "anyType"; } void utf8(char **t, long c) { if (c < 0x0080) *(*t)++ = (char)c; else { if (c < 0x0800) *(*t)++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *(*t)++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *(*t)++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *(*t)++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *(*t)++ = (char)(0xFC | ((c >> 30) & 0x01)); *(*t)++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *(*t)++ = (char)(0x80 | (c & 0x3F)); } *(*t) = '\0'; } char * ns_convert(char *tag) { char *t, *s; size_t i, n; if (*tag == '_') { if (!strncmp(tag, "__ptr", 5)) { if (tag[5]) tag += 5; else tag = "item"; } else if (strncmp(tag, "_DOT", 4) && strncmp(tag, "_USCORE", 7) && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) tag++; /* skip leading _ */ } for (n = strlen(tag); n > 0; n--) { if (tag[n-1] != '_') break; } s = t = (char*)emalloc(n+1); for (i = 0; i < n; i++) { if (tag[i] == '_') { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) break; else if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (tag[i] == ':' && tag[i+1] == ':') break; else *s++ = tag[i]; } if (i < n) { *s++ = ':'; for (i += 2; i < n; i++) { if (tag[i] == '_') { if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else *s++ = tag[i]; } } *s = '\0'; return t; } char * res_remove(char *tag) { char *s, *t; if (!(s = strchr(tag, ':'))) return tag; if (s[1] != ':') tag = s + 1; if (!strchr(tag, ':')) return tag; s = emalloc(strlen(tag) + 1); strcpy(s, tag); while ((t = strchr(s, ':'))) *t = '_'; return s; } char * ns_qualifiedElement(Tnode *typ) { Service *sp; char *s = NULL; if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->elementForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->elementForm, "qualified")) return s; return NULL; } } for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s)) if (sp->style && !strcmp(sp->style, "document")) return s; return NULL; } char * ns_qualifiedAttribute(Tnode *typ) { Service *sp; char *s = NULL; if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->attributeForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->attributeForm, "qualified")) return s; return NULL; } } return NULL; } char * field(Entry *p, char *ns) { char *r, *s; if (is_self(p)) return "tag"; r = ns_add(p, ns); s = emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } char * field_overridden(Table *t, Entry *p, char *ns) { char *r, *s; if (is_self(p)) return "tag"; r = ns_add_overridden(t, p, ns); s = emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } char * ns_add(Entry *p, char *ns) { if (p->tag) return ns_addx(p->tag, ns); return ns_addx(p->sym->name, ns); } char * ns_addx(char *tag, char *ns) { char *n, *t, *s = ns_convert(tag); if (*s == ':') return s+1; if (!ns || *s == '-' || (t = strchr(s, ':'))) return s; n = ns_convert(ns); t = emalloc(strlen(n) + strlen(s) + 2); strcpy(t, n); strcat(t, ":"); strcat(t, s); return t; } char * ns_name(char *tag) { char *t, *r, *s = tag; if (*s) { for (r = s+strlen(s)-1; r > s; r--) if (*r != '_') break; for (t = s + 1; t < r; t++) { if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; } else if (t[0] == ':' && t[1] != ':') { s = t + 1; t++; } } } return s; } char * ns_cname(char *tag, char *suffix) { char *s, *t; size_t i, n; if (!tag) return NULL; t = ns_name(tag); n = strlen(t); if (suffix) s = emalloc(n + strlen(suffix) + 2); else s = emalloc(n + 2); for (i = 0; i < n; i++) { if (!isalnum(t[i])) s[i] = '_'; else s[i] = t[i]; } s[i] = '\0'; if (suffix) strcat(s, suffix); if (is_keyword(t)) strcat(s, "_"); return s; } char * ns_fname(char *tag) { char *s; size_t i; s = emalloc(strlen(tag) + 1); strcpy(s, tag); for (i = 0; s[i]; i++) if (!isalnum(s[i])) s[i] = '_'; return s; } char * ns_remove(char *tag) { return ns_convert(ns_name(tag)); } char * ns_remove1(char *tag) { char *t, *s = tag; int n = 2; /* handle 'enum_xx__yy' generated by wsdl2h if (!strncmp(s, "enum_", 5)) n = 1; */ if (*s) { for (t = s + 1; *t && n; t++) if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; n--; } if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) s = tag; } return s; } char * ns_remove2(char *tag) { return ns_convert(ns_remove1(tag)); } char * xsi_type_cond(Tnode *typ, int flag) { if (flag) return xsi_type(typ); return ""; } char * xsi_type_cond_u(Tnode *typ, int flag) { if (flag) return xsi_type_u(typ); return ""; } char * xsi_type_u(Tnode *typ) { Service *sp; char *s = NULL; if (tflag) return xsi_type(typ); if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return ""; s = xsi_type(typ); for (sp = services; sp; sp = sp->next) if (sp->xsi_type && has_ns_eq(sp->ns, s)) return s; return ""; } char * xsi_type(Tnode *typ) { if (!typ) return "NULL"; if (is_dynamic_array(typ) && !has_ns(typ)) return xsi_type_Darray(typ); if (typ->type == Tarray) return xsi_type_Tarray(typ); if (is_untyped(typ)) return ""; if (typ->sym) { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) return ""; if (is_XML(typ)) return "xsd:anyType"; if (typ->type != Ttemplate) return ns_convert(typ->sym->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "xsd:string"; switch(typ->type){ case Tchar: return "xsd:byte"; case Twchar: return "wchar"; case Tshort: return "xsd:short"; case Tint: return "xsd:int"; case Tlong: case Tllong: return "xsd:long"; case Tfloat: return "xsd:float"; case Tdouble: return "xsd:double"; case Tldouble: return "xsd:decimal"; case Tuchar: return "xsd:unsignedByte"; case Tushort: return "xsd:unsignedShort"; case Tuint: return "xsd:unsignedInt"; case Tulong: case Tullong: return "xsd:unsignedLong"; case Ttime: return "xsd:dateTime"; case Tpointer: case Treference: return xsi_type((Tnode*)typ->ref); case Tenum: if ((Table*)typ->ref == booltable) return "xsd:boolean"; case Tstruct: case Tclass: if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) return ""; return ns_convert(typ->id->name); case Ttemplate: if ((Tnode*)typ->ref) return xsi_type((Tnode*)typ->ref); break; default: break; } return ""; } char * xml_tag(Tnode *typ) { if (!typ) return "NULL"; if (typ->type == Tpointer || typ->type == Treference) return xml_tag((Tnode*)typ->ref); if (typ->sym) return ns_convert(typ->sym->name); return the_type(typ); } char * wsdl_type(Tnode *typ, char *ns) { if (!typ) return "NULL"; if ((is_qname(typ) || is_stdqname(typ)) && ns) return "xsd:QName"; if (typ->sym) { if (is_XML(typ)) return "xsd:anyType"; else if (ns) return ns_convert(typ->sym->name); else return ns_remove(typ->sym->name); } return base_type(typ, ns); } char * base_type(Tnode *typ, char *ns) { int d; char *s, *t; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) { if (ns) return "xsd:string"; return "string"; } if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); if (ns && *ns) { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, "ArrayOf"); } else { t = (char*)emalloc(strlen(s)+12); strcpy(t, "ArrayOf"); } strcat(t, s); d = get_Darraydims(typ); if (d) sprintf(t+strlen(t), "%dD", d); return t; } switch (typ->type){ case Tchar : if (ns) return "xsd:byte"; return "byte"; case Twchar : if (ns) return "xsd:wchar"; return "wchar"; case Tshort : if (ns) return "xsd:short"; return "short"; case Tint : if (ns) return "xsd:int"; return "int"; case Tlong : case Tllong : if (ns) return "xsd:long"; return "long"; case Tfloat: if (ns) return "xsd:float"; return "float"; case Tdouble: if (ns) return "xsd:double"; return "double"; case Tldouble: if (ns) return "xsd:decimal"; return "decimal"; case Tuchar: if (ns) return "xsd:unsignedByte"; return "unsignedByte"; case Tushort: if (ns) return "xsd:unsignedShort"; return "unsignedShort"; case Tuint: if (ns) return "xsd:unsignedInt"; return "unsignedInt"; case Tulong: case Tullong: if (ns) return "xsd:unsignedLong"; return "unsignedLong"; case Ttime: if (ns) return "xsd:dateTime"; return "dateTime"; case Tpointer: case Treference: return wsdl_type((Tnode*)typ->ref, ns); case Tarray: if (is_fixedstring(typ)) { if (typ->sym) { if (ns) return ns_convert(typ->sym->name); return ns_remove(typ->sym->name); } if (ns) return "xsd:string"; return "string"; } if (ns && *ns) { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2)*sizeof(char)); strcpy(s, ns_convert(ns)); strcat(s, ":"); strcat(s, c_ident(typ)); return s; } else return c_ident(typ); case Tenum: if ((Table*)typ->ref == booltable) { if (ns) return "xsd:boolean"; return "boolean"; } case Tstruct: case Tclass: if (!has_ns(typ) && ns && *ns) { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2)*sizeof(char)); strcpy(s, ns_convert(ns)); strcat(s, ":"); strcat(s, ns_convert(typ->id->name)); return s; } else if (ns) return ns_convert(typ->id->name); else return ns_remove(typ->id->name); case Tunion: if (ns) return "xsd:choice"; return "choice"; case Ttemplate: if ((Tnode*)typ->ref) return wsdl_type((Tnode*)typ->ref, ns); break; default: break; } return ""; } char * the_type(Tnode *typ) { if (!typ) return "NULL"; if (typ->type == Tarray || (is_dynamic_array(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) return "SOAP-ENC:Array"; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "string"; switch (typ->type) { case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint : return "int"; case Tlong : case Tllong : return "long"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: case Tullong: return "unsignedLong"; case Ttime: return "dateTime"; case Tpointer: case Treference: return the_type((Tnode*)typ->ref); case Tarray: return "SOAP-ENC:Array"; case Tenum: if ((Table*)typ->ref == booltable) return "boolean"; case Tstruct: case Tclass: return ns_convert(typ->id->name); default: break; } return ""; } /* c_type returns the type to be used in parameter declaration*/ char * c_type(Tnode *typ) { char *p, *q, tempBuf[10]; Tnode *temp; if (typ==0) return "NULL"; switch(typ->type){ case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "char"; case Twchar: return "wchar_t"; case Tshort: return "short"; case Tint : return "int"; case Tlong : return "long"; case Tllong : return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "long double"; case Tuchar: return "unsigned char"; case Tushort: return "unsigned short"; case Tuint: return "unsigned int"; case Tulong: return "unsigned long"; case Tullong: return "ULONG64"; case Ttime: return "time_t"; case Tstruct: p = (char*) emalloc((8+strlen(ident(typ->id->name))) *sizeof(char)); strcpy(p, "struct "); strcat(p, ident(typ->id->name)); break; case Tclass: p = ident(typ->id->name); break; case Tunion: p=(char*) emalloc((7+strlen(ident(typ->id->name))) *sizeof(char)); strcpy(p, "union "); strcat(p, ident(typ->id->name)); break; case Tenum: if ((Table*)typ->ref == booltable) return "bool"; p=(char*) emalloc((6+strlen(ident(typ->id->name))) *sizeof(char)); strcpy(p, "enum "); strcat(p, ident(typ->id->name)); break; case Tpointer: p = c_type_id((Tnode*)typ->ref, "*"); break; case Treference: p = c_type_id((Tnode*)typ->ref, "&"); break; case Tarray: temp = typ; while(((Tnode*) (typ->ref))->type==Tarray){ typ = (Tnode*)typ->ref; } p=(char*) emalloc((12+strlen(q = c_type((Tnode*)typ->ref))) *sizeof(char)); if (((Tnode*)typ->ref)->type == Tpointer) sprintf(p,"%s",c_type((Tnode*)typ->ref)); else strcpy(p, q); typ = temp; while(typ->type==Tarray){ if (((Tnode*) typ->ref)->width) { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width)); strcat(p,tempBuf); } typ = (Tnode*)typ->ref; } break; case Ttemplate: if (typ->ref) { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+4) *sizeof(char)); strcpy(p, ident(typ->id->name)); strcat(p, "<"); strcat(p, q); strcat(p, " >"); break; } default: return "UnknownType"; } return p; } char * c_storage(Storage sto) { char *p; static char buf[256]; if (sto & Sconst) { p = c_storage(sto & ~Sconst); strcat(p, "const "); return p; } if (sto & Sconstptr) { p = c_storage(sto & ~Sconstptr); strcat(p, "const "); return p; } if (sto & Sauto) { p = c_storage(sto & ~Sauto); strcat(p, "auto "); return p; } if (sto & Sregister) { p = c_storage(sto & ~Sregister); strcat(p, "register "); return p; } if (sto & Sstatic) { p = c_storage(sto & ~Sstatic); strcat(p, "static "); return p; } if (sto & Sexplicit) { p = c_storage(sto & ~Sexplicit); strcat(p, "explicit "); return p; } if (sto & Sextern) { p = c_storage(sto & ~Sextern); return p; } if (sto & Stypedef) { p = c_storage(sto & ~Stypedef); strcat(p, "typedef "); return p; } if (sto & Svirtual) { p = c_storage(sto & ~Svirtual); strcat(p, "virtual "); return p; } if (sto & Sfriend) { p = c_storage(sto & ~Sfriend); strcat(p, "friend "); return p; } if (sto & Sinline) { p = c_storage(sto & ~Sinline); strcat(p, "inline "); return p; } buf[0]= '\0'; return buf; } char * c_init(Entry *e) { static char buf[1024]; buf[0] = '\0'; if (e && e->info.hasval) { switch (e->info.typ->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: sprintf(buf, " = " SOAP_LONG_FORMAT, e->info.val.i); break; case Tlong: sprintf(buf, " = " SOAP_LONG_FORMAT "L", e->info.val.i); break; case Tulong: sprintf(buf, " = " SOAP_LONG_FORMAT "UL", e->info.val.i); break; case Tllong: sprintf(buf, " = " SOAP_LONG_FORMAT "LL", e->info.val.i); break; case Tullong: sprintf(buf, " = " SOAP_LONG_FORMAT "ULL", e->info.val.i); break; case Tfloat: case Tdouble: sprintf(buf, " = %g", e->info.val.r); break; case Tldouble: sprintf(buf, " = %gL", e->info.val.r); break; case Tenum: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) sprintf(buf, " = (%s)" SOAP_LONG_FORMAT, c_type(e->info.typ), e->info.val.i); else sprintf(buf, " = (%s)" SOAP_LONG_FORMAT "LL", c_type(e->info.typ), e->info.val.i); break; default: if (is_stdstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = \"%s\"", cstring(e->info.val.s)); else if (is_stdwstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = L\"%s\"", cstring(e->info.val.s)); else if (is_wstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = (wchar_t*)L\"%s\"", cstring(e->info.val.s)); else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = (char*)\"%s\"", cstring(e->info.val.s)); else if (e->info.typ->type == Tpointer) sprintf(buf, " = NULL"); break; } } return buf; } /* c_type_id returns the type to be used in parameter declaration */ char * c_type_id(Tnode *typ, char *name) { char *id,*p,*q,tempBuf[10]; Tnode *temp; Entry *e; if (!typ) return "NULL"; id = ident(name); switch(typ->type) { case Tnone: p = id; break; case Tvoid: p = (char*)emalloc(6+strlen(id)); strcpy(p, "void "); strcat(p, id); break; case Tchar: p = (char*)emalloc(6+strlen(id)); strcpy(p, "char "); strcat(p, id); break; case Twchar: p = (char*)emalloc(9+strlen(id)); strcpy(p, "wchar_t "); strcat(p, id); break; case Tshort: p = (char*)emalloc(7+strlen(id)); strcpy(p, "short "); strcat(p, id); break; case Tint : p = (char*)emalloc(5+strlen(id)); strcpy(p, "int "); strcat(p, id); break; case Tlong : p = (char*)emalloc(6+strlen(id)); strcpy(p, "long "); strcat(p, id); break; case Tllong : p = (char*)emalloc(8+strlen(id)); strcpy(p, "LONG64 "); strcat(p, id); break; case Tfloat: p = (char*)emalloc(7+strlen(id)); strcpy(p, "float "); strcat(p, id); break; case Tdouble: p = (char*)emalloc(8+strlen(id)); strcpy(p, "double "); strcat(p, id); break; case Tldouble: p = (char*)emalloc(13+strlen(id)); strcpy(p, "long double "); strcat(p, id); break; case Tuchar: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned char "); strcat(p, id); break; case Tushort: p = (char*)emalloc(16+strlen(id)); strcpy(p, "unsigned short "); strcat(p, id); break; case Tuint: p = (char*)emalloc(14+strlen(id)); strcpy(p, "unsigned int "); strcat(p, id); break; case Tulong: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned long "); strcat(p, id); break; case Tullong: p = (char*)emalloc(9+strlen(id)); strcpy(p, "ULONG64 "); strcat(p, id); break; case Ttime: p = (char*)emalloc(8+strlen(id)); strcpy(p, "time_t "); strcat(p, id); break; case Tstruct: p=(char*) emalloc((9+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); strcpy(p, "struct "); strcat(p, ident(typ->id->name)); strcat(p, " "); strcat(p, id); break; case Tclass: if (!typ->classed && !is_imported(typ)) { p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); strcpy(p, "class "); strcat(p, ident(typ->id->name)); typ->classed = True; } else { p=(char*) emalloc((2+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); strcpy(p, ident(typ->id->name)); } strcat(p, " "); strcat(p, id); break; case Tunion: p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); strcpy(p, "union "); strcat(p, ident(typ->id->name)); strcat(p, " "); strcat(p, id); break; case Tenum: if ((Table*)typ->ref == booltable) { p = (char*)emalloc((strlen(id)+6)*sizeof(char)); strcpy(p, "bool "); strcat(p, id); return p; } p=(char*) emalloc((7+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); strcpy(p, "enum "); strcat(p, ident(typ->id->name)); strcat(p, " "); strcat(p, id); break; case Tpointer: p = (char*)emalloc(strlen(id)+2); strcpy(p+1, id); p[0] = '*'; p = c_type_id((Tnode*)typ->ref, p); break; case Treference: p = (char*)emalloc(strlen(id)+2); strcpy(p+1, id); p[0] = '&'; p = c_type_id((Tnode*)typ->ref, p); break; case Tarray: temp = typ; while(((Tnode*) (typ->ref))->type==Tarray){ typ = (Tnode*)typ->ref; } p=(char*) emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) *sizeof(char)); strcpy(p, q); typ = temp; while(typ->type==Tarray){ if (((Tnode*) typ->ref)->width) { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width)); strcat(p,tempBuf); } typ = (Tnode*)typ->ref; } /*if(((Tnode*) (typ->ref))->type==Tarray){ sprintf(p,"%s [%d]",c_type((Tnode*)typ->ref),(typ->width / ((Tnode*) typ->ref)->width)); }else sprintf(p,"%s a[%d]",c_type((Tnode*)typ->ref),(typ->width /((Tnode*) typ->ref)->width));*/ break; case Tfun: if (strncmp(id, "operator ", 9)) q = c_type_id(((FNinfo*)typ->ref)->ret, id); else q = id; p = (char*)emalloc(1024); strcpy(p, q); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); break; case Ttemplate: if (typ->ref) { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) *sizeof(char)); strcpy(p, ident(typ->id->name)); strcat(p, "<"); strcat(p, q); strcat(p, " >"); strcat(p, id); break; } default: return "UnknownType"; } return p; } char * xsi_type_Tarray(Tnode *typ) { Tnode *t; int cardinality; char *p, *s; t = (Tnode*)typ->ref; if (is_fixedstring(typ)) { if (typ->sym) return ns_convert(typ->sym->name); return "xsd:string"; } cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ))) { if( t->type == Tarray) t = (Tnode*)t->ref; else t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality+3); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ","); strcat(p, "]"); } return p; } char * xsi_type_Darray(Tnode *typ) { Tnode *t; Entry *q; int cardinality; char *p, *s; if (!typ->ref) return ""; q = ((Table*)typ->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ))) { if (t->type == Tarray) t = (Tnode*)t->ref; else { q = ((Table*)t->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; } cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality*2+1); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ","); strcat(p, "]"); } return p; } void generate(Tnode *typ) { if (kflag && is_XML(typ)) { soap_traverse(typ); return; } if (is_transient(typ) || typ->type == Twchar || is_XML(typ) || is_void(typ)) return; if (lflag && typ->type == Tint && !typ->sym) { fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); fprintf(fhead,"\n#endif"); fprintf(fhead,"\n\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); fprintf(fhead,"\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); return; /* do not generate int serializers in libs */ } else if (is_imported(typ) && (typ->type != Tint || typ->sym)) return; if (is_typedef(typ) && is_element(typ)) fprintf(fhead,"\n\n/* %s is a typedef element/attribute synonym for %s */", c_ident(typ), t_ident(typ)); if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (!Qflag && is_external(typ) && namespaceid) { char *id = namespaceid; fprintf(fhead,"\n\n}"); fprintf(fout,"\n\n}"); namespaceid = NULL; fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); fprintf(fhead,"\n#endif"); namespaceid = id; } fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); fprintf(fhead,"\n#endif"); fflush(fhead); soap_default(typ); soap_serialize(typ); if (kflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead,"\n\nnamespace %s {", namespaceid); fprintf(fout,"\n\nnamespace %s {", namespaceid); } soap_put(typ); soap_get(typ); return; } switch(typ->type) { case Ttemplate: case Tenum: case Tpointer: case Tarray: case Tstruct: case Tclass: case Tunion: if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead,"\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL"); } if (!Qflag && is_external(typ) && namespaceid) { char *id = namespaceid; fprintf(fhead,"\n\n}"); fprintf(fout,"\n\n}"); namespaceid = NULL; fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); fprintf(fhead,"\n#endif"); namespaceid = id; } fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); fprintf(fhead,"\n#endif"); fflush(fhead); soap_default(typ); soap_serialize(typ); if (kflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead,"\n\nnamespace %s {", namespaceid); fprintf(fout,"\n\nnamespace %s {", namespaceid); } soap_put(typ); soap_get(typ); if (typ->type == Tstruct || typ->type == Tclass || typ->type == Ttemplate) soap_instantiate_class(typ); if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead,"\n\n#endif"); fprintf(fout,"\n\n#endif"); } break; default: break; } } void matlab_gen_sparseStruct(void) { fprintf(fmheader,"\nstruct soapSparseArray{\n"); fprintf(fmheader," int *ir;\n"); fprintf(fmheader," int *jc;\n"); fprintf(fmheader," double *pr;\n"); fprintf(fmheader," int num_columns;\n"); fprintf(fmheader," int num_rows;\n"); fprintf(fmheader," int nzmax;\n"); fprintf(fmheader,"};\n"); } void matlab_c_to_mx_sparse(void) { fprintf(fmheader,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); fprintf(fmatlab,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); fprintf(fmatlab,"{\n"); fprintf(fmatlab," mxArray *b;\n"); fprintf(fmatlab," b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); fprintf(fmatlab," mxSetIr(b,a.ir);\n"); fprintf(fmatlab," mxSetJc(b,a.jc);\n"); fprintf(fmatlab," mxSetPr(b,a.pr);\n"); fprintf(fmatlab," return b;\n"); fprintf(fmatlab,"}\n"); } void matlab_mx_to_c_sparse(void) { fprintf(fmheader,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); fprintf(fmatlab,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); fprintf(fmatlab,"{\n"); fprintf(fmatlab," if(!mxIsSparse(a))\n"); fprintf(fmatlab," {\n"); fprintf(fmatlab," mexErrMsgTxt(\"Input should be a sparse array.\");\n"); fprintf(fmatlab," }\n"); fprintf(fmatlab," /* Get the starting positions of the data in the sparse array. */ \n"); fprintf(fmatlab," b->pr = mxGetPr(a);\n"); fprintf(fmatlab," b->ir = mxGetIr(a);\n"); fprintf(fmatlab," b->jc = mxGetJc(a);\n"); fprintf(fmatlab," b->num_columns = mxGetN(a);\n"); fprintf(fmatlab," b->num_rows = mxGetM(a);\n"); fprintf(fmatlab," b->nzmax = mxGetNzmax(a);\n"); fprintf(fmatlab,"}\n"); } void matlab_mx_to_c_dynamicArray(Tnode* typ) { int d; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab,"{\n"); fprintf(fmatlab,"\tint i, numdims;\n"); fprintf(fmatlab,"\tconst int *dims;\n"); fprintf(fmatlab,"\tdouble *temp;\n"); fprintf(fmatlab,"\tint size = 1;\n"); fprintf(fmatlab,"\tint ret;\n"); fprintf(fmatlab,"\tnumdims = mxGetNumberOfDimensions(a);\n"); fprintf(fmatlab,"\tdims = mxGetDimensions(a);\n"); d = get_Darraydims(typ); fprintf(fmatlab,"\tif (numdims != %d)\n", d); fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); /* fprintf(fmatlab,"\tfor(i=0;i<numdims; i++) {\n"); fprintf(fmatlab,"\t b->__size[i] = dims[i];\n"); fprintf(fmatlab,"\t}\n"); */ if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab,"\ttemp = (double*)mxGetPr(a);\n"); fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); } fprintf(fmatlab,"\tfor (i = 0; i < numdims; i++) {\n"); fprintf(fmatlab,"\t\tif (b->__size[i] < dims[i])\n"); fprintf(fmatlab,"\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); fprintf(fmatlab,"\t\tsize *= dims[i];\n"); fprintf(fmatlab,"\t}\n"); if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab,"\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); } else { fprintf(fmatlab,"\tret = mxGetString(a, b->__ptr, size + 1);\n"); fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); } fprintf(fmatlab,"\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_dynamicArray(Tnode* typ) { int d,i; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab,"{\n"); fprintf(fmatlab,"\tmxArray *out;\n"); fprintf(fmatlab,"\t%s;\n",c_type_id((Tnode*)p->info.typ->ref,"*temp")); d = get_Darraydims(typ); fprintf(fmatlab,"\tint i;\n"); fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {", d, d); for (i = 0; i < d; i++) { if(i==0) fprintf(fmatlab,"a.__size[%d]",i); else fprintf(fmatlab,", a.__size[%d]",i); } fprintf(fmatlab,"};\n"); fprintf(fmatlab,"\tint size = "); for (i = 0; i < d; i++) { if(i==0) fprintf(fmatlab,"dims[%d]",i); else fprintf(fmatlab,"*dims[%d]",i); } fprintf(fmatlab,";\n"); if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID((Tnode*)p->info.typ->ref)); fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab,"\ttemp = (%s) mxGetPr(out);\n",c_type_id((Tnode*)p->info.typ->ref,"*")); fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab,"\t\t*temp++ = a.__ptr[i];\n"); } else { fprintf(fmatlab,"\tout = mxCreateString(a.__ptr);\n"); fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } fprintf(fmatlab,"\treturn out;\n}\n"); fflush(fmatlab); } char* get_mxClassID(Tnode* typ) { switch(typ->type) { case Tdouble: return "mxDOUBLE_CLASS"; case Tfloat: return "mxSINGLE_CLASS"; case Tshort: return "mxINT16_CLASS"; case Tushort: return "mxUINT16_CLASS"; case Tint: return "mxINT32_CLASS"; case Tuint: return "mxUINT32_CLASS"; case Tlong: return "mxINT32_CLASS"; case Tulong: return "mxUINT32_CLASS"; case Tllong: return "mxINT64_CLASS"; case Tullong: return "mxUINT64_CLASS"; case Tchar: return "mxCHAR_CLASS"; case Tuchar: return "mxCHAR_CLASS"; default: return ""; }; } /*Function not in use.*/ void matlab_array_c_to_mx(Tnode* typ) { Tnode* temp; int d,i; fprintf(fmatlab,"{\n\tint rows, r, cols, c;\n"); fprintf(fmatlab,"\tmxArray* out;\n"); fprintf(fmatlab,"\tdouble* temp;\n"); d = get_dimension(typ); fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {",d,d); temp=typ; for(i=0;i<d; i++) { if(i==0) fprintf(fmatlab,"%d",temp->width / ((Tnode*) temp->ref)->width); else fprintf(fmatlab,",%d",temp->width / ((Tnode*) temp->ref)->width); temp=(Tnode*)typ->ref; } fprintf(fmatlab,"};\n"); fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); fprintf(fmatlab,"\ttemp = (double *) mxGetPr(out);\n"); fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab,"\trows = mxGetM(out);\n"); fprintf(fmatlab,"\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); fprintf(fmatlab,"\tcols = mxGetN(out);\n"); fprintf(fmatlab,"\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); fprintf(fmatlab,"\tfor (c = 0; c < cols; c++)\n"); fprintf(fmatlab,"\t\tfor (r = 0; r < rows; r++)\n"); fprintf(fmatlab,"\t\t\t*temp++ = z->a[r][c];\n"); fprintf(fmatlab,"\treturn out;\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); fprintf(fmatlab,"{\n"); fprintf(fmatlab,"\tmxArray *fout;\n"); fprintf(fmatlab,"\tfout = c_to_mx_%s(*a);\n",c_ident((Tnode*)typ->ref)); fprintf(fmatlab,"\treturn fout;\n"); fprintf(fmatlab,"}\n"); } void matlab_mx_to_c_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*,%s);\n",c_ident(typ),c_type_id(typ, "*")); fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a,%s)\n",c_ident(typ),c_type_id(typ, "*b")); fprintf(fmatlab,"{\n\tmx_to_c_%s(a,*b);\n",c_ident((Tnode*)typ->ref)); fprintf(fmatlab,"\n}\n"); } void func2(Tnode* typ) { Table *table,*t; Entry *p; fprintf(fmatlab,"\tif(!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); table=(Table*)typ->ref; for (t = table; t != (Table *) 0; t = t->prev) { for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab,"\t{mxArray *tmp = mxGetField(a,0,\"%s\");\n",ident(p->sym->name)); fprintf(fmatlab,"\tif (!tmp) {\n"); fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); fprintf(fmatlab,"\tmx_to_c_%s(tmp,&(b->%s));}\n",c_ident(p->info.typ),ident(p->sym->name)); } } } } void matlab_mx_to_c_struct(Tnode* typ) { if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*")); fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); matlab_mx_to_c_dynamicArray(typ); return; } else if(strstr(c_type_id(typ, ""),"soapSparseArray")) { return; } fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*")); fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); fprintf(fmatlab,"{\n"); func2(typ); fprintf(fmatlab,"\n}\n"); return; } void matlab_c_to_mx_struct(Tnode* typ) { Table *table,*t; Entry *p; int number_of_fields=0; if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); matlab_c_to_mx_dynamicArray(typ); return; } else if(strstr(c_type_id(typ, ""),"soapSparseArray")) { return; } fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); table=(Table*)typ->ref; fprintf(fmatlab,"{\n\tconst char* fnames[] = {"); for (t = table; t != (Table *) 0; t = t->prev) { for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if(number_of_fields) fprintf(fmatlab,",\"%s\"",ident(p->sym->name)); else fprintf(fmatlab,"\"%s\"",ident(p->sym->name)); number_of_fields++; } } } fprintf(fmatlab,"}; /* pointers to member field names */\n"); fprintf(fmatlab,"\tint rows = 1, cols = 1;\n\tint index = 0;\n\tint number_of_fields = %d;\n\tmxArray *struct_array_ptr;\n",number_of_fields); fprintf(fmatlab,"\t/* Create a 1x1 struct matrix for output */\n"); fprintf(fmatlab,"\tstruct_array_ptr = mxCreateStructMatrix(rows, cols, number_of_fields, fnames);\n\tmexPrintf(\"6\");\n\tif(struct_array_ptr == NULL) {\n\t\tmexPrintf(\"COULDNT CREATE A MATRIX\");}\n\tmexPrintf(\"7\");\n"); for (t = table; t != (Table *) 0; t = t->prev) { for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab,"\t{mxArray *fout = c_to_mx_%s(a.%s);\n",c_ident(p->info.typ), ident(p->sym->name)); fprintf(fmatlab,"\tmxSetField(struct_array_ptr, index,\"%s\" , fout);}\n", ident(p->sym->name)); } } } fprintf(fmatlab,"\treturn struct_array_ptr;\n}\n"); return; } void matlab_c_to_mx_primitive(Tnode *typ) { fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);",c_ident(typ),c_type_id(typ, "")); fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); fprintf(fmatlab,"{\n\tmxArray *fout;\n"); if((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab,"\tchar buf[2];\n"); fprintf(fmatlab,"\tbuf[0] = a;\n"); fprintf(fmatlab,"\tbuf[1] = \'\\0\';\n"); fprintf(fmatlab,"\tfout = mxCreateString(buf);\n"); fprintf(fmatlab,"\tif (!fout)\n"); fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } else { fprintf(fmatlab,"\tint ndim = 1, dims[1] = {1};\n"); fprintf(fmatlab,"\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID(typ)); fprintf(fmatlab,"\t%s = (%s)mxGetPr(fout);\n",c_type_id(typ,"*temp"),c_type_id(typ,"*")); fprintf(fmatlab,"\tif (!fout)\n"); fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab,"\tif (!temp) \n"); fprintf(fmatlab,"\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab,"\t*temp++= a;\n"); } fprintf(fmatlab,"\treturn fout;\n}\n"); } void matlab_mx_to_c_primitive(Tnode *typ) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n",c_ident(typ),c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); if((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab,"{\n\tint ret;\n"); fprintf(fmatlab,"\tchar buf[2];\n"); fprintf(fmatlab,"\tret = mxGetString(a, buf, 2);\n"); fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); fprintf(fmatlab,"\t*b = buf[0];\n"); } else { fprintf(fmatlab,"{\n\tdouble* data = (double*)mxGetData(a);\n"); fprintf(fmatlab,"\t*b = (%s)*data;\n",c_type(typ)); } fprintf(fmatlab,"\n}\n"); } void matlab_out_generate(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) return; /* typeNO++; if (typeNO>=1024) execerror("Too many user-defined data types"); */ if(is_primitive(typ)) { matlab_c_to_mx_primitive(typ); matlab_mx_to_c_primitive(typ); return; } switch(typ->type) { case Tstruct: matlab_c_to_mx_struct(typ); matlab_mx_to_c_struct(typ); break; case Tpointer: matlab_c_to_mx_pointer(typ); matlab_mx_to_c_pointer(typ); break; case Tarray: break; default:break; } } /*his function is called first it first generates all routines and then in the second pass calls all routines to generate matlab_out for the table*/ void func1(Table *table, Entry *param) { Entry *q,*pout,*response=NULL; q=entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q=entry(classtable, param->sym); if (!is_response(pout->info.typ)) { response = get_response(param->info.typ); } fprintf(fmheader,"\n\toutside loop struct %s soap_tmp_%s;",param->sym->name,param->sym->name); if (!is_response(pout->info.typ) && response) { fprintf(fmheader,"\n\tif..inside loop struct %s *soap_tmp_%s;",c_ident(response->info.typ), c_ident(response->info.typ)); } fflush(fmheader); } void matlab_def_table(Table *table) { Entry *q,*pout,*e,*response=NULL; int i; Tnode *p; /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) if (q1->info.typ->type==Tfun) func1(table, q1); */ /* Sparse matrix code will be present by default */ matlab_gen_sparseStruct(); matlab_c_to_mx_sparse(); matlab_mx_to_c_sparse(); for(i=0;i<TYPES;i++) for(p=Tptr[i];p!=(Tnode*) 0;p=p->next) { /* This is generated for everything declared in the ".h" file. To make sure that it doesnt get generated for functions do a comparison with p->sym->name, so that its not generated for functions. */ if(is_XML(p)) continue; if(strstr(c_ident(p),"SOAP_ENV_") != NULL) continue; for(q = table->list; q != (Entry*) 0; q = q->next) { if(strcmp(c_ident(p),q->sym->name) == 0) break; e=entry(table, q->sym); if (e) pout = (Entry*)e->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } if (!is_response(pout->info.typ)) { response = get_response(q->info.typ); } if (!is_response(pout->info.typ) && response) { if(strcmp(c_ident(p),c_ident(response->info.typ)) == 0) break; } } if(q == (Entry*) 0) matlab_out_generate(p); } } void def_table(Table *table) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) { p->generated = True; generate(p); if (fflag) if (--partnum == 0) return; } } } } int no_of_var(Tnode *typ) { Entry *p; Table *t; int i=0; if(typ->type==Tstruct || typ->type==Tclass) { t=(Table*)typ->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if(p->info.typ->type==Tpointer) i++; } } if((((Tnode *)(typ->ref))->type==Tstruct) || (((Tnode *)(typ->ref))->type==Tclass) ) { t=(Table*)((Tnode*)(typ->ref))->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if(p->info.typ->type==Tpointer) i++; } } return i; } void in_defs(Table *table) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p) && !is_template(p)) { char *s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (is_string(p)) fprintf(fout,"\n\tcase %s:\n\t{\tchar **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else if (is_wstring(p)) fprintf(fout,"\n\tcase %s:\n\t{\twchar_t **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else fprintf(fout,"\n\tcase %s:\n\t\treturn soap_in_%s(soap, NULL, NULL, \"%s\");", soap_type(p), c_ident(p), s); } } } } void in_defs2(Table *table) { int i, j; Tnode *p; char *s; for (i = 0; i < TYPES; i++) { /* make sure (wrapper) classes are checked first */ if (i == 0) j = Tclass; else if (i == Tclass) continue; else j = i; for (p = Tptr[j]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout,"\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void in_defs3(Table *table) { int i; Tnode *p; char *s; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout,"\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void out_defs(Table *table) { int i; char *s; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) continue; if (is_element(p)) { s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p),c_ident(p),s,c_type_id((Tnode*)p->ref, "(*)")); else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, NULL);", soap_type(p), c_type_id(p, "*"),s); else if (is_string(p)) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)&ptr, NULL);", soap_type(p),s); else if (is_wstring(p)) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)&ptr, NULL);", soap_type(p),s); else if (p->type == Tpointer) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p),c_ident(p),s,c_type_id(p, "const*")); else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (const %s)ptr, NULL);", soap_type(p),c_ident(p),s,c_type_id(p, "*")); } else { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p),c_type_id((Tnode*)p->ref, "(*)"), s); else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)&ptr, \"%s\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)&ptr, \"%s\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p),c_type_id(p, "const*"), s); else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (const %s)ptr, \"%s\");", soap_type(p), c_ident(p),c_type_id(p, "*"), s); } } } } void mark_defs(Table *table) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id((Tnode*)p->ref, "(*)")); else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout,"\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id(p, "const*")); else if(p->type == Ttemplate && p->ref) fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id(p, "*")); else if(!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id(p, "*")); } } } void in_attach(Table *table) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_attachment(p)) { if (p->type == Tclass) fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_class_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL);\n\t\t\tif (a)\n\t\t\t{\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\t\ta->__size = soap->dime.size;\n\t\t\t\ta->id = (char*)soap->dime.id;\n\t\t\t\ta->type = (char*)soap->dime.type;\n\t\t\t\ta->options = (char*)soap->dime.options;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn soap->error;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); else fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), 0, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\ta->id = (char*)soap->dime.id;\n\t\t\ta->type = (char*)soap->dime.type;\n\t\t\ta->options = (char*)soap->dime.options;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } else if (is_binary(p) && !is_transient(p)) { if (p->type == Tclass) fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_class_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); else fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), 0, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } } } } void soap_instantiate_class(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; char *s; if (cflag) return; if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) if (is_typedef(typ) && !is_external(typ)) { fprintf(fhead, "\n\n#define soap_instantiate_%s soap_instantiate_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_copy_%s soap_copy_%s", c_ident(typ), t_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_type(typ), c_ident(typ)); fprintf(fhead, "\n\ninline %s * soap_new_%s(struct soap *soap, int n = -1) { return soap_instantiate_%s(soap, n, NULL, NULL, NULL); }", c_type(typ), c_ident(typ), c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(struct soap *soap", c_type(typ), c_ident(typ)); if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (Eptr->info.sto & (Stypedef | Sstatic)) continue; if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (flag) flag--; if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); } } } } fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap); "); else fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ)); } flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (Eptr->info.sto & (Stypedef | Sstatic)) continue; if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (flag) flag--; if (typ->type == Tclass) fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass) fprintf(fhead, "%d; ", derclass); else fprintf(fhead, "; "); } } } } fprintf(fhead, "} return _p; }"); fprintf(fhead, "\n\ninline %s * soap_new_set_%s(struct soap *soap", c_type(typ), c_ident(typ)); for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (Eptr->info.sto & (Stypedef | Sstatic)) continue; if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); } } } fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap); "); else fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ)); } for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (Eptr->info.sto & (Stypedef | Sstatic)) continue; if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (typ->type == Tclass) fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, "memcpy(_p->%s, %s, sizeof(%s))", ident(Eptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ)); else fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass) fprintf(fhead, "%d; ", derclass); else fprintf(fhead, "; "); } } } fprintf(fhead, "} return _p; }"); } fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); /* extern "C" causes C++ namespace linking issues */ /* fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */ fprintf(fhead,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_copy_%s(struct soap*, int, int, void*, size_t, const void*, size_t);", c_ident(typ)); /* fprintf(fhead,"\n#ifdef __cplusplus\n}\n#endif"); */ fprintf(fout,"\n\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size)", c_type(typ), c_ident(typ)); fprintf(fout,"\n{"); fprintf(fout,"\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_instantiate_%s(%%d, %%s, %%s)\\n\", n, type?type:\"\", arrayType?arrayType:\"\"));", c_ident(typ)); fprintf(fout,"\n\tstruct soap_clist *cp = soap_link(soap, NULL, %s, n, %s_fdelete);", soap_type(typ), prefix); fprintf(fout,"\n\tif (!cp)\n\t\treturn NULL;"); for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) { Tptr = ((Table *) Eptr->info.typ->ref); if(Tptr == ((Table *) typ->ref)){ continue; } derclass = 0; while(Tptr) { if(Tptr == (Table*)typ->ref){ derclass = 1; } Tptr = Tptr->prev; } if(derclass == 1 && !is_transient(Eptr->info.typ)){ if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) fprintf(fout,"\n\tif (arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); else fprintf(fout,"\n\tif (type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); fprintf(fout,"\n\t{\tcp->type = %s;", soap_type(Eptr->info.typ)); fprintf(fout,"\n\t\tif (n < 0)"); fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(Eptr->info.typ)); fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = sizeof(%s);", c_type(Eptr->info.typ)); if ((s = has_soapref(Eptr->info.typ))) fprintf(fout,"\n\t\t\t((%s*)cp->ptr)->%s = soap;", c_type(Eptr->info.typ), s); fprintf(fout,"\n\t\t}\n\t\telse"); fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(Eptr->info.typ)); fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = n * sizeof(%s);", c_type(Eptr->info.typ)); if (s) fprintf(fout,"\n\t\t\tif (cp->ptr)\n\t\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\t\t((%s*)cp->ptr)[i].%s = soap;", c_type(Eptr->info.typ), s); fprintf(fout,"\n\t\t}"); fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));"); fprintf(fout,"\n\t\tif (!cp->ptr)\n\t\t\tsoap->error = SOAP_EOM;"); fprintf(fout,"\n\t\treturn (%s*)cp->ptr;", c_type(Eptr->info.typ)); fprintf(fout,"\n\t}"); derclass = 0; } } fprintf(fout,"\n\tif (n < 0)"); fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(typ)); fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = sizeof(%s);", c_type(typ)); if ((s = has_soapref(typ))) fprintf(fout,"\n\t\t((%s*)cp->ptr)->%s = soap;", c_type(typ), s); fprintf(fout,"\n\t}\n\telse"); fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(typ)); fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = n * sizeof(%s);", c_type(typ)); if (s) fprintf(fout,"\n\t\tif (cp->ptr)\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\t((%s*)cp->ptr)[i].%s = soap;", c_type(typ), s); fprintf(fout,"\n\t}"); fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));"); fprintf(fout,"\n\tif (!cp->ptr)\n\t\tsoap->error = SOAP_EOM;"); fprintf(fout,"\n\treturn (%s*)cp->ptr;", c_type(typ)); fprintf(fout,"\n}"); /* fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */ fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_copy_%s(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n)", c_ident(typ)); fprintf(fout,"\n{\n\t(void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */"); fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copying %s %%p -> %%p\\n\", q, p));", c_type(typ)); fprintf(fout,"\n\t*(%s*)p = *(%s*)q;\n}", c_type(typ), c_type(typ)); /* fprintf(fout,"\n#ifdef __cplusplus\n}\n#endif"); */ } int get_dimension(Tnode *typ) { if (((Tnode*)typ->ref)->width) return typ->width / ((Tnode*) typ->ref)->width; return 0; } void soap_serialize(Tnode *typ) { int d; Table *table,*t; Entry *p; Tnode* temp; int cardinality; const char *self; if (is_primitive(typ)) return; if (is_typedef(typ) && is_element(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ)); else fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_typedef(typ) && !is_external(typ)) { if (is_imported(typ)) { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ)); return; } /* enabling this will not allow multi-ref detection of these typedef types else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_std__string(soap, a)\n", c_ident(typ)); return; } else if (typ->type != Tclass) { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ)); return; } */ } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF",c_ident(typ)); if (is_binary(typ)) { if (is_attachment(typ)) { fprintf(fout,"\n\tif (this->__ptr && !soap_array_reference(soap, this, (struct soap_array*)&this->__ptr, 1, %s))", soap_type(typ)); fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;"); } else fprintf(fout,"\n\tif (this->__ptr)\n\t\tsoap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n#endif\n}"); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, %d, %s))", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d); } else { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)"); } fprintf(fout,"\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external(p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) &&!is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout,"\n\t\t}\n#endif\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF",c_ident(typ),c_type_id(typ, "const*a")); if (is_binary(typ)) { if (is_attachment(typ)) { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;"); } else fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s);", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n#endif\n}"); fflush(fout); return; } else { fprintf(fout,"\n\tint i;"); d = get_Darraydims(typ); if (d) { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, %d, %s))", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); } else { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)"); } fprintf(fout,"\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout,"\n\t\t}\n#endif\n}"); fflush(fout); return; } } } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\t(void)soap; (void)a; /* appease -Wall -Werror */\n}",c_ident(typ),c_type_id(typ, "*a")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); return; } table=(Table*)typ->ref; if (!table) return; if (!is_typedef(typ)) { self = "this"; fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF", ident(typ->id->name)); } else { self = "p"; fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*p")); } fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); for (p = table->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout,"\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < %s->%s::%s; i++)\n\t\t{", self, ident(table->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_embedded(soap, %s->%s::%s + i, %s);", self, ident(table->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, %s->%s::%s + i);", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout,"\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout,"\n\tsoap_serialize_%s(soap, %s->%s::%s, &%s->%s::%s);", c_ident(p->next->info.typ), self, ident(table->sym->name), ident(p->sym->name), self, ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else if(p->info.typ->type==Tarray) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout,"\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); } } t = table->prev; if (t) fprintf(fout,"\n\t%s->%s::soap_serialize(soap);", self, ident(t->sym->name)); fprintf(fout,"\n#endif\n}"); break; } case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n#ifndef WITH_NOIDREF",c_ident(typ),c_type_id(typ, "*a")); /* DYNAMIC ARRAY */ fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); table=(Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout,"\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout,"\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout,"\n\tsoap_serialize_%s(soap, a->%s, &a->%s);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if(p->info.typ->type==Tarray) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout,"\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } } } fprintf(fout,"\n#endif\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, int choice, const %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type==Tarray) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); if (has_ptr(p->info.typ)) fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); if (has_ptr(p->info.typ)) fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); if (has_ptr(p->info.typ)) fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); break; case Tpointer: if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ),c_type_id(typ, "const*a")); p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout,"\n\tif (*a)"); else fprintf(fout,"\n\tif (*a)"); } else fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout,"\n\t\t(*a)->soap_serialize(soap);\n#endif\n}"); break; } else { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ),c_type_id(typ, "const*a")); if (is_string(typ) || is_wstring(typ)) fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type(typ)); else if (is_primitive((Tnode*)typ->ref)) fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type((Tnode*)typ->ref)); else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout,"\n\tif (*a)"); else fprintf(fout,"\n\tif (*a)"); fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref)); } else { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref)); } fprintf(fout,"\n#endif\n}"); break; } case Tarray: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ),c_type_id(typ, "const a")); if (is_primitive((Tnode*)typ->ref)) fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); else { fprintf(fout,"\n\tint i;"); fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ)); temp=(Tnode*)typ->ref;; cardinality = 1; while(temp->type==Tarray) { temp=(Tnode*)temp->ref; cardinality++; } fprintf(fout,"\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout,"\tsoap_embedded(soap, a"); if(cardinality > 1) fprintf(fout,"[i]"); else fprintf(fout,"+i"); fprintf(fout,", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout,"\n\ta[i].soap_serialize(soap)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout,"\n\tsoap_serialize_%s(soap, a",c_ident((Tnode*)typ->ref)); if(cardinality > 1){ fprintf(fout,"[i])"); }else { fprintf(fout,"+i)"); } } fprintf(fout,";\n\t}"); } fprintf(fout,"\n#endif\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n#ifndef WITH_NOIDREF",c_ident(typ),c_type_id(typ, "*a")); if (!is_primitive(temp) && !is_XML(temp) && temp->type != Tfun && !is_void(temp)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout,"\n\t\t(*i).soap_serialize(soap);"); else fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); } fprintf(fout, "\n#endif\n}"); default: break; } } void soap_default(Tnode* typ) { int i, d; Table *table,*t; Entry *p; Tnode *temp; char *s; int cardinality; if (typ->type == Tpointer && !is_string(typ)) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) { if (is_typedef(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_std__string(soap, a)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_%s(soap, a)\n", c_ident(typ), t_ident(typ)); return; } } p = is_dynamic_array(typ); if (p) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); if ((s = has_soapref(typ))) fprintf(fout,"\n\tthis->%s = soap;", s); else fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); d = get_Darraydims(typ); if (d) { fprintf(fout,"\n\tthis->%s = NULL;", ident(p->sym->name)); for (i = 0; i < d; i++) { fprintf(fout,"\n\tthis->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); } } else { fprintf(fout,"\n\tthis->__size = 0;\n\tthis->%s = NULL;", ident(p->sym->name)); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout,"\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); fprintf(fout,"\n}"); } else { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\t(void)soap;", c_ident(typ),c_type_id(typ, "*a")); if ((s = has_soapref(typ))) fprintf(fout,"\n\ta->%s = soap;", s); else fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); d = get_Darraydims(typ); if (d) { fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name)); for (i = 0; i < d; i++) { fprintf(fout,"\n\ta->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset[%d] = 0;", i); } } else { fprintf(fout,"\n\ta->__size = 0;\n\ta->%s = NULL;", ident(p->sym->name)); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout,"\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); fprintf(fout,"\n}"); } fflush(fout); return; } if (is_primitive(typ) || is_string(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}",c_ident(typ),c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); return; } if (is_fixedstring(typ)) { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);",c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, char a[])\n{\n\t(void)soap; /* appease -Wall -Werror */\n\ta[0] = '\\0';\n}",c_ident(typ)); return; } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tp->erase();\n}",c_ident(typ),c_type_id(typ, "*p")); return; } switch(typ->type) { case Tclass: /* CLASS */ if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); if ((s = has_soapref(typ))) fprintf(fout,"\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fflush(fout); if (table) { t = table->prev; if (t) fprintf(fout,"\n\tthis->%s::soap_default(soap);", ident(t->sym->name)); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\tthis->%s::%s = 0;\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name), ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout,"\n\tstrcpy(this->%s::%s, \"%s\");", ident(table->sym->name), ident(p->sym->name), cstring(p->info.val.s)); else fprintf(fout,"\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tarray){ fprintf(fout,"\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout,"\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tstatic std::string soap_tmp_%s(\"%s\");\n\tthis->%s::%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(table->sym->name), ident(p->sym->name), ident(p->sym->name)); else fprintf(fout,"\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); } else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ))) fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); else if (p->info.sto & (Sprivate | Sprotected)) { if (p->info.typ->type == Tpointer) fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); else if (p->info.typ->type >= Tchar && p->info.typ->type < Tenum) fprintf(fout,"\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tenum) fprintf(fout,"\n\tthis->%s::%s = (%s)0;", ident(table->sym->name), ident(p->sym->name), c_type(p->info.typ)); else fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); } else fprintf(fout,"\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); } } } fprintf(fout,"\n}"); fflush(fout); break; } case Tstruct: table=(Table*)typ->ref; if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "*a")); fflush(fout); if ((s = has_soapref(typ))) fprintf(fout,"\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); if (table) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (p->info.sto & (Sprivate | Sprotected)) fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\ta->%s = 0;", ident(p->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout,"\n\tstrcpy(a->%s, \"%s\");", ident(p->sym->name), cstring(p->info.val.s)); else fprintf(fout,"\n\ta->%s[0] = '\\0';", ident(p->sym->name)); } else if (p->info.typ->type==Tarray) fprintf(fout,"\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout,"\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tstatic std::string soap_tmp_%s(\"%s\");\n\ta->%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(p->sym->name), ident(p->sym->name)); else fprintf(fout,"\n\ta->%s%s;", ident(p->sym->name), c_init(p)); } else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ))) fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name)); else fprintf(fout,"\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } } } } fprintf(fout,"\n}"); fflush(fout); break; case Tarray: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ)); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "a")); fprintf(fout,"\n\tint i;"); fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout,"\n\tfor (i = 0; i < %d; i++)",get_dimension(typ)); temp = (Tnode*)typ->ref; cardinality = 1; while(temp->type==Tarray) { temp=(Tnode*)temp->ref; cardinality++; } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout,"a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); else fprintf(fout,"(a+i)->soap_default(soap)"); } else if (((Tnode*)typ->ref)->type == Tpointer) fprintf(fout,"\n\ta[i] = NULL"); else { fprintf(fout,"\n\tsoap_default_%s(soap, a",c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout,"[i])"); else fprintf(fout,"+i)"); } fprintf(fout,";\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{",c_ident(typ),c_type_id(typ, "*p")); fprintf(fout,"\n\tp->clear();"); fprintf(fout,"\n}"); fflush(fout); break; default :break; } } void soap_traverse(Tnode* typ) { int d; Table *table,*t; Entry *p; Tnode* temp; int cardinality; if (is_primitive_or_string(typ) || is_fixedstring(typ)) { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\t(void)soap; (void)q; /* appease -Wall -Werror */",c_ident(typ),c_type_id(typ, "*a")); fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); return; } if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) if (is_typedef(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n",c_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_std__string(soap, a, s, p, q)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if (is_XML(typ)) { fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ)); if (is_binary(typ)) { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); } fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout,"\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, %d, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d); } else { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)"); } fprintf(fout,"\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, this->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), ident(p->sym->name)); fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t}\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ),c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); } fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout,"\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { fprintf(fout,"\n\tint i;"); d = get_Darraydims(typ); if (d) { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, %d, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); } else { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)"); } fprintf(fout,"\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), p->sym->name); fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\t}\n}"); fflush(fout); return; } } } switch(typ->type) { case Tclass: if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout,"\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout,"\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < this->%s::%s; i++)\n\t\t{", ident(t->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_embedded(soap, this->%s::%s + i, %s);", ident(t->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tthis->%s::%s[i].soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); else fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, this->%s::%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); fprintf(fout,"\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout,"\n\tsoap_traverse_%s(soap, this->%s::%s, &this->%s::%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if(p->info.typ->type==Tarray) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tsoap_traverse_%s(soap, this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tsoap_traverse_%s(soap, &this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } } } fprintf(fout,"\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n}"); break; } case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ),c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); table=(Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); else fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), p->next->sym->name); fprintf(fout,"\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout,"\n\tsoap_traverse_%s(soap, a->%s, &a->%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if(p->info.typ->type==Tarray) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } } } fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, int choice, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type==Tarray) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); if (has_ptr(p->info.typ)) fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\t\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); if (has_ptr(p->info.typ)) fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); if (has_ptr(p->info.typ)) fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout,"\n\t\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}"); fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n}"); break; case Tpointer: if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ),c_type_id(typ, "*a")); p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout,"\n\tif (*a)"); else fprintf(fout,"\n\tif (*a)"); } else fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout,"\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); break; } else { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ),c_type_id(typ, "*a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); fprintf(fout,"\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type(typ->ref), c_type(typ->ref)); fprintf(fout,"\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type(typ->ref), c_type(typ->ref)); } else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout,"\n\tif (*a)"); else fprintf(fout,"\n\tif (*a)"); fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } else { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } break; } case Tarray: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type(typ)); fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)", c_ident(typ),c_type_id(typ, "a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n{"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } else { fprintf(fout,"\n{\tint i;"); fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ)); temp=(Tnode*)typ->ref;; cardinality = 1; while(temp->type==Tarray) { temp=(Tnode*)temp->ref; cardinality++; } fprintf(fout,"\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout,"\tsoap_embedded(soap, a"); if(cardinality > 1) fprintf(fout,"[i]"); else fprintf(fout,"+i"); fprintf(fout,", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout,"\n\ta[i].soap_traverse(soap, s, p, q)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout,"\n\tsoap_traverse_%s(soap, a",c_ident((Tnode*)typ->ref)); if(cardinality > 1) fprintf(fout,"[i], s, p, q)"); else fprintf(fout,"+i, s, p, q)"); } fprintf(fout,";\n\t}"); } fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout,"\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ),c_type_id(typ, "*a")); if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout,"\n\t\t(*i).soap_traverse(soap, s, p, q);"); else fprintf(fout,"\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } fprintf(fout, "\n}"); default: break; } } void soap_put(Tnode *typ) { int d; Entry *p; char *ci = c_ident(typ); char *ct = c_type(typ); char *ctp = c_type_id(typ, "*"); char *ctpa = c_type_id(typ, "*a"); char *ctc = c_type_id(typ, "const"); char *ctca = c_type_id(typ, "const a"); char *ctcp = c_type_id(typ, "const*"); char *ctcpa = c_type_id(typ, "const*a"); if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && is_element(typ)) { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctc); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctca); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout,"\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); else if (typ->type == Tpointer) { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctcp); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctcpa); } else { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci,ctp); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, const %s, const char *tag, const char *type)\n{", ci,ctpa); } fflush(fout); fprintf(fout,"\n\tregister int id = "); if (is_invisible(typ->id->name)) fprintf(fout,"0;"); else if ((p = is_dynamic_array(typ)) != NULL) { d = get_Darraydims(typ); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { if (d) fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ)); else fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ)); } else if (d) fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ)); else fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ)); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout,"soap_embed(soap, (void*)this, NULL, 0, tag, %s);", soap_type(typ)); else fprintf(fout,"soap_embed(soap, (void*)a, NULL, 0, tag, %s);", soap_type(typ)); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout,"\n\tif (this->soap_out(soap, tag?tag:\"%s\", id, type))\n\t\treturn soap->error;", xml_tag(typ)); else fprintf(fout,"\n\tif (soap_out_%s(soap, tag?tag:\"%s\", id, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); if (!is_invisible(typ->id->name)) fprintf(fout,"\n\treturn soap_putindependent(soap);\n}"); else fprintf(fout,"\n\treturn SOAP_OK;\n}"); #if 0 /* some compilers cannot handle this inlined function */ if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (p->soap_put(soap, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), xml_tag(typ)); else if (typ->type != Treference) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (soap_begin_send(soap) || soap_put_%s(soap, p, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), xml_tag(typ)); #endif if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || ((data)->soap_serialize(soap),0) || (data)->soap_put(soap, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), xml_tag(typ)); else if (is_primitive(typ)) { if ((!is_external(typ) || Qflag) && namespaceid) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (%s::soap_serialize_%s(soap, data),0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data),0) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); } else if (typ->type != Treference) { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (%s::soap_serialize_%s(soap, data),0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data),0) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); } fflush(fout); } Entry * is_dynamic_array(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && (p->next->info.typ->type == Tint || p->next->info.typ->type == Tulong || (p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint || ((Tnode*)p->next->info.typ->ref)->type == Tuint))) && !strcmp(ident(p->next->sym->name), "__size")) return p; } } return 0; } Entry * is_discriminant(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { t = (Table*)typ->ref; /* only if this struct/class has a union and is not derived */ if (t && !t->prev) { p = t->list; if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) if (p->next && p->next->info.typ->type == Tunion) { Entry *q; for (q = p->next->next; q; q = q->next) { if (q->info.typ->type != Tfun && !is_void(q->info.typ) && !is_transient(q->info.typ)) return NULL; } return p; } } } return NULL; } int get_Darraydims(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint || ((Tnode*)p->next->info.typ->ref)->type == Tuint) && !strcmp(ident(p->next->sym->name), "__size")) return get_dimension(p->next->info.typ); } } return 0; } int has_offset(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) return 1; } } } return 0; } int is_boolean(Tnode *typ) { if (typ->type == Tenum) { if ((Table*)typ->ref == booltable) return 1; else { size_t n = strlen(ident(typ->id->name)); return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); } } return 0; } int is_hexBinary(Tnode *typ) { Entry *p; Table *t; size_t n = strlen(ident(typ->id->name)); if ((typ->type == Tstruct || typ->type == Tclass) && n >= 9 && is_eq(ident(typ->id->name) + n - 9, "hexBinary")) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) { p = p->next; return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size"); } } } return 0; } int is_binary(Tnode *typ) { Entry *p; Table *t; if (!has_ns(typ) && !is_element(typ)) return 0; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) { p = p->next; return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size"); } } } return 0; } int is_attachment(Tnode *typ) { Entry *p; Table *t; if (!is_binary(typ) || is_transient(typ)) return 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) { p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) break; p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) break; return 1; } } } return 0; } int has_attachment(Tnode *typ) { if (is_attachment(typ)) return 1; if (typ->type == Tstruct || typ->type == Tclass) { Entry *p; Table *t; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (has_attachment(p->info.typ)) return 1; } } return 0; } int is_mutable(Tnode *typ) { return is_header_or_fault(typ); } int is_header_or_fault(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_header_or_fault((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && (!strcmp(ident(typ->id->name), "SOAP_ENV__Header") || !strcmp(ident(typ->id->name), "SOAP_ENV__Fault") || !strcmp(ident(typ->id->name), "SOAP_ENV__Code") || !strcmp(ident(typ->id->name), "SOAP_ENV__Detail") || !strcmp(ident(typ->id->name), "SOAP_ENV__Reason")); } int is_body(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_body((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); } long minlen(Tnode *typ) { if (typ->minLength < 0 || (typ->maxLength >> 31) != 0) return 0; return (long)typ->minLength; } long maxlen(Tnode *typ) { if (typ->maxLength < 0 || (typ->maxLength >> 31) != 0) return -1; return (long)typ->maxLength; } int is_soap12(const char *enc) { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); } int is_document(const char *style) { return vflag < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); } int is_literal(const char *encoding) { return vflag < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); } char * has_soapref(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tstruct && ((Tnode*)p->info.typ->ref)->id == lookup("soap")) return ident(p->sym->name); } } return NULL; } int has_constructor(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (!q) return 1; } return 0; } int has_destructor(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && *p->sym->name == '~') return 1; return 0; } int has_getter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } return 0; } int has_setter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } return 0; } int is_primitive_or_string(Tnode *typ) { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); } int is_primitive(Tnode *typ) { return typ->type <= Tenum; } int is_string(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; } int is_fixedstring(Tnode *typ) { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; } int is_wstring(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar && !((Tnode*)typ->ref)->sym; } int is_stdstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::string"); } int is_stdwstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::wstring"); } int is_stdstr(Tnode *typ) { if (typ->type == Tpointer) return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); return is_stdstring(typ) || is_stdwstring(typ); } int is_typedef(Tnode *typ) { return typ->sym && !is_transient(typ); } int reflevel(Tnode *typ) { int level; for (level = 0; typ->type == Tpointer; level++) typ = (Tnode*)typ->ref; return level; } Tnode * reftype(Tnode *typ) { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference) typ = (Tnode*)typ->ref; return typ; } void soap_set_attr(Entry *p, char *obj, char *name, char *tag) { Tnode *typ = p->info.typ; int flag = (p->info.minOccurs == 0); if (is_external(typ) && !is_anyAttribute(typ)) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_qname(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s), 1);", obj, name, tag, obj, name); else if (is_string(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", %s->%s, 1);", obj, name, tag, obj, name); else if (is_wstring(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s), 2);", obj, name, tag, obj, name); else if (is_stdqname(typ)) fprintf(fout, "\n\tif (!%s->%s.empty())\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s.c_str()), 1);", obj, name, tag, obj, name); else if (is_stdstring(typ)) { if (flag) fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", %s->%s.c_str(), 1);", tag, obj, name); } else if (is_stdwstring(typ)) { if (flag) fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s.c_str()), 2);", tag, obj, name); } else if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_type(typ), obj, name); else if (typ->type == Tenum) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (typ->type == Tpointer) { Tnode *ptr = (Tnode*)typ->ref; fprintf(fout, "\n\tif (%s->%s)", obj, name); if (is_external(ptr) && !is_anyAttribute(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_qname(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, *%s->%s), 1);", obj, name, tag, obj, name); else if (is_string(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", *%s->%s, 1);", obj, name, tag, obj, name); else if (ptr->type == Tllong || ptr->type == Tullong) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_type(ptr), obj, name); else if (ptr->type == Tenum) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_stdqname(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s->c_str()), 1);", tag, obj, name); else if (is_stdstring(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", %s->%s->c_str(), 1);", tag, obj, name); else if (is_stdwstring(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s->c_str()), 2);", tag, obj, name); else if (is_primitive(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, the_type(ptr), obj, name); else if (is_hexBinary(ptr)) fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_binary(ptr)) fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"%s\", -1, %s->%s, \"%s\"))\n\t\t\treturn soap->error;", c_ident(ptr), tag, obj, name, xsi_type_u(ptr)); else { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } } else if (is_primitive(typ)) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, the_type(typ), obj, name); else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_binary(typ)) fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, \"%s\", -1, &%s->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(typ), tag, obj, name, xsi_type_u(typ)); else { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } } void soap_attr_value(Entry *p, char *obj, char *name, char *tag) { int flag = 0; Tnode *typ = p->info.typ; if (p->info.maxOccurs == 0) flag = 2; /* prohibited */ else if (p->info.minOccurs >= 1 && !p->info.hasval) flag = 1; /* required */ if (is_external(typ) && !is_anyAttribute(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); else if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_type(typ), tag, flag, obj, name); else if (typ->type == Tenum) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); else if (is_qname(typ)) fprintf(fout, "\n\tif (soap_s2QName(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_string(typ)) fprintf(fout, "\n\tif (soap_s2string(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_wstring(typ)) fprintf(fout, "\n\tif (soap_s2wchar(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdqname(typ)) fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{\tchar *s;\n\t\t\tif (soap_s2QName(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\t%s->%s.assign(s);\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}", tag, flag, minlen(typ), maxlen(typ), obj, name); else if (is_stdstring(typ)) fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{\tchar *s;\n\t\t\tif (soap_s2string(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\t%s->%s.assign(s);\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}", tag, flag, minlen(typ), maxlen(typ), obj, name); else if (is_stdwstring(typ)) fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{\twchar_t *s;\n\t\t\tif (soap_s2wchar(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\t%s->%s.assign(s);\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}", tag, flag, minlen(typ), maxlen(typ), obj, name); else if (typ->type == Tpointer) { Tnode *ptr = (Tnode*)typ->ref; if (!is_anyAttribute(ptr)) fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{", tag, flag); if (!is_stdstring(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_type(typ), c_type(ptr)); if (is_external(ptr) && !is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name); else if (ptr->type == Tllong || ptr->type == Tullong) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_type(ptr), obj, name); else if (ptr->type == Tenum) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_ident(ptr), obj, name); else if (is_qname(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2QName(soap, t, %s->%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, minlen(ptr), maxlen(ptr)); else if (is_string(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2string(soap, t, %s->%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, minlen(ptr), maxlen(ptr)); else if (is_stdqname(ptr)) fprintf(fout, "\n\t\t\tchar *s = NULL;\n\t\t\tif (soap_s2QName(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\tif (s)\n\t\t\t{\t%s->%s = soap_new_std__string(soap, -1);\n\t\t\t\t%s->%s->assign(s);\n\t\t\t}", minlen(ptr), maxlen(ptr), obj, name, obj, name); else if (is_stdstring(ptr)) fprintf(fout, "\n\t\t\tchar *s = NULL;\n\t\t\tif (soap_s2string(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\tif (s)\n\t\t\t{\t%s->%s = soap_new_std__string(soap, -1);\n\t\t\t\t%s->%s->assign(s);\n\t\t\t}", minlen(ptr), maxlen(ptr), obj, name, obj, name); else if (is_stdwstring(ptr)) fprintf(fout, "\n\t\t\twchar_t *s = NULL;\n\t\t\tif (soap_s2wchar(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\tif (s)\n\t\t\t{\t%s->%s = soap_new_std__wstring(soap, -1);\n\t\t\t\t%s->%s->assign(s);\n\t\t\t}", minlen(ptr), maxlen(ptr), obj, name, obj, name); else if (is_hexBinary(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_hex2s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_binary(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_base642s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\t%s->%s = soap_in_%s(soap, \"%s\", %s->%s, \"%s\");", obj, name, c_ident(ptr), tag, obj, name, xsi_type(ptr)); else fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", the_type(ptr), obj, name); if (!is_anyAttribute(ptr)) fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); } else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_hex2s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_binary(typ)) fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_base642s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); else if (is_primitive(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", the_type(typ), tag, flag, obj, name); if (typ->type == Tpointer) { if (!is_string(typ) && !is_wstring(typ) && !is_stdstr(typ->ref)) { Tnode *ptr = (Tnode*)typ->ref; if (ptr->type <= Tenum) { if (ptr->minLength != MINLONG64 && (ptr->minLength > 0 || ptr->type < Tuchar || ptr->type > Tullong)) fprintf(fout,"\n\tif (%s->%s && *%s->%s < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->minLength); if (ptr->maxLength != MAXLONG64) fprintf(fout,"\n\tif (%s->%s && *%s->%s > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->maxLength); } } } else if (typ->type <= Tenum) { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong)) fprintf(fout,"\n\tif (%s->%s < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->minLength); if (typ->maxLength != MAXLONG64) fprintf(fout,"\n\tif (%s->%s > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->maxLength); } } char * ptr_cast(Table *t, char *name) { char *s = emalloc(strlen(t->sym->name) + strlen(name) + 6); sprintf(s, "((%s*)%s)", t->sym->name, name); return s; } void soap_out(Tnode *typ) { Table *table,*t; Entry *p = NULL; int cardinality,i,j,d; Tnode *n; char *nse = ns_qualifiedElement(typ); char *nsa = ns_qualifiedAttribute(typ); if (is_dynamic_array(typ)) { soap_out_Darray(typ); return; } if (is_external(typ)) fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); if (is_typedef(typ) && is_element(typ) && !is_external(typ)) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_primitive(typ) && typ->type != Tenum) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{\t(void)soap; (void)type; (void)tag; (void)id;", c_ident(typ), c_type_id(typ, "*a")); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); else fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); return; } if (is_fixedstring(typ)) { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const char a[], const char *type)\n{", c_ident(typ)); fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, (char*const*)&a, type, %s);\n}", soap_type(typ)); return; } if (is_string(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, char *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, wchar_t *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout,"\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tconst char *t = s->c_str();\n\treturn soap_outliteral(soap, tag, (char*const*)&t, type);\n}", c_ident(typ)); else fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tconst wchar_t *t = s->c_str();\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&t, type);\n}", c_ident(typ)); else fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_wstring_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } switch(typ->type) { case Tstruct: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "*a")); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p)) p = p->next; else if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); else if (is_qname(p->info.typ)) fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout,"\n\t(void)soap; (void)tag; (void)id; (void)type;"); if (is_primclass(typ)) { for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; if (p && is_item(p)) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if(p->info.typ->type==Tarray) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout,"\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); else if (is_qname(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout,"\n\treturn SOAP_OK;"); fprintf(fout,"\n}"); } else { if (!is_invisible(typ->id->name)) fprintf(fout,"\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); fflush(fout); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sreturn) { if (nse || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); else fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)", ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tif (a->%s[i].soap_out(soap, \"%s\", -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse),xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_outliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_outwliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, a->%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); fprintf(fout,"\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s, tag, -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s, \"%s\", -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout,"\n\tif (soap_out_%s(soap, a->%s, &a->%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (p->info.typ->type==Tarray) fprintf(fout,"\n\tsoap_out_%s(soap, %s, -1, a->%s, \"%s\");", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout,"\n\tif (a->%s.soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), field(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_qname(p->info.typ)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout,"\n\tsoap_outliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout,"\n\tif (a->%s)\n\t{\tif (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\t\treturn soap->error;\n\t}\n\telse if (soap_element_nil(soap, %s))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name)), field(p, nse)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } if (!is_invisible(typ->id->name)) fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout,"\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tclass: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); return; } table=(Table*)typ->ref; if (!is_volatile(typ) && !is_typedef(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); fprintf(fout,"\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if (has_setter(typ)) fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) { if (is_repetition(p)) p = p->next; else if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); else if (is_qname(p->info.typ)) fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } if (is_primclass(typ)) { for (t = table; t; t = t->prev) { p = t->list; if (p && is_item(p)) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (table->prev) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if(p->info.typ->type==Tarray) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout,"\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_qname(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &(a->%s::%s), \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else fprintf(fout,"\n\treturn SOAP_OK;"); } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name)); else if(p->info.typ->type==Tarray) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout,"\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_qname(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout,"\n\treturn SOAP_OK;"); } fprintf(fout,"\n}"); } else { if (!is_invisible(typ->id->name)) { if (table && table->prev) fprintf(fout,"\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s\"))\n\t\treturn soap->error;", soap_type(typ), xsi_type(typ)); else fprintf(fout,"\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); } fflush(fout); i=0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* Call routines to output the member data of the class */ /* Data members of the Base Classes are outputed first followed by the data members of the Derived classes. Overridden data members are output twice once for the base class they are defined in and once for the derived class that overwrites them */ for (; i > 0; i--) { Entry *e; char *nse1; t = table; for (j = 0; j< i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.sto & Sreturn) { if (nse1 || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); else fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (is_item(p)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout,"\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tif (a->%s::%s[i].soap_out(soap, %s, -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p->next, nse1),xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_outliteral(soap, %s, a->%s::%s + i, NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\tsoap_outwliteral(soap, %s, a->%s::%s + i, NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\tif (soap_out_%s(soap, %s, -1, a->%s::%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); fprintf(fout,"\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s::%s, tag, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s::%s, %s, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout,"\n\tif (soap_out_%s(soap, a->%s::%s, &a->%s::%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (p->info.typ->type==Tarray) fprintf(fout,"\n\tsoap_out_%s(soap, %s, -1, a->%s::%s, \"%s\");", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout,"\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1),xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_qname(p->info.typ)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout,"\n\tsoap_outliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout,"\n\tif (a->%s::%s)\n\t{\tif (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\t\treturn soap->error;\n\t}\n\telse if (soap_element_nil(soap, %s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name)), field_overridden(t, p, nse1)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &(a->%s::%s), \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); fflush(fout); } } if (!is_invisible(typ->id->name)) fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout,"\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tunion: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; fprintf(fout, "\n\tswitch (choice)\n\t{"); for (p = table->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); fprintf(fout, "\n\t\treturn a->%s.soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), ns_add(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); fprintf(fout,"\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); fprintf(fout,"\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)&soap_tmp_%s, \"%s\");\n\t}", c_ident(p->info.typ),ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); fprintf(fout,"\n\t\treturn soap_outliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); fprintf(fout,"\n\t\treturn soap_outwliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); fprintf(fout,"\n\t\treturn soap_out_%s(soap, \"%s\", -1, &a->%s, \"%s\");", c_ident(p->info.typ),ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); fflush(fout); break; case Tpointer: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ),c_type_id(typ, "const*")); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ),c_type_id(typ, "const*")); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "const*a")); if (is_template(typ)) { fprintf(fout,"\n\tif (!*a)"); fprintf(fout,"\n\t\treturn soap_element_null(soap, tag, id, type);"); fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } else { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->%s, %d, type, %s);", ident(p->sym->name), d, soap_type((Tnode*)typ->ref)); else fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->%s, 1, type, %s);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s);", soap_type((Tnode*)typ->ref)); fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) fprintf(fout,"\n\treturn (*a)->soap_out(soap, tag, id, type);"); else fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);",c_ident((Tnode*)typ->ref)); } fprintf(fout,"\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ),c_type_id(typ, "const")); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ),c_type_id(typ, "const")); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "const a")); fprintf(fout,"\n\tint i;"); fprintf(fout,"\n\tsoap_array_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s[%d]\", 0);", soap_type(typ), xsi_type_Tarray(typ), get_dimension(typ)); n=(Tnode*)typ->ref; cardinality = 1; while(n->type==Tarray) { n=(Tnode*)n->ref; cardinality++; } fprintf(fout,"\n\tfor (i = 0; i < %d; i++)\n\t{",get_dimension(typ)); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if(cardinality>1) fprintf(fout,"\n\t\ta[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout,"\n\t\t(a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } else { if(((Tnode *)typ->ref)->type != Tarray) { if(((Tnode *)typ->ref)->type == Tpointer) fprintf(fout,"\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); else fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref)); } else fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref)); if(cardinality>1) fprintf(fout,"[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout,"+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } if(((Tnode *)typ->ref)->type == Tpointer) fprintf(fout,";\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout,";\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Tenum: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) fprintf(fout, "\t{ (long)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name)); } fprintf(fout, "\t{ 0, NULL }\n"); fprintf(fout, "};"); } fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); if (is_typedef(typ)) fprintf(fout, "\n{\treturn soap_%s2s(soap, n);\n}", t_ident(typ)); else if (is_boolean(typ)) fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\nreturn soap_code_str(soap_codes_%s, n!=0);\n}", c_ident(typ)); else if (!is_mask(typ)) { fprintf(fout, "\n{\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); fprintf(fout, "\n\tif (s)\n\t\treturn s;"); fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); fprintf(fout, "\n}"); } else fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n{\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); n = typ->ref; if (!n) return; fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "*a")); fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); if (n->type==Tarray) fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout,"\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); else if (is_qname(n)) fprintf(fout,"\n\t\tconst char *soap_tmp = soap_QName2s(soap, *i);\n\t\tif (soap_out_%s(soap, tag, id, (char*const*)&soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_stdqname(n)) fprintf(fout,"\n\t\tstd::string soap_tmp(soap_QName2s(soap, (*i).c_str()));\n\t\tif (soap_out_%s(soap, tag, id, &soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_XML(n) && is_string(n)) fprintf(fout,"\n\t\tif (soap_outliteral(soap, tag, &(*i), NULL))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout,"\n\t\tif (soap_outwliteral(soap, tag, &(*i), NULL))"); else if (n->type == Tenum && (Table*)n->ref == booltable) fprintf(fout,"\n\t\tbool b = (*i);\n\t\tif (soap_out_%s(soap, tag, id, &b, \"%s\"))", c_ident(n), xsi_type_u(typ)); else fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); fprintf(fout, "\n\t\t\treturn soap->error;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); break; default: break; } } void soap_out_Darray(Tnode *typ) { int i, j, d = 0; Table *t, *table; Entry *p; char *nse = ns_qualifiedElement(typ); char *nsa = ns_qualifiedAttribute(typ); char *item; table=(Table*)typ->ref; fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); if (is_external(typ)) return; if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); fprintf(fout,"\n{\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); if (!is_binary(typ)) { d = get_Darraydims(typ); if (d) fprintf(fout,"\n\tint i, n = soap_size(a->__size, %d);", d); else fprintf(fout,"\n\tint i, n = a->__size;"); } if (typ->type == Tclass) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } } else { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } } p = is_dynamic_array(typ); if (p->sym->name[5]) item = ns_addx(p->sym->name + 5, nse); else item = ns_addx("item", nse); if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) { if (is_untyped(p->info.typ)) { if (has_offset(typ)) if (d) fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd"), d); else fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n + a->__offset) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd")); else if (d) fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizes(soap, \"%s\", a->__size, %d) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd"), d); else fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd")); } else { if (has_offset(typ)) if (d) fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), xsi_type(typ), d); else fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n + a->__offset) : NULL;", ident(p->sym->name), xsi_type(typ)); else if (d) fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizes(soap, \"%s\", a->__size, %d) : NULL;", ident(p->sym->name), xsi_type(typ),d); else fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", a->__size) : NULL;", ident(p->sym->name), xsi_type(typ)); } } if (d) fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->%s, %d, type, %s);", ident(p->sym->name), d, soap_type(typ)); else if (is_attachment(typ)) { fprintf(fout,"\n#ifndef WITH_LEANER\n\tid = soap_attachment(soap, tag, id, a, (struct soap_array*)&a->%s, a->id, a->type, a->options, 1, type, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n#else\n\tid = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->%s, 1, type, %s);\n#endif", ident(p->sym->name), soap_type(typ)); } else fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->%s, 1, type, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;"); fprintf(fout,"\n\tif ("); if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) { if (table->prev) fprintf(fout,"soap_element_begin_out(soap, tag, id, \"%s\")", xsi_type(typ)); else fprintf(fout,"soap_element_begin_out(soap, tag, id, type)"); } else if (has_offset(typ)) { if (d) fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); else fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffset(soap, a->__offset))"); } else fprintf(fout,"soap_array_begin_out(soap, tag, id, t, NULL)"); fprintf(fout, ")\n\t\treturn soap->error;"); if (is_binary(typ) && !is_hexBinary(typ)) fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else { fprintf(fout,"\n\tfor (i = 0; i < n; i++)\n\t{"); if (!has_ns(typ) && !is_untyped(typ)) { if (d) { fprintf(fout,"\n\t\tsoap->position = %d;", d); for (i = 0; i < d; i++) { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); for (j = i+1; j < d; j++) fprintf(fout, "/a->__size[%d]", j); fprintf(fout, "%%a->__size[%d];", i); } if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\ta->%s[i].soap_out(soap, \"item\", -1, \"%s\");", ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");",c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } else { fprintf(fout,"\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout,"\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");",c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } } else { if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout,"\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");",c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } } if (is_binary(typ)) fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); else if (!has_ns(typ) && !is_untyped(typ)) fprintf(fout,"\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout,"\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); } void soap_get(Tnode *typ) { Tnode *temp; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && is_element(typ)) { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); return; } if(typ->type==Tarray) { /* ARRAY */ temp = typ; while(temp->type == Tarray){ temp = (Tnode*)temp->ref; } fprintf(fhead,"\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type(temp),c_ident(typ),c_type(typ)); fprintf(fout,"\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)", c_type(temp),c_ident(typ),c_type_id(typ, "a")); fprintf(fout,"\n{\t%s;",c_type_id(temp, "(*p)")); fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); } else if (typ->type==Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { /* CLASS */ fprintf(fout,"\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout,"\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*p")); fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } else { fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*p")); fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } fprintf(fout,"\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); fprintf(fout,"\n\treturn p;\n}"); #if 0 /* some compilers cannot handle this inlined function */ if (typ->type != Treference) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s) { if (soap_begin_recv(soap) || !soap_get_%s(soap, p, NULL, NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); #endif if (typ->type != Treference) { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( soap_begin_recv(soap) || !%s::soap_get_%s(soap, data, NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ)); else fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( soap_begin_recv(soap) || !soap_get_%s(soap, data, NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); } fflush(fout); } void soap_in(Tnode *typ) { Entry *p = NULL; Table *table, *t; int total, a, f, cardinality, i, j; long min, max; Tnode *n, *temp; char *nse = ns_qualifiedElement(typ); char *nsa = ns_qualifiedAttribute(typ); if (is_dynamic_array(typ)) { soap_in_Darray(typ); return; } if (is_external(typ)) fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*")); if (is_typedef(typ) && is_element(typ) && !is_external(typ)) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_primitive_or_string(typ) && typ->type != Tenum) { if (is_stdqname(typ)) { fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tif (soap_element_begin_in(soap, tag, 1, type))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 2, %ld, %ld)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType), 0, %s, 0, sizeof(std::string), 0, soap_copy_%s);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), minlen(typ), maxlen(typ), soap_type(typ), soap_type(typ), c_ident(typ)); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout,"\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tchar *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__string(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fout,"\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 1, %ld, %ld)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType), 0, %s, 0, sizeof(std::string), 0, soap_copy_%s);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), minlen(typ), maxlen(typ), soap_type(typ), soap_type(typ), c_ident(typ)); } return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); return; } if (is_stdXML(typ)) fprintf(fout,"\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\twchar_t *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inwliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__wstring(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__wstring(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{\twchar_t *t;\n\t\ts = (std::wstring*)soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType);\n\t\tif (s)\n\t\t{\tif (!(t = soap_wstring_in(soap, 1, %ld, %ld)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::wstring*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType), 0, %s, 0, sizeof(std::wstring), 0, soap_copy_%s);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), minlen(typ), maxlen(typ), soap_type(typ), soap_type(typ), c_ident(typ)); } return; } if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{\t%s;", c_type(typ), c_ident(typ), c_type_id(typ, "*a"), c_type_id(typ, "*p")); if (is_wstring(typ)) fprintf(fout,"\n\tp = soap_inwstring(soap, tag, a, type, %s, %ld, %ld);", soap_type(typ), minlen(typ), maxlen(typ)); else if (is_string(typ)) fprintf(fout,"\n\tp = soap_instring(soap, tag, a, type, %s, %d, %ld, %ld);", soap_type(typ), is_qname(typ)+1, minlen(typ), maxlen(typ)); else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); else fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); if (typ->type <= Tenum) { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong)) fprintf(fout,"\n\tif (p && *p < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->minLength); if (typ->maxLength != MAXLONG64) fprintf(fout,"\n\tif (p && *p > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->maxLength); } } fprintf(fout,"\n\treturn p;\n}"); fflush(fout); return; } if (is_fixedstring(typ)) { fprintf(fhead,"\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); fprintf(fout,"\n\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, char a[], const char *type)\n{\tchar *p;\n\tif (soap_instring(soap, tag, &p, type, %s, 1, 0, %d))\n\t\treturn strcpy(a, p);\n\treturn NULL;\n}", c_ident(typ), soap_type(typ), typ->width / ((Tnode*)typ->ref)->width - 1); return; } switch(typ->type) { case Tstruct: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); table = (Table *)typ->ref; if (is_primclass(typ)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (!cflag || has_class(typ)) fprintf(fout,"\n\tif (!(a = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); else fprintf(fout,"\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); /* fprintf(fout,"\n\tif (soap->alloced)"); */ fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; if (p && is_item(p)) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &a->%s))", ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &a->%s))", ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); } fprintf(fout,"\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { table = (Table*)typ->ref; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ)) { if (is_anytype(p) || is_choice(p)) p = p->next; if (is_repetition(p)) { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); p = p->next; } else fprintf(fout,"\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } } } } if (!is_invisible(typ->id->name)) { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))\n\t\treturn NULL;"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout,"\n\tshort soap_flag;"); } if (has_class(typ)) { if (is_invisible(typ->id->name)) fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); else fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); } else if (is_invisible(typ->id->name)) fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), 0, NULL, NULL, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); else fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); /* fprintf(fout,"\n\tif (soap->alloced)"); */ fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); } else if (!is_discriminant(typ)) { if (table->prev || table->list) fprintf(fout,"\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } a=0; f=0; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } f=1; fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); fprintf(fout,"\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s, %s);", ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t}"); fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout,"\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { f=1; fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\tif ((a->%s = soap_getelement(soap, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { f=1; fprintf(fout,"\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t\treturn NULL;"); break; } else if (is_choice(p)) { f=1; fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); p = p->next; } else { f=1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse),xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\t\t\tcontinue;"); else { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); } } } fflush(fout); } } if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) { f=1; fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout,"!soap_peek_element(soap))"); fprintf(fout,"\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s, %s);", ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s))", ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s))", ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout,"\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { f=1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); else if(p->info.typ->type==Tarray) fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse),xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\t\t\tcontinue;"); else { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); } } } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!f && is_invisible(typ->id->name)) fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || table->prev || table->list) { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout,"\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout,"\n\t\t\t\tbreak;"); fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout,"\n\t\t}"); } } if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) if (is_repetition(p)) { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s);", ident(p->next->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\tif (a->%s)\n\t\t\ta->%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); p = p->next; } } if (!is_invisible(typ->id->name)) { fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\telse\n\t{\t"); if (has_class(typ)) fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, soap_copy_%s);",c_type_id(typ, "*"), soap_type(typ), c_type(typ), c_ident(typ)); else fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); } a = 0; if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) { if (is_item(p)) continue; if (is_anytype(p)) p = p->next; if (a==0) { fprintf(fout,"\n\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT "", strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); a=1; } else fprintf(fout," || soap_flag_%s > " SOAP_LONG_FORMAT "", ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); } else if (is_template(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (a==0) { fprintf(fout,"\n\tif (%s(!a->%s || a->%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); a=1; } else fprintf(fout," || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); a=1; } else fprintf(fout," || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); } } if ( p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (a==0) { fprintf(fout,"\n\tif (%s((a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); a=1; } else fprintf(fout," || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); a=1; } else fprintf(fout," || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); a=1; } else fprintf(fout," || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); } if (p->info.maxOccurs > 1) { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); a=1; } else fprintf(fout," || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0) { if (a==0) { fprintf(fout,"\n\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); a=1; } else fprintf(fout," || soap_flag_%s", ident(p->next->sym->name)); } p = p->next; } } if (a) fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tclass: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); if (!is_volatile(typ) && !is_typedef(typ)) { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}",c_ident(typ)); fflush(fout); } fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); if (is_primclass(typ)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout,"\n\tif (!(a = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType)))\n\t{\tsoap->error = SOAP_TAG_MISMATCH;\n\t\treturn NULL;\n\t}", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout,"\n\tif (soap->alloced)"); fprintf(fout,"\n\t{\ta->soap_default(soap);"); fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ)); fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout,"\n\t}"); for (t = (Table*)typ->ref; t; t = t->prev) { Entry *e = entry(classtable, t->sym); char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; if (p && is_item(p)) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); } fprintf(fout,"\n\t\treturn NULL;"); if (has_getter(typ)) fprintf(fout,"\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout,"\n\treturn a;\n}"); } else { if (!is_invisible(typ->id->name)) { fprintf(fout,"\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); } else fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); if (!is_discriminant(typ)) { fprintf(fout,"\n\tif (soap->alloced)"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout,"\n\t{\tsoap_default_%s(soap, a);",c_ident(typ)); else fprintf(fout,"\n\t{\ta->soap_default(soap);"); if (!is_invisible(typ->id->name)) { fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ)); fprintf(fout,"\n\t\t{\tsoap_revert(soap);"); fprintf(fout,"\n\t\t\t*soap->id = '\\0';"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout,"\n\t\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); else fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout,"\n\t\t}"); } fprintf(fout,"\n\t}"); } else fprintf(fout,"\n\ta->soap_default(soap);"); table=(Table *)typ->ref; for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); i=0; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) i++; a=0; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ)) { if (is_anytype(p) || is_choice(p)) p = p->next; if (is_repetition(p)) { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); p = p->next; } else fprintf(fout,"\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } } } if (a) fprintf(fout,";"); } fflush(fout); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); } else if (!is_discriminant(typ)) { if (table->prev || table->list) fprintf(fout,"\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } table=(Table *)typ->ref; a=0; i=0; f=0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { Entry *e; char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (is_item(p)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } f=1; fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); fprintf(fout,"\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s::%s, %s);", ident(t->sym->name), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t}"); fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout,"\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { f=1; fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout,"\n\t\t\t\tif ((a->%s::%s = soap_getelement(soap, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { f=1; fprintf(fout,"\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t\treturn NULL;"); i = 0; break; } else if (is_choice(p)) { f=1; fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->next->sym->name),i); fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, &a->%s::%s, &a->%s::%s))", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); p = p->next; } else { f=1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))",ident(p->sym->name), i); else if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident(p->info.typ),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif ((a->%s::%s).soap_in(soap, NULL, \"%s\"))", ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name),ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name),ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name),ident(p->sym->name), field_overridden(t, p, nse1),xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\t\t\tcontinue;"); else { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); } } fflush(fout); } } } if (!is_discriminant(typ)) { Entry *e; char *nse1; i=0; for (t = table; t; t = t->prev) { i++; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) { f=1; fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout,"!soap_peek_element(soap))"); fprintf(fout,"\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s::%s, %s);", ident(t->sym->name), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout,"\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout,"\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { f=1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))",ident(p->sym->name), i); else if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i); if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if(p->info.typ->type==Tarray) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name) ,xsi_type(p->info.typ)); } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1),xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name) ,xsi_type(p->info.typ)); } if (is_template(p->info.typ)) fprintf(fout,"\n\t\t\t\t\tcontinue;"); else { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout,"\n\t\t\t\t\tcontinue;"); fprintf(fout,"\n\t\t\t\t}"); } } } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!f && is_invisible(typ->id->name)) fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || table->prev || table->list) { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout,"\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout,"\n\t\t\t\tbreak;"); fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout,"\n\t\t}"); } } if (!is_discriminant(typ)) { i=0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (is_repetition(p)) { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i); fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\ta->%s::%s = (%s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); p = p->next; } } } } if (has_getter(typ)) fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\telse\n\t{"); fprintf(fout,"\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, soap_copy_%s);",c_type_id(typ, "*"), soap_type(typ), c_type(typ), c_ident(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); } if (!is_discriminant(typ)) { a=0; i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) { if (is_item(p)) continue; if (is_anytype(p)) p = p->next; if (a==0) { fprintf(fout,"\n\tif (%s(soap_flag_%s%d > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); a=1; } else fprintf(fout," || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); } else if (is_template(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (a==0) { fprintf(fout,"\n\tif (%s(!a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); a=1; } else fprintf(fout," || !a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s::%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); a=1; } else fprintf(fout," || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } } if ( p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (a==0) { fprintf(fout,"\n\tif (%s((a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); a=1; } else fprintf(fout," || (a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s::%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); a=1; } else fprintf(fout," || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); a=1; } else fprintf(fout," || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } if (p->info.maxOccurs > 1) { if (a==0) { fprintf(fout,"\n\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); a=1; } else fprintf(fout," || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0) { if (a==0) { fprintf(fout,"\n\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); a=1; } else fprintf(fout," || soap_flag_%s%d", ident(p->next->sym->name), i); } p = p->next; } } } if (a) fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}"); } fprintf(fout,"\n\treturn a;\n}"); } break; case Tunion: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, int *choice, %s)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); fprintf(fout, "\tsoap->error = SOAP_TAG_MISMATCH;"); table = (Table *)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (!is_invisible(p->sym->name)) { if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ),ident(p->sym->name),xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ),ident(p->sym->name),xsi_type(p->info.typ)); } } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, \"%s\"))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", \"%s\"))", ident(p->sym->name),ns_add(p, nse),xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, \"%s\"))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); } } fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } table = (Table *)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.sto & (Sconst | Sprivate | Sprotected)) ; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, NULL))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name),ns_add(p, nse)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, NULL))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name)); } fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } fprintf(fout, "\n\t*choice = -1;\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); break; case Tpointer: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout,"\n\t\treturn NULL;"); if (is_template(typ)) { fprintf(fout,"\n\tsoap_revert(soap);"); fprintf(fout,"\n\tif (!a)\n\t{\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;\n\t\t*a = NULL;\n\t}", c_type_id(typ, "*"), c_type(typ)); fprintf(fout,"\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); fprintf(fout,"\n\treturn a;\n}"); } else if(((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout,"\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout,"\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = (%s)soap_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))", c_type(typ), c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\telse\n\t{\t%s p = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d);", c_type_id(typ, "*"), c_type_id(typ, "*"), soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref), reflevel((Tnode*)typ->ref) ); if (((Tnode*)typ->ref)->type == Tclass) { table = (Table*)((Tnode*)typ->ref)->ref; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tclass) { Table *q = (Table*)p->info.typ->ref; if (q) for (q = q->prev; q; q = q->prev) if (q == table) fprintf(fout, "\n\t\tif (!p && soap->error == SOAP_HREF)\n\t\t{\tsoap->error = SOAP_OK;\n\t\t\tp = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), 0);\n\t\t}", c_type_id(typ, "*"), soap_type(p->info.typ), c_type(p->info.typ)); } } } fprintf(fout,"\n\t\ta = p;"); fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\treturn a;\n}"); } else { fprintf(fout,"\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout,"\n\t{\tsoap_revert(soap);"); fprintf(fout,"\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); fprintf(fout,"\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d);", c_type_id(typ, "*"), soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref), reflevel((Tnode*)typ->ref) ); fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\treturn a;\n}"); } break; case Tarray: temp = typ; while(temp->type == Tarray){ temp = (Tnode*)temp->ref; } if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(temp, "*"),c_ident(typ),c_type(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(temp, "*"),c_ident(typ),c_type(typ)); fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{",c_type_id(temp, "*"),c_ident(typ),c_type_id(typ, "a")); fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout,"\n\t\treturn NULL;"); fprintf(fout,"\n\tif (soap_match_array(soap, type))"); fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); fprintf(fout,"\n\tif (soap->body && !*soap->href)"); total=get_dimension(typ); n=(Tnode*)typ->ref; cardinality = 1; while(n->type==Tarray) { total=total*get_dimension(n); n = (Tnode*)n->ref; cardinality++; } fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)",get_dimension(typ)); fprintf(fout,"\n\t\t{\tsoap_peek_element(soap);\n\t\t\tif (soap->position)\n\t\t\t{\ti = soap->positions[0];\n\t\t\t\tif (i < 0 || i >= %d)\n\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}", get_dimension(typ)); fprintf(fout,"\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); if(cardinality > 1){ fprintf(fout,"[i]"); }else { fprintf(fout,"+i"); } fprintf(fout,", \"%s\"))", xsi_type((Tnode*)typ->ref)); fprintf(fout,"\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); fprintf(fout,"\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout,"\n\t\t\t\tbreak;"); fprintf(fout,"\n\t\t\t}"); fprintf(fout,"\n\t\t}"); fprintf(fout,"\n\t\tif (soap->mode & SOAP_C_NOIOB)\n\t\t\twhile (soap_element_end_in(soap, tag) == SOAP_SYNTAX_ERROR)\n\t\t\t{\tsoap->peeked = 1;\n\t\t\t\tsoap_ignore_element(soap);\n\t\t\t}"); fprintf(fout,"\n\t\telse if (soap_element_end_in(soap, tag))\n\t\t{\tif (soap->error == SOAP_SYNTAX_ERROR)\n\t\t\t\tsoap->error = SOAP_IOB;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout,"\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL), 0, %s, 0, sizeof(%s), 0, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\treturn (%s)a;\n}", c_type_id(temp, "*")); break; case Tenum: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*")); fprintf(fout,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{",c_ident(typ),c_type_id(typ, "*a")); if (is_typedef(typ)) fprintf(fout, "\n\treturn soap_s2%s(soap, s, a);\n}", t_ident(typ)); else if (!is_mask(typ)) { fprintf(fout, "\n\tconst struct soap_code_map *map;"); t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); } else { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); } min = 0; max = 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.val.i < min) min = (unsigned long)p->info.val.i; if (p->info.val.i > max) max = (unsigned long)p->info.val.i; } } if (is_boolean(typ)) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)(map->code != 0);\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || n < 0 || n > 1)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)(n != 0);\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), c_type(typ)); else if (sflag) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t\treturn soap->error = SOAP_TYPE;\n\treturn SOAP_OK;\n}", c_type(typ)); else fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < %ld || n > %ld)))\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); } else { t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); } else fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{",c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); if (is_boolean(typ)) { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout,"\n\t\treturn NULL;"); fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else if (typ->sym) { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout,"\n\t\treturn NULL;"); fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))"); fprintf(fout,"\n\t\treturn NULL;"); } fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout,"\tif (!a || soap_s2%s(soap, soap_value(soap), a) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\treturn a;\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); n = (Tnode*)typ->ref; fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{\t%s;", c_type_id(n, "n")); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}\n\t\t"); if (n->type == Tpointer) fprintf(fout,"n = NULL;"); else if (n->type == Tarray) fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n)); else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout,"n.soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n)); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))"); fprintf(fout, "\n\t\t{\tif (!soap_container_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size(), %s, %s, sizeof(%s), %d))\n\t\t\t\tbreak;\n\t\t\t", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n)); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, NULL))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, NULL))"); else if (n->type==Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n)); else if (n->type != Tfun && !is_void(n)) fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n)); fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}\n\t\telse "); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); else if (n->type==Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n)); else if (n->type != Tfun && !is_void(n)) fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n)); fprintf(fout, "\n\t\t\tbreak;"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap, -1)))\n\t\t\treturn NULL;", c_ident(typ)); if ((!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) && (is_primitive(n) || n->type == Tpointer)) fprintf(fout, "\n\t\ta->push_back(n);"); else { if (is_primitive(n) || n->type == Tpointer) fprintf(fout, "\n\t\ta->insert(a->end(), n);"); else fprintf(fout, "\n\t\tsoap_update_pointers(soap, (char*)&n, (char*)&n + sizeof(n), (char*)&(*a->insert(a->end(), n)), (char*)&n);"); } fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); break; default: break; } fflush(fout); } void soap_in_Darray(Tnode *typ) { int i, j, d; Entry *p; Table *t, *table; char *nsa = ns_qualifiedAttribute(typ); table=(Table *)typ->ref; p = is_dynamic_array(typ); d = get_Darraydims(typ); if (is_external(typ)) { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); return; } fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ)) fprintf(fout,"\n{\n\t(void)type; /* appease -Wall -Werror */"); else if (d) fprintf(fout,"\n{\tint i, j, n;\n\t%s;", c_type_id(p->info.typ, "p")); else fprintf(fout,"\n{\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (has_ns(typ) || is_untyped(typ)) { if (is_hexBinary(typ)) fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); else if (is_binary(typ)) fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":base64Binary\") && soap_match_tag(soap, soap->type, \":base64\"))"); else fprintf(fout,"\n\tif (*soap->type && soap_match_array(soap, \"%s\") && soap_match_tag(soap, soap->type, type))", xsi_type((Tnode*)p->info.typ->ref)); } else fprintf(fout,"\n\tif (soap_match_array(soap, type))"); fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); if (typ->type == Tclass) { fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout,"\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } else { fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); /*fprintf(fout,"\n\tif (soap->alloced)");*/ fprintf(fout,"\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); p = is_dynamic_array(typ); if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ)) { if (is_hexBinary(typ)) fprintf(fout,"\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); else { fprintf(fout,"\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); if (is_attachment(typ)) fprintf(fout,"\n#ifndef WITH_LEANER\n\t\tif (soap_xop_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\treturn NULL;\n#endif"); } fprintf(fout,"\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } else { if (d) { fprintf(fout,"\n\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); if (has_offset(typ)) fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); else fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); if (p->info.minOccurs > 0) fprintf(fout,"\n\t\tif (%sn >= 0 && n < " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout,"\n\t\tif (%sn > " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.maxOccurs); fprintf(fout,"\n\t\tif (n >= 0)"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout,"\n\t\t{\ta->%s = (%s)soap_malloc(soap, n*sizeof(%s));", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout,"\n\t\t\tfor (i = 0; i < n; i++)"); fprintf(fout,"\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); fprintf(fout,"\n\t\t\t\t{\ti = "); for (i = 0; i < d; i++) { fprintf(fout,"soap->positions[%d]", i); for (j = 1; j < d-i; j++) fprintf(fout,"*a->__size[%d]", j); if (i < d-1) fprintf(fout,"+"); } fprintf(fout,"-j;"); fprintf(fout,"\n\t\t\t\t\tif (i < 0 || i >= n)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); fprintf(fout,"\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout,"\n\t\t\t\t\tbreak;"); fprintf(fout,"\n\t\t\t\t}"); } else { fprintf(fout,"\n\t\ta->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j);"); if (has_offset(typ) && (p->next->next->info.sto & Sconst) == 0) { fprintf(fout,"\n\t\ta->__offset = j;"); } if (p->info.minOccurs > 0) fprintf(fout,"\n\t\tif (%sa->__size >= 0 && a->__size < " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout,"\n\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.maxOccurs); fprintf(fout,"\n\t\tif (a->__size >= 0)"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout,"\n\t\t{\ta->%s = (%s)soap_malloc(soap, sizeof(%s) * a->__size);", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout,"\n\t\t\tfor (i = 0; i < a->__size; i++)"); fprintf(fout,"\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position)\n\t\t\t\t{\ti = soap->positions[0]-j;\n\t\t\t\t\tif (i < 0 || i >= a->__size)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, a->%s + i))", ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, a->%s + i))", ident(p->sym->name)); else fprintf(fout,"\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout,"\n\t\t\t\t\tbreak;"); fprintf(fout,"\n\t\t\t\t}"); } fprintf(fout,"\n\t\t\t}\n\t\t}\n\t\telse"); fprintf(fout,"\n\t\t{\tif (soap_new_block(soap) == NULL)\n\t\t\t\treturn NULL;"); if (p->info.maxOccurs > 1) { if (d) fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; a->__size[0] <= " SOAP_LONG_FORMAT "; a->__size[0]++)", p->info.maxOccurs); else fprintf(fout,"\n\t\t\tfor (a->__size = 0; a->__size <= " SOAP_LONG_FORMAT "; a->__size++)", p->info.maxOccurs); } else { if (d) fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; ; a->__size[0]++)"); else fprintf(fout,"\n\t\t\tfor (a->__size = 0; ; a->__size++)"); } fprintf(fout,"\n\t\t\t{\tp = (%s)soap_push_block(soap, NULL, sizeof(%s));\n\t\t\t\tif (!p)\n\t\t\t\t\treturn NULL;", c_type(p->info.typ), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout,"\n\t\t\t\tSOAP_PLACEMENT_NEW(p, %s);", c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\t\tp->soap_default(soap);"); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout,"\n\t\t\t\t*p = NULL;"); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); else fprintf(fout,"\n\t\t\t\tif (!soap_in_%s(soap, NULL, p, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout,"\n\t\t\t\t\tbreak;"); fprintf(fout,"\n\t\t\t\t}"); fprintf(fout,"\n\t\t\t}"); fprintf(fout,"\n\t\t\tsoap_pop_block(soap, NULL);"); if (p->info.minOccurs > 0) fprintf(fout,"\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout,"\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) fprintf(fout,"\n\t\t\tif (soap->blist->size)\n\t\t\t\ta->%s = soap_new_%s(soap, soap->blist->size/sizeof(%s));\n\t\t\telse\n\t\t\t\ta->%s = NULL;", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name)); else fprintf(fout,"\n\t\t\ta->%s = (%s)soap_malloc(soap, soap->blist->size);", ident(p->sym->name), c_type(p->info.typ)); fprintf(fout,"\n\t\t\tsoap_save_block(soap, NULL, (char*)a->%s, 1);", ident(p->sym->name)); fprintf(fout,"\n\t\t}"); fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } if (has_getter(typ)) fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}\n\telse\n\t{\t"); if (is_attachment(typ)) fprintf(fout,"\n#ifndef WITH_LEANER\n\t\tif (*soap->href != '#')\n\t\t{\tif (soap_dime_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse\n#endif\n\t\t\t"); if (typ->type == Tclass) fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, soap_copy_%s);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), c_ident(typ)); else fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout,"\n\t}"); fprintf(fout,"\n\treturn a;\n}"); } const char * cstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } *t = '\0'; return r; } const char * xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { sprintf(t, "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { strcpy(t, "<"); t += 4; } else if (*s == '>') { strcpy(t, ">"); t += 4; } else if (*s == '&') { strcpy(t, "&"); t += 5; } else if (*s == '"') { strcpy(t, """); t += 6; } else if (*s == '\\') { strcpy(t, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; }