Mercurial > repos > ktnyt > gembassy
comparison GEMBASSY-1.0.3/gsoap/src/symbol2.c @ 2:8947fca5f715 draft default tip
Uploaded
| author | ktnyt |
|---|---|
| date | Fri, 26 Jun 2015 05:21:44 -0400 |
| parents | 84a17b3fad1f |
| children |
comparison
equal
deleted
inserted
replaced
| 1:84a17b3fad1f | 2:8947fca5f715 |
|---|---|
| 1 /* | |
| 2 symbol2.c | |
| 3 | |
| 4 Symbol table handling, type analysis, and code generation. | |
| 5 | |
| 6 -------------------------------------------------------------------------------- | |
| 7 gSOAP XML Web services tools | |
| 8 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved. | |
| 9 This part of the software is released under one of the following licenses: | |
| 10 GPL or Genivia's license for commercial use. | |
| 11 -------------------------------------------------------------------------------- | |
| 12 GPL license. | |
| 13 | |
| 14 This program is free software; you can redistribute it and/or modify it under | |
| 15 the terms of the GNU General Public License as published by the Free Software | |
| 16 Foundation; either version 2 of the License, or (at your option) any later | |
| 17 version. | |
| 18 | |
| 19 This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
| 20 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A | |
| 21 PARTICULAR PURPOSE. See the GNU General Public License for more details. | |
| 22 | |
| 23 You should have received a copy of the GNU General Public License along with | |
| 24 this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |
| 25 Place, Suite 330, Boston, MA 02111-1307 USA | |
| 26 | |
| 27 Author contact information: | |
| 28 engelen@genivia.com / engelen@acm.org | |
| 29 | |
| 30 This program is released under the GPL with the additional exemption that | |
| 31 compiling, linking, and/or using OpenSSL is allowed. | |
| 32 -------------------------------------------------------------------------------- | |
| 33 A commercial use license is available from Genivia, Inc., contact@genivia.com | |
| 34 -------------------------------------------------------------------------------- | |
| 35 */ | |
| 36 | |
| 37 #include "soapcpp2.h" | |
| 38 | |
| 39 #ifdef HAVE_CONFIG_H | |
| 40 #include "soapcpp2_yacc.h" | |
| 41 #else | |
| 42 #include "soapcpp2_yacc.tab.h" | |
| 43 #endif | |
| 44 | |
| 45 char *envURI = "http://schemas.xmlsoap.org/soap/envelope/"; | |
| 46 char *encURI = "http://schemas.xmlsoap.org/soap/encoding/"; | |
| 47 char *rpcURI = "http://www.w3.org/2003/05/soap-rpc"; | |
| 48 char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance"; | |
| 49 char *xsdURI = "http://www.w3.org/2001/XMLSchema"; | |
| 50 char *tmpURI = "http://tempuri.org"; | |
| 51 | |
| 52 static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */ | |
| 53 static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */ | |
| 54 | |
| 55 static Tnode *Tptr[TYPES]; | |
| 56 | |
| 57 Service *services = NULL; | |
| 58 | |
| 59 FILE *fout, *fhead, *fclient, *fserver, *fheader, *flib, *fmatlab, *fmheader; | |
| 60 | |
| 61 int partnum = 0; | |
| 62 | |
| 63 int typeNO = 1; /* unique no. assigned to all types */ | |
| 64 | |
| 65 static int is_anytype_flag = 0; /* anytype is used */ | |
| 66 static int has_nsmap = 0; | |
| 67 | |
| 68 int tagcmp(const char *s, const char *t); | |
| 69 int tagncmp(const char *s, const char *t, size_t n); | |
| 70 | |
| 71 long minlen(Tnode *typ); | |
| 72 long maxlen(Tnode *typ); | |
| 73 | |
| 74 int is_soap12(const char*); | |
| 75 int has_detail_string(void); | |
| 76 int has_Detail_string(void); | |
| 77 | |
| 78 void needs_lang(Entry *e); | |
| 79 | |
| 80 int is_mutable(Tnode *typ); | |
| 81 int is_header_or_fault(Tnode *typ); | |
| 82 int is_body(Tnode *typ); | |
| 83 int is_volatile(Tnode* typ); | |
| 84 int is_untyped(Tnode* typ); | |
| 85 int is_primclass(Tnode* typ); | |
| 86 int is_imported(Tnode* typ); | |
| 87 int is_template(Tnode* typ); | |
| 88 int is_mask(Tnode* typ); | |
| 89 int is_attachment(Tnode* typ); | |
| 90 int has_attachment(Tnode* typ); | |
| 91 int is_void(Tnode* typ); | |
| 92 int has_external(Tnode *typ); | |
| 93 int has_volatile(Tnode *typ); | |
| 94 | |
| 95 int is_invisible(const char *name); | |
| 96 int is_invisible_empty(Tnode *p); | |
| 97 | |
| 98 int is_eq_nons(const char *s, const char *t); | |
| 99 int is_eq(const char *s, const char *t); | |
| 100 | |
| 101 int is_item(Entry *p); | |
| 102 int is_self(Entry *p); | |
| 103 | |
| 104 const char *cstring(const char*); | |
| 105 const char *xstring(const char*); | |
| 106 | |
| 107 /* | |
| 108 install - add new symbol | |
| 109 */ | |
| 110 Symbol * | |
| 111 install(const char *name, Token token) | |
| 112 { Symbol *p; | |
| 113 p = (Symbol*)emalloc(sizeof(Symbol)); | |
| 114 p->name = emalloc(strlen(name)+1); | |
| 115 strcpy(p->name, name); | |
| 116 p->token = token; | |
| 117 p->next = symlist; | |
| 118 symlist = p; | |
| 119 return p; | |
| 120 } | |
| 121 | |
| 122 /* | |
| 123 lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found. | |
| 124 */ | |
| 125 Symbol * | |
| 126 lookup(const char *name) | |
| 127 { Symbol *p; | |
| 128 for (p = symlist; p; p = p->next) | |
| 129 if (!strcmp(p->name, name)) | |
| 130 return p; | |
| 131 return NULL; | |
| 132 } | |
| 133 | |
| 134 /* | |
| 135 gensymidx - generate new symbol from base name and index | |
| 136 */ | |
| 137 Symbol * | |
| 138 gensymidx(const char *base, int idx) | |
| 139 { char buf[1024]; | |
| 140 Symbol *s; | |
| 141 sprintf(buf, "%s_%d", base, idx); | |
| 142 s = lookup(buf); | |
| 143 if (s) | |
| 144 return s; | |
| 145 return install(buf, ID); | |
| 146 } | |
| 147 | |
| 148 /* | |
| 149 gensym - generate new symbol from base name | |
| 150 */ | |
| 151 Symbol * | |
| 152 gensym(const char *base) | |
| 153 { static int num = 1; | |
| 154 return gensymidx(base, num++); | |
| 155 } | |
| 156 | |
| 157 /* | |
| 158 mktable - make a new symbol table with a pointer to a previous table | |
| 159 */ | |
| 160 Table * | |
| 161 mktable(Table *table) | |
| 162 { Table *p; | |
| 163 p = (Table*)emalloc(sizeof(Table)); | |
| 164 p->sym = lookup("/*?*/"); | |
| 165 p->list = (Entry*) 0; | |
| 166 if (table == (Table*) 0) | |
| 167 p->level = INTERNAL; | |
| 168 else p->level = table->level+1; | |
| 169 p->prev = table; | |
| 170 return p; | |
| 171 } | |
| 172 | |
| 173 /* | |
| 174 mkmethod - make a new method by calling mktype | |
| 175 */ | |
| 176 Tnode * | |
| 177 mkmethod(Tnode *ret, Table *args) | |
| 178 { FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo)); | |
| 179 fn->ret = ret; | |
| 180 fn->args = args; | |
| 181 return mktype(Tfun, fn, 0); | |
| 182 } | |
| 183 | |
| 184 /* | |
| 185 freetable - free space by removing a table | |
| 186 */ | |
| 187 void | |
| 188 freetable(Table *table) | |
| 189 { Entry *p, *q; | |
| 190 if (table == (Table*) 0) | |
| 191 return; | |
| 192 for (p = table->list; p != (Entry*) 0; p = q) { | |
| 193 q = p->next; | |
| 194 free(p); | |
| 195 } | |
| 196 free(table); | |
| 197 } | |
| 198 | |
| 199 /* | |
| 200 unlinklast - unlink last entry added to table | |
| 201 */ | |
| 202 Entry * | |
| 203 unlinklast(Table *table) | |
| 204 { Entry **p, *q; | |
| 205 if (table == (Table*)0) | |
| 206 return (Entry*)0; | |
| 207 for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0; | |
| 208 p = &(*p)->next); | |
| 209 q = *p; | |
| 210 *p = (Entry*)0; | |
| 211 return q; | |
| 212 } | |
| 213 | |
| 214 /* | |
| 215 enter - enter a symbol in a table. Error if already in the table | |
| 216 */ | |
| 217 Entry * | |
| 218 enter(Table *table, Symbol *sym) | |
| 219 { Entry *p, *q = NULL; | |
| 220 again: | |
| 221 for (p = table->list; p; q = p, p = p->next) | |
| 222 { if (p->sym == sym && p->info.typ->type != Tfun) | |
| 223 { char *s; | |
| 224 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); | |
| 225 semwarn(errbuf); | |
| 226 s = (char*)emalloc(strlen(sym->name) + 2); | |
| 227 strcpy(s, sym->name); | |
| 228 strcat(s, "_"); | |
| 229 sym = lookup(s); | |
| 230 if (!sym) | |
| 231 sym = install(s, ID); | |
| 232 free(s); | |
| 233 goto again; | |
| 234 } | |
| 235 } | |
| 236 p = (Entry*)emalloc(sizeof(Entry)); | |
| 237 p->sym = sym; | |
| 238 p->tag = NULL; | |
| 239 p->info.typ = NULL; | |
| 240 p->info.sto = Snone; | |
| 241 p->info.hasval = False; | |
| 242 p->info.minOccurs = 1; | |
| 243 p->info.maxOccurs = 1; | |
| 244 p->info.offset = 0; | |
| 245 p->level = table->level; | |
| 246 p->lineno = yylineno; | |
| 247 p->next = NULL; | |
| 248 if (!q) | |
| 249 table->list = p; | |
| 250 else | |
| 251 q->next = p; | |
| 252 return p; | |
| 253 } | |
| 254 | |
| 255 /* | |
| 256 entry - return pointer to table entry of a symbol | |
| 257 */ | |
| 258 Entry * | |
| 259 entry(Table *table, Symbol *sym) | |
| 260 { Table *t; | |
| 261 Entry *p; | |
| 262 for (t = table; t; t = t->prev) | |
| 263 for (p = t->list; p; p = p->next) | |
| 264 if (p->sym == sym) | |
| 265 return p; | |
| 266 return NULL; | |
| 267 } | |
| 268 | |
| 269 /* | |
| 270 reenter - re-enter a symbol in a table. | |
| 271 */ | |
| 272 Entry * | |
| 273 reenter(Table *table, Symbol *sym) | |
| 274 { Entry *p, *q = NULL; | |
| 275 for (p = table->list; p; q = p, p = p->next) | |
| 276 if (p->sym == sym) | |
| 277 break; | |
| 278 if (p && p->next) | |
| 279 { if (q) | |
| 280 q->next = p->next; | |
| 281 else | |
| 282 table->list = p->next; | |
| 283 for (q = p->next; q->next; q = q->next) | |
| 284 ; | |
| 285 q->next = p; | |
| 286 p->next = NULL; | |
| 287 } | |
| 288 return p; | |
| 289 } | |
| 290 | |
| 291 /* | |
| 292 merge - append two tables if members are not duplicated | |
| 293 */ | |
| 294 int | |
| 295 merge(Table *dest, Table *src) | |
| 296 { Entry *p, *q; | |
| 297 for (p = src->list; p; p = p->next) | |
| 298 { q = entry(dest, p->sym); | |
| 299 if (!q || q->info.typ != p->info.typ) | |
| 300 { q = enter(dest, p->sym); | |
| 301 q->info = p->info; | |
| 302 } | |
| 303 } | |
| 304 return 0; | |
| 305 } | |
| 306 | |
| 307 Entry * | |
| 308 enumentry(Symbol *sym) | |
| 309 { Table *t; | |
| 310 Entry *p, *q; | |
| 311 for (t = enumtable; t; t = t->prev) | |
| 312 { for (p = t->list; p; p = p->next) | |
| 313 { q = entry((Table*)p->info.typ->ref, sym); | |
| 314 if (q) | |
| 315 return q; | |
| 316 } | |
| 317 } | |
| 318 return NULL; | |
| 319 } | |
| 320 | |
| 321 char *get_mxClassID(Tnode*); | |
| 322 char *t_ident(Tnode*); | |
| 323 char *c_ident(Tnode*); | |
| 324 char *ident(char*); | |
| 325 char *soap_type(Tnode*); | |
| 326 char *c_storage(Storage); | |
| 327 char *c_init(Entry*); | |
| 328 char *c_type(Tnode*); | |
| 329 char *c_type_id(Tnode*, char*); | |
| 330 char *xsi_type_cond(Tnode*, int); | |
| 331 char *xsi_type(Tnode*); | |
| 332 char *xsi_type_cond_u(Tnode*, int); | |
| 333 char *xsi_type_u(Tnode*); | |
| 334 char *the_type(Tnode*); | |
| 335 char *wsdl_type(Tnode*, char*); | |
| 336 char *base_type(Tnode*, char*); | |
| 337 char *xml_tag(Tnode*); | |
| 338 char *ns_qualifiedElement(Tnode*); | |
| 339 char *ns_qualifiedAttribute(Tnode*); | |
| 340 char *ns_convert(char*); | |
| 341 char *field(Entry *p, char *ns); | |
| 342 char *field_overridden(Table *t, Entry *p, char *ns); | |
| 343 char *ns_add(Entry *p, char *ns); | |
| 344 char *ns_addx(char *tag, char *ns); | |
| 345 char *ns_add_overridden(Table *t, Entry *p, char *ns); | |
| 346 char *ns_remove(char*); | |
| 347 char *ns_remove1(char*); | |
| 348 char *ns_remove2(char*); | |
| 349 char *res_remove(char*); | |
| 350 char *ns_name(char*); | |
| 351 char *ns_cname(char*, char*); | |
| 352 char *ns_fname(char*); | |
| 353 | |
| 354 int has_class(Tnode*); | |
| 355 int has_constructor(Tnode*); | |
| 356 int has_destructor(Tnode*); | |
| 357 int has_getter(Tnode*); | |
| 358 int has_setter(Tnode*); | |
| 359 int has_ns(Tnode*); | |
| 360 int has_ns_t(Tnode*); | |
| 361 int has_ns_eq(char*, char*); | |
| 362 char *strict_check(void); | |
| 363 char *ns_of(char*); | |
| 364 int eq_ns(char*, char*); | |
| 365 char *prefix_of(char*); | |
| 366 int has_offset(Tnode*); | |
| 367 int reflevel(Tnode *typ); | |
| 368 Tnode* reftype(Tnode *typ); | |
| 369 int is_response(Tnode*); | |
| 370 int is_XML(Tnode*); | |
| 371 int is_stdXML(Tnode *p); | |
| 372 Entry *get_response(Tnode*); | |
| 373 int is_primitive_or_string(Tnode*); | |
| 374 int is_primitive(Tnode*); | |
| 375 Entry *is_discriminant(Tnode*); | |
| 376 Entry *is_dynamic_array(Tnode*); | |
| 377 int is_transient(Tnode*); | |
| 378 int is_external(Tnode*); | |
| 379 int is_anyType(Tnode*); | |
| 380 int is_anyAttribute(Tnode*); | |
| 381 int is_binary(Tnode*); | |
| 382 int is_hexBinary(Tnode*); | |
| 383 int is_fixedstring(Tnode*); | |
| 384 int is_string(Tnode*); | |
| 385 int is_wstring(Tnode*); | |
| 386 int is_stdstring(Tnode*); | |
| 387 int is_stdwstring(Tnode*); | |
| 388 int is_stdstr(Tnode*); | |
| 389 int is_typedef(Tnode*); | |
| 390 int get_dimension(Tnode*); | |
| 391 char *has_soapref(Tnode*); | |
| 392 int is_document(const char*); | |
| 393 int is_literal(const char*); | |
| 394 int is_keyword(const char *); | |
| 395 | |
| 396 int is_repetition(Entry*); | |
| 397 int is_choice(Entry*); | |
| 398 int is_sequence(Entry*); | |
| 399 int is_anytype(Entry*); | |
| 400 | |
| 401 char *xsi_type_Tarray(Tnode*); | |
| 402 char *xsi_type_Darray(Tnode*); | |
| 403 | |
| 404 void matlab_def_table(Table*); | |
| 405 void def_table(Table*); | |
| 406 void generate(Tnode *); | |
| 407 int no_of_var(Tnode*); | |
| 408 char *pointer_stuff(Tnode*); | |
| 409 void in_defs(Table*); | |
| 410 void in_defs2(Table*); | |
| 411 void in_defs3(Table*); | |
| 412 void out_defs(Table*); | |
| 413 void mark_defs(Table*); | |
| 414 void in_attach(Table*); | |
| 415 void out_attach(Table*); | |
| 416 void soap_serialize(Tnode*); | |
| 417 void soap_traverse(Tnode*); | |
| 418 void soap_default(Tnode*); | |
| 419 void soap_put(Tnode*); | |
| 420 void soap_out(Tnode*); | |
| 421 void soap_out_Darray(Tnode *); | |
| 422 void soap_get(Tnode*); | |
| 423 void soap_in(Tnode*); | |
| 424 void soap_in_Darray(Tnode *); | |
| 425 void soap_instantiate_class(Tnode *); | |
| 426 int get_Darraydims(Tnode *typ); | |
| 427 const char *nillable(Tnode *typ); | |
| 428 | |
| 429 void soap_serve(Table*); | |
| 430 void generate_proto(Table*, Entry*); | |
| 431 /* | |
| 432 void generate_call(Table*, Entry*); | |
| 433 void generate_server(Table*, Entry*); | |
| 434 */ | |
| 435 void generate_header(Table*); | |
| 436 void get_namespace_prefixes(void); | |
| 437 void generate_schema(Table*); | |
| 438 void gen_schema(FILE*,Table*,char*,char*,int,int,char*,char*,char*,char*); | |
| 439 void gen_type_documentation(FILE *fd, Entry *type, char *ns); | |
| 440 int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns); | |
| 441 void gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *encoding, char *style); | |
| 442 void gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1); | |
| 443 int gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1); | |
| 444 void gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1); | |
| 445 void gen_wsdl(FILE*,Table*,char*,char*,char*,char*,char*,char*,char*,char*); | |
| 446 void gen_nsmap(FILE*,Symbol*,char*); | |
| 447 | |
| 448 void gen_proxy(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); | |
| 449 void gen_object(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); | |
| 450 void gen_proxy_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); | |
| 451 void gen_proxy_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); | |
| 452 void gen_object_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); | |
| 453 void gen_object_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); | |
| 454 void gen_method(FILE *fd, Table *table, Entry *method, int server); | |
| 455 void gen_params(FILE *fd, Table *params, Entry *result, int flag); | |
| 456 void gen_args(FILE *fd, Table *params, Entry *result, int flag); | |
| 457 void gen_query_url(FILE *fd, Table *params); | |
| 458 void gen_query_form(FILE *fd, Table *params); | |
| 459 const char* gen_format(FILE *fd, Tnode *typ); | |
| 460 void gen_call_method(FILE *fd, Table *table, Entry *method, char *name); | |
| 461 void gen_serve_method(FILE *fd, Table *table, Entry *param, char *name); | |
| 462 | |
| 463 void gen_data(char*,Table*,char*,char*,char*,char*,char*,char*); | |
| 464 FILE *gen_env(char*,char*,int,Table*,char*,char*,char*,char*,char*,char*,int); | |
| 465 void gen_xmlns(FILE*); | |
| 466 void gen_field(FILE*,int,Entry*,char*,char*,char*); | |
| 467 void gen_val(FILE*,int,Tnode*,char*,char*,char*); | |
| 468 void gen_atts(FILE*,int,Table*,char*); | |
| 469 | |
| 470 /* | |
| 471 mktype - make a (new) type with a reference to additional information and the | |
| 472 width in bytes required to store objects of that type. A pointer to the | |
| 473 type is returned which can be compared to check if types are identical. | |
| 474 */ | |
| 475 Tnode * | |
| 476 mktype(Type type, void *ref, int width) | |
| 477 { Tnode *p; | |
| 478 int t = 0; | |
| 479 if (transient != -2 || type > Ttime) | |
| 480 t = transient; | |
| 481 if (type != Tstruct && type != Tclass && type != Tunion && (type != Tenum || ref)) | |
| 482 { for (p = Tptr[type]; p; p = p->next) | |
| 483 { if (p->ref == ref && p->sym == (Symbol*) 0 && p->width == width && p->transient == t) | |
| 484 { if (imported && !p->imported) | |
| 485 p->imported = imported; | |
| 486 return p; /* type alrady exists in table */ | |
| 487 } | |
| 488 } | |
| 489 } | |
| 490 p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ | |
| 491 p->type = type; | |
| 492 p->ref = ref; | |
| 493 p->id = lookup("/*?*/"); | |
| 494 p->base = NULL; | |
| 495 p->sym = (Symbol*)0; | |
| 496 p->response = (Entry*)0; | |
| 497 p->width = width; | |
| 498 p->generated = False; | |
| 499 p->classed = False; | |
| 500 p->wsdl = False; | |
| 501 p->next = Tptr[type]; | |
| 502 p->transient = t; | |
| 503 p->imported = imported; | |
| 504 p->pattern = NULL; | |
| 505 p->minLength = MINLONG64; | |
| 506 p->maxLength = MAXLONG64; | |
| 507 p->num = typeNO++; | |
| 508 Tptr[type] = p; | |
| 509 DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported)); | |
| 510 if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass)) | |
| 511 p->imported = ((Tnode*)ref)->imported; | |
| 512 else if (lflag && !is_transient(p) && (type == Tenum || type == Tstruct || type == Tclass)) | |
| 513 mkpointer(p); | |
| 514 return p; | |
| 515 } | |
| 516 | |
| 517 Tnode * | |
| 518 mksymtype(Tnode *typ, Symbol *sym) | |
| 519 { Tnode *p; | |
| 520 p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ | |
| 521 p->type = typ->type; | |
| 522 p->ref = typ->ref; | |
| 523 if (typ->id == lookup("/*?*/")) | |
| 524 p->id = sym; | |
| 525 else | |
| 526 p->id = typ->id; | |
| 527 p->sym = sym; | |
| 528 p->response = (Entry*)0; | |
| 529 p->width = typ->width; | |
| 530 p->generated = False; | |
| 531 p->classed = True; /* copy of existing (generated) type */ | |
| 532 p->wsdl = False; | |
| 533 p->next = Tptr[typ->type]; | |
| 534 p->transient = transient; | |
| 535 p->imported = imported; | |
| 536 p->pattern = NULL; | |
| 537 p->minLength = MINLONG64; | |
| 538 p->maxLength = MAXLONG64; | |
| 539 p->num = typeNO++; | |
| 540 Tptr[typ->type] = p; | |
| 541 DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported)); | |
| 542 return p; | |
| 543 } | |
| 544 | |
| 545 Tnode * | |
| 546 mktemplate(Tnode *typ, Symbol *id) | |
| 547 { Tnode *p; | |
| 548 for (p = Tptr[Ttemplate]; p; p = p->next) | |
| 549 if (p->ref == typ && p->id == id && p->transient == transient) | |
| 550 { if (imported && !p->imported) | |
| 551 p->imported = imported; | |
| 552 return p; /* type alrady exists in table */ | |
| 553 } | |
| 554 p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ | |
| 555 p->type = Ttemplate; | |
| 556 p->ref = typ; | |
| 557 p->id = id; | |
| 558 p->sym = NULL; | |
| 559 p->response = (Entry*)0; | |
| 560 p->width = 0; | |
| 561 p->generated = False; | |
| 562 p->classed = False; /* copy of existing (generated) type */ | |
| 563 p->wsdl = False; | |
| 564 p->next = Tptr[Ttemplate]; | |
| 565 p->transient = transient; | |
| 566 p->imported = imported; | |
| 567 p->pattern = NULL; | |
| 568 p->minLength = MINLONG64; | |
| 569 p->maxLength = MAXLONG64; | |
| 570 p->num = typeNO++; | |
| 571 Tptr[Ttemplate] = p; | |
| 572 return p; | |
| 573 } | |
| 574 | |
| 575 /* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */ | |
| 576 void | |
| 577 copyrightnote(FILE *fd, char *fn) | |
| 578 { fprintf(fd, "\ | |
| 579 /* %s\n Generated by gSOAP "VERSION" from %s\n\ | |
| 580 \n\ | |
| 581 Copyright(C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ | |
| 582 The generated code is released under one of the following licenses:\n\ | |
| 583 GPL or Genivia's license for commercial use.\n\ | |
| 584 This program is released under the GPL with the additional exemption that\n\ | |
| 585 compiling, linking, and/or using OpenSSL is allowed.\n\ | |
| 586 */", fn, filename); | |
| 587 } | |
| 588 | |
| 589 void | |
| 590 banner(FILE *fd, const char *text) | |
| 591 { int i; | |
| 592 fprintf(fd, "\n\n/"); | |
| 593 for (i = 0; i < 78; i++) | |
| 594 fputc('*', fd); | |
| 595 fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, ""); | |
| 596 for (i = 0; i < 78; i++) | |
| 597 fputc('*', fd); | |
| 598 fprintf(fd, "/\n"); | |
| 599 } | |
| 600 | |
| 601 void | |
| 602 identify(FILE *fd, char *fn) | |
| 603 { time_t t = time(NULL), *p = &t; | |
| 604 char tmp[256]; | |
| 605 strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); | |
| 606 fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver "VERSION" %s\")\n", fn, tmp); | |
| 607 } | |
| 608 | |
| 609 void | |
| 610 compile(Table *table) | |
| 611 { Entry *p; | |
| 612 Tnode *typ; | |
| 613 Pragma *pragma; | |
| 614 int classflag = 0; | |
| 615 int found; | |
| 616 int filenum; | |
| 617 char *s; | |
| 618 char base[1024]; | |
| 619 char soapStub[1024]; | |
| 620 char soapH[1024]; | |
| 621 char soapC[1024]; | |
| 622 char soapClient[1024]; | |
| 623 char soapServer[1024]; | |
| 624 char soapClientLib[1024]; | |
| 625 char soapServerLib[1024]; | |
| 626 char pathsoapStub[1024]; | |
| 627 char pathsoapH[1024]; | |
| 628 char pathsoapC[1024]; | |
| 629 char pathsoapClient[1024]; | |
| 630 char pathsoapServer[1024]; | |
| 631 char pathsoapClientLib[1024]; | |
| 632 char pathsoapServerLib[1024]; | |
| 633 char soapMatlab[1024]; | |
| 634 char pathsoapMatlab[1024]; | |
| 635 char soapMatlabHdr[1024]; | |
| 636 char pathsoapMatlabHdr[1024]; | |
| 637 | |
| 638 found = 0; | |
| 639 for (p = table->list; p; p = p->next) | |
| 640 if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) | |
| 641 found = 1; | |
| 642 if (!found) | |
| 643 Sflag = Cflag = Lflag = 1; /* no service operations were found */ | |
| 644 | |
| 645 if (*dirpath) | |
| 646 fprintf(fmsg, "Using project directory path: %s\n", dirpath); | |
| 647 | |
| 648 if (namespaceid) | |
| 649 { prefix = namespaceid; | |
| 650 fprintf(fmsg, "Using code namespace: %s\n", namespaceid); | |
| 651 } | |
| 652 strcpy(base, prefix); | |
| 653 if (cflag) | |
| 654 s = ".c"; | |
| 655 else | |
| 656 s = ".cpp"; | |
| 657 | |
| 658 strcpy(soapMatlab, base); | |
| 659 strcat(soapMatlab, "Matlab.c"); | |
| 660 strcpy(pathsoapMatlab, dirpath); | |
| 661 strcat(pathsoapMatlab, soapMatlab ); | |
| 662 | |
| 663 strcpy(soapMatlabHdr, base); | |
| 664 strcat(soapMatlabHdr, "Matlab.h"); | |
| 665 strcpy(pathsoapMatlabHdr, dirpath); | |
| 666 strcat(pathsoapMatlabHdr, soapMatlabHdr); | |
| 667 | |
| 668 strcpy(soapStub, base); | |
| 669 strcat(soapStub, "Stub.h"); | |
| 670 strcpy(pathsoapStub, dirpath); | |
| 671 strcat(pathsoapStub, soapStub); | |
| 672 strcpy(soapH, base); | |
| 673 strcat(soapH, "H.h"); | |
| 674 strcpy(pathsoapH, dirpath); | |
| 675 strcat(pathsoapH, soapH); | |
| 676 strcpy(soapC, base); | |
| 677 if (fflag) | |
| 678 strcat(soapC, "C_nnn"); | |
| 679 else | |
| 680 strcat(soapC, "C"); | |
| 681 strcat(soapC, s); | |
| 682 strcpy(pathsoapC, dirpath); | |
| 683 strcat(pathsoapC, soapC); | |
| 684 strcpy(soapClient, base); | |
| 685 strcat(soapClient, "Client"); | |
| 686 strcat(soapClient, s); | |
| 687 strcpy(pathsoapClient, dirpath); | |
| 688 strcat(pathsoapClient, soapClient); | |
| 689 strcpy(soapServer, base); | |
| 690 strcat(soapServer, "Server"); | |
| 691 strcat(soapServer, s); | |
| 692 strcpy(pathsoapServer, dirpath); | |
| 693 strcat(pathsoapServer, soapServer); | |
| 694 strcpy(soapClientLib, base); | |
| 695 strcat(soapClientLib, "ClientLib"); | |
| 696 strcat(soapClientLib, s); | |
| 697 strcpy(pathsoapClientLib, dirpath); | |
| 698 strcat(pathsoapClientLib, soapClientLib); | |
| 699 strcpy(soapServerLib, base); | |
| 700 strcat(soapServerLib, "ServerLib"); | |
| 701 strcat(soapServerLib, s); | |
| 702 strcpy(pathsoapServerLib, dirpath); | |
| 703 strcat(pathsoapServerLib, soapServerLib); | |
| 704 | |
| 705 if (mflag) | |
| 706 { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab); | |
| 707 fmatlab=fopen(pathsoapMatlab, "w"); | |
| 708 if (!fmatlab) | |
| 709 execerror("Cannot write to file"); | |
| 710 copyrightnote(fmatlab, soapMatlab); | |
| 711 fprintf(fmatlab,"\n#include \"%s\"\n", soapMatlabHdr); | |
| 712 fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr); | |
| 713 fmheader=fopen(pathsoapMatlabHdr, "w"); | |
| 714 if (!fmheader) | |
| 715 execerror("Cannot write to file"); | |
| 716 copyrightnote(fmheader, soapMatlabHdr); | |
| 717 fprintf(fmheader,"\n#include \"mex.h\"\n#include \"%s\"\n", soapStub); | |
| 718 } | |
| 719 | |
| 720 fprintf(fmsg, "Saving %s annotated copy of the source input\n", pathsoapStub); | |
| 721 fheader=fopen(pathsoapStub, "w"); | |
| 722 if (!fheader) | |
| 723 execerror("Cannot write to file"); | |
| 724 copyrightnote(fheader, soapStub); | |
| 725 fprintf(fheader,"\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix); | |
| 726 for (pragma = pragmas; pragma; pragma = pragma->next) | |
| 727 fprintf(fheader,"\n%s", pragma->pragma); | |
| 728 if (nflag) | |
| 729 fprintf(fheader,"\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif"); | |
| 730 if (namespaceid) | |
| 731 { fprintf(fheader,"\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); | |
| 732 } | |
| 733 fprintf(fheader,"\n#include \"stdsoap2.h\""); | |
| 734 fprintf(fheader,"\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION MISMATCH IN GENERATED CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION); | |
| 735 if (cflag) | |
| 736 fprintf(fheader,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 737 if (namespaceid) | |
| 738 fprintf(fheader,"\n\nnamespace %s {", namespaceid); | |
| 739 | |
| 740 fprintf(fmsg, "Saving %s interface declarations\n", pathsoapH); | |
| 741 fhead=fopen(pathsoapH,"w"); | |
| 742 if (!fhead) | |
| 743 execerror("Cannot write to file"); | |
| 744 copyrightnote(fhead, soapH); | |
| 745 fprintf(fhead,"\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix); | |
| 746 fprintf(fhead,"\n#include \"%s\"", soapStub); | |
| 747 if (cflag) | |
| 748 fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 749 if (namespaceid) | |
| 750 fprintf(fhead,"\n\nnamespace %s {", namespaceid); | |
| 751 fprintf(fhead, "\n#ifndef WITH_NOIDREF"); | |
| 752 if (!cflag && !namespaceid) | |
| 753 fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 754 fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);"); | |
| 755 if (!cflag && !namespaceid) | |
| 756 fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 757 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);"); | |
| 758 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);"); | |
| 759 fprintf(fhead, "\n#endif"); | |
| 760 if (!cflag && !namespaceid) | |
| 761 fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 762 fprintf(fhead, "\nSOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);"); | |
| 763 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);"); | |
| 764 if (!cflag && !namespaceid) | |
| 765 fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 766 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);"); | |
| 767 | |
| 768 generate_header(table); | |
| 769 generate_schema(table); | |
| 770 | |
| 771 if (!Sflag && !iflag && !jflag) | |
| 772 { fprintf(fmsg, "Saving %s client calling stubs\n", pathsoapClient); | |
| 773 fclient=fopen(pathsoapClient,"w"); | |
| 774 if (!fclient) | |
| 775 execerror("Cannot write to file"); | |
| 776 copyrightnote(fclient, soapClient); | |
| 777 fprintf(fclient,"\n\n#if defined(__BORLANDC__)"); | |
| 778 fprintf(fclient,"\n#pragma option push -w-8060"); | |
| 779 fprintf(fclient,"\n#pragma option push -w-8004"); | |
| 780 fprintf(fclient,"\n#endif"); | |
| 781 fprintf(fclient,"\n#include \"%sH.h\"", prefix); | |
| 782 if (cflag) | |
| 783 fprintf(fclient,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 784 if (namespaceid) | |
| 785 fprintf(fclient,"\n\nnamespace %s {", namespaceid); | |
| 786 identify(fclient, soapClient); | |
| 787 | |
| 788 if (!Lflag) | |
| 789 { flib=fopen(pathsoapClientLib,"w"); | |
| 790 if (!flib) | |
| 791 execerror("Cannot write to file"); | |
| 792 copyrightnote(flib, soapClientLib); | |
| 793 fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib); | |
| 794 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); | |
| 795 fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); | |
| 796 fprintf(flib, "\n#define SOAP_FMAC3 static"); | |
| 797 fprintf(flib, "\n#include \"%s\"", soapC); | |
| 798 fprintf(flib, "\n#include \"%s\"", soapClient); | |
| 799 fprintf(flib, "\n\n/* End of %s */\n", soapClientLib); | |
| 800 fclose(flib); | |
| 801 } | |
| 802 } | |
| 803 if (!Cflag && !iflag && !jflag) | |
| 804 { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer); | |
| 805 fserver=fopen(pathsoapServer,"w"); | |
| 806 if (!fserver) | |
| 807 execerror("Cannot write to file"); | |
| 808 copyrightnote(fserver, soapServer); | |
| 809 fprintf(fserver,"\n\n#if defined(__BORLANDC__)"); | |
| 810 fprintf(fserver,"\n#pragma option push -w-8060"); | |
| 811 fprintf(fserver,"\n#pragma option push -w-8004"); | |
| 812 fprintf(fserver,"\n#endif"); | |
| 813 fprintf(fserver,"\n#include \"%sH.h\"", prefix); | |
| 814 if (cflag) | |
| 815 fprintf(fserver,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 816 if (namespaceid) | |
| 817 fprintf(fserver,"\n\nnamespace %s {", namespaceid); | |
| 818 identify(fserver, soapServer); | |
| 819 | |
| 820 if (!Lflag) | |
| 821 { flib = fopen(pathsoapServerLib,"w"); | |
| 822 if (!flib) | |
| 823 execerror("Cannot write to file"); | |
| 824 copyrightnote(flib, soapServerLib); | |
| 825 fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib); | |
| 826 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); | |
| 827 fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); | |
| 828 fprintf(flib, "\n#define SOAP_FMAC3 static"); | |
| 829 fprintf(flib, "\n#include \"%s\"", soapC); | |
| 830 fprintf(flib, "\n#include \"%s\"", soapServer); | |
| 831 fprintf(flib, "\n\n/* End of %s */\n", soapServerLib); | |
| 832 fclose(flib); | |
| 833 } | |
| 834 } | |
| 835 | |
| 836 if (!iflag && !jflag) | |
| 837 soap_serve(table); | |
| 838 | |
| 839 classflag = 0; | |
| 840 for (p = classtable->list; p; p = p->next) | |
| 841 { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0) | |
| 842 { classflag = 1; | |
| 843 break; | |
| 844 } | |
| 845 } | |
| 846 if (classflag || Tptr[Ttemplate]) | |
| 847 { if (cflag) | |
| 848 semwarn("Option -c conflicts with the use of classes"); | |
| 849 } | |
| 850 | |
| 851 for (filenum = 1; partnum == 0; filenum++) | |
| 852 { | |
| 853 if (fflag) | |
| 854 { char *t = strrchr(pathsoapC, '.'); | |
| 855 sprintf(t-3, "%03d", filenum); | |
| 856 *t = '.'; | |
| 857 fprintf(fmsg, "Saving %s serializers (part %d)\n", pathsoapC, filenum); | |
| 858 partnum = fflag; /* number of defs per file */ | |
| 859 } | |
| 860 else | |
| 861 { fprintf(fmsg, "Saving %s serializers\n", pathsoapC); | |
| 862 partnum = 1; | |
| 863 } | |
| 864 fout=fopen(pathsoapC,"w"); | |
| 865 if (!fout) | |
| 866 execerror("Cannot write to file"); | |
| 867 copyrightnote(fout, soapC); | |
| 868 fprintf(fout,"\n\n#if defined(__BORLANDC__)"); | |
| 869 fprintf(fout,"\n#pragma option push -w-8060"); | |
| 870 fprintf(fout,"\n#pragma option push -w-8004"); | |
| 871 fprintf(fout,"\n#endif"); | |
| 872 | |
| 873 fprintf(fout,"\n\n#include \"%sH.h\"", prefix); | |
| 874 if (cflag) | |
| 875 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 876 if (namespaceid) | |
| 877 fprintf(fout,"\n\nnamespace %s {", namespaceid); | |
| 878 identify(fout, soapC); | |
| 879 | |
| 880 if (filenum == 1) | |
| 881 { | |
| 882 | |
| 883 if (!lflag) | |
| 884 { | |
| 885 fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL"); | |
| 886 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}"); | |
| 887 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}"); | |
| 888 if (cflag) | |
| 889 { 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}"); | |
| 890 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}"); | |
| 891 } | |
| 892 else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct) | |
| 893 { 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}"); | |
| 894 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}"); | |
| 895 } | |
| 896 else | |
| 897 { 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}"); | |
| 898 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}"); | |
| 899 } | |
| 900 if (cflag) | |
| 901 { 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}"); | |
| 902 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}"); | |
| 903 } | |
| 904 else if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) | |
| 905 { 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}"); | |
| 906 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}"); | |
| 907 } | |
| 908 else | |
| 909 { 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}"); | |
| 910 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}"); | |
| 911 } | |
| 912 if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) | |
| 913 { 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}"); | |
| 914 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}"); | |
| 915 } | |
| 916 else | |
| 917 { 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}"); | |
| 918 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}"); | |
| 919 } | |
| 920 fprintf(fhead,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap);"); | |
| 921 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}"); | |
| 922 if (cflag) | |
| 923 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}"); | |
| 924 else | |
| 925 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}"); | |
| 926 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}"); | |
| 927 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}"); | |
| 928 fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); | |
| 929 if (has_Detail_string()) | |
| 930 { if (cflag) | |
| 931 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}"); | |
| 932 else | |
| 933 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}"); | |
| 934 } | |
| 935 if (has_detail_string()) | |
| 936 { if (cflag) | |
| 937 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}"); | |
| 938 else | |
| 939 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}"); | |
| 940 } | |
| 941 if (!has_detail_string() && !has_Detail_string()) | |
| 942 fprintf(fout,"\n\treturn NULL;\n}"); | |
| 943 fprintf(fout,"\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); | |
| 944 if (has_Detail_string()) | |
| 945 fprintf(fout,"\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Detail)\n\t\treturn soap->fault->SOAP_ENV__Detail->__any;"); | |
| 946 if (has_detail_string()) | |
| 947 fprintf(fout,"\n\tif (soap->fault->detail)\n\t\treturn soap->fault->detail->__any;"); | |
| 948 fprintf(fout,"\n\treturn NULL;\n}"); | |
| 949 fprintf(fout,"\n\n#endif"); | |
| 950 | |
| 951 fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); | |
| 952 fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{"); | |
| 953 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}"); | |
| 954 fprintf(fout,"\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)"); | |
| 955 fprintf(fout,"\n\t\tsoap->error = SOAP_OK;"); | |
| 956 fprintf(fout,"\n\treturn soap->error;"); | |
| 957 fprintf(fout,"\n}\n#endif"); | |
| 958 | |
| 959 if (!cflag && !namespaceid) | |
| 960 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 961 fprintf(fout,"\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type)\n{\t(void)type;"); | |
| 962 fprintf(fout,"\n\tif (soap_peek_element(soap))\n\t\treturn NULL;"); | |
| 963 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);"); | |
| 964 fprintf(fout,"\n\tswitch (*type)\n\t{"); | |
| 965 DBGLOG(fprintf(stderr,"\n Calling in_defs( ).")); | |
| 966 fflush(fout); | |
| 967 in_defs(table); | |
| 968 DBGLOG(fprintf(stderr,"\n Completed in_defs( ).")); | |
| 969 fprintf(fout,"\n\tdefault:\n#else\n\t*type = 0;\n#endif"); | |
| 970 fprintf(fout,"\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;"); | |
| 971 fflush(fout); | |
| 972 in_defs2(table); | |
| 973 fprintf(fout,"\n\t\tt = soap->tag;"); | |
| 974 in_defs3(table); | |
| 975 fprintf(fout,"\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); | |
| 976 if (!cflag && !namespaceid) | |
| 977 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 978 | |
| 979 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{"); | |
| 980 fprintf(fout,"\n\tif (!soap_peek_element(soap))"); | |
| 981 fprintf(fout,"\n\t{\tint t;"); | |
| 982 fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level=%%u, %%d)\\n\", soap->tag, soap->level, soap->body));"); | |
| 983 fprintf(fout,"\n\t\tif (soap->mustUnderstand && !soap->other)"); | |
| 984 fprintf(fout,"\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;"); | |
| 985 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}"); | |
| 986 fprintf(fout,"\n\t\tif (!*soap->id || !soap_getelement(soap, &t))"); | |
| 987 fprintf(fout,"\n\t\t{\tsoap->peeked = 0;"); | |
| 988 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;"); | |
| 989 fprintf(fout,"\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));"); | |
| 990 fprintf(fout,"\n\t\t\tif (!soap->error && soap->body)"); | |
| 991 fprintf(fout,"\n\t\t\t{\tsoap->level++;"); | |
| 992 fprintf(fout,"\n\t\t\t\twhile (!soap_ignore_element(soap))"); | |
| 993 fprintf(fout,"\n\t\t\t\t\t;"); | |
| 994 fprintf(fout,"\n\t\t\t\tif (soap->error == SOAP_NO_TAG)"); | |
| 995 fprintf(fout,"\n\t\t\t\t\tsoap->error = soap_element_end_in(soap, NULL);"); | |
| 996 fprintf(fout,"\n\t\t\t}"); | |
| 997 fprintf(fout,"\n\t\t}"); | |
| 998 fprintf(fout,"\n\t}"); | |
| 999 fprintf(fout,"\n\treturn soap->error;"); | |
| 1000 fprintf(fout,"\n}"); | |
| 1001 | |
| 1002 fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); | |
| 1003 fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;"); | |
| 1004 fprintf(fout,"\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))"); | |
| 1005 fprintf(fout,"\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)"); | |
| 1006 fprintf(fout,"\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)"); | |
| 1007 fprintf(fout,"\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)"); | |
| 1008 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;"); | |
| 1009 fprintf(fout,"\n\treturn SOAP_OK;\n}\n#endif"); | |
| 1010 | |
| 1011 if (!cflag && !namespaceid) | |
| 1012 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 1013 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;"); | |
| 1014 fprintf(fout,"\n\tswitch (type)\n\t{"); | |
| 1015 fflush(fout); | |
| 1016 out_defs(table); | |
| 1017 fprintf(fout,"\n\t}\n\treturn SOAP_OK;\n}"); | |
| 1018 if (!cflag && !namespaceid) | |
| 1019 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1020 | |
| 1021 fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); | |
| 1022 if (!cflag && !namespaceid) | |
| 1023 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); | |
| 1024 if (is_anytype_flag) | |
| 1025 { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); | |
| 1026 fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); | |
| 1027 fprintf(fout,"\n\tswitch (type)\n\t{"); | |
| 1028 fflush(fout); | |
| 1029 mark_defs(table); | |
| 1030 fprintf(fout,"\n\t}\n}"); | |
| 1031 } | |
| 1032 else | |
| 1033 { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); | |
| 1034 fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); | |
| 1035 fprintf(fout,"\n}"); | |
| 1036 } | |
| 1037 if (!cflag && !namespaceid) | |
| 1038 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1039 fprintf(fout,"\n#endif"); | |
| 1040 | |
| 1041 } | |
| 1042 | |
| 1043 if (!cflag) | |
| 1044 { | |
| 1045 fprintf(fhead,"\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix); | |
| 1046 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); | |
| 1047 if (classtable) | |
| 1048 for (p = classtable->list; p; p = p->next) | |
| 1049 if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) | |
| 1050 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1051 fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); | |
| 1052 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)); | |
| 1053 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1054 fprintf(fout,"\n#endif"); | |
| 1055 } | |
| 1056 if (typetable) | |
| 1057 for (p = typetable->list; p; p = p->next) | |
| 1058 if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) | |
| 1059 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1060 fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); | |
| 1061 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)); | |
| 1062 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1063 fprintf(fout,"\n#endif"); | |
| 1064 } | |
| 1065 for (typ = Tptr[Ttemplate]; typ; typ = typ->next) | |
| 1066 if (typ->ref && !is_transient(typ)) | |
| 1067 fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), c_ident(typ)); | |
| 1068 | |
| 1069 fprintf(fout,"\n\t}\n\treturn NULL;\n}"); | |
| 1070 | |
| 1071 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist*);", prefix); | |
| 1072 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist *p)", prefix); | |
| 1073 fprintf(fout,"\n{\tswitch (p->type)\n\t{"); | |
| 1074 if (classtable) | |
| 1075 { for (p = classtable->list; p; p = p->next) | |
| 1076 if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) | |
| 1077 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1078 fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); | |
| 1079 fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ)); | |
| 1080 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)); | |
| 1081 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1082 fprintf(fout,"\n#endif"); | |
| 1083 } | |
| 1084 } | |
| 1085 if (typetable) | |
| 1086 { for (p = typetable->list; p; p = p->next) | |
| 1087 if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */ | |
| 1088 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1089 fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); | |
| 1090 fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ)); | |
| 1091 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)); | |
| 1092 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) | |
| 1093 fprintf(fout,"\n#endif"); | |
| 1094 } | |
| 1095 } | |
| 1096 for (typ = Tptr[Ttemplate]; typ; typ = typ->next) | |
| 1097 { if (typ->ref && !is_transient(typ)) | |
| 1098 { fprintf(fout,"\n\tcase %s:", soap_type(typ)); | |
| 1099 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)); | |
| 1100 } | |
| 1101 } | |
| 1102 fprintf(fout,"\n\tdefault:\treturn SOAP_ERR;"); | |
| 1103 fprintf(fout,"\n\t}\n\treturn SOAP_OK;"); | |
| 1104 fprintf(fout,"\n}"); | |
| 1105 | |
| 1106 fprintf(fhead,"\nSOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap*, const char*, void*, int, size_t, const char*, const char*);"); | |
| 1107 if (!lflag) | |
| 1108 { | |
| 1109 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)"); | |
| 1110 fprintf(fout, "\n{\treturn soap_id_enter(soap, id, p, t, n, 0, type, arrayType, %s_instantiate);\n}", prefix); | |
| 1111 } | |
| 1112 | |
| 1113 if (Tptr[Ttemplate]) | |
| 1114 { | |
| 1115 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);"); | |
| 1116 if (!lflag) | |
| 1117 { | |
| 1118 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)"); | |
| 1119 fprintf(fout, "\n{\treturn soap_id_forward(soap, href, p, len, st, tt, n, k, %s_container_insert);\n}", prefix); | |
| 1120 } | |
| 1121 | |
| 1122 fprintf(fhead, "\n\nSOAP_FMAC3 void SOAP_FMAC4 %s_container_insert(struct soap*, int, int, void*, size_t, const void*, size_t);", prefix); | |
| 1123 if (!lflag) | |
| 1124 { | |
| 1125 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); | |
| 1126 fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n#pragma warning(disable:4065)\n#endif"); | |
| 1127 fprintf(fout,"\n{\n\t(void)soap; (void)st; (void)p; (void)len; (void)q; (void)n; /* appease -Wall -Werror */"); | |
| 1128 fprintf(fout, "\n\tswitch (tt)\n\t{"); | |
| 1129 for (typ = Tptr[Ttemplate]; typ; typ = typ->next) | |
| 1130 { if (typ->ref && !is_transient(typ)) | |
| 1131 { fprintf(fout, "\n\tcase %s:", soap_type(typ)); | |
| 1132 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); | |
| 1133 if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) | |
| 1134 fprintf(fout, "\n\t\t(*(%s)p)[len] = *(%s)q;", c_type_id(typ, "*"), c_type_id((Tnode*)typ->ref, "*")); | |
| 1135 else | |
| 1136 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, "*")); | |
| 1137 fprintf(fout, "\n\t\tbreak;"); | |
| 1138 } | |
| 1139 } | |
| 1140 fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type=%%d in %%d\\n\", st, tt));"); | |
| 1141 fprintf(fout, "\n\t}"); | |
| 1142 fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); | |
| 1143 fprintf(fout, "\n}"); | |
| 1144 } | |
| 1145 } | |
| 1146 } | |
| 1147 } | |
| 1148 | |
| 1149 def_table(table); | |
| 1150 | |
| 1151 if (namespaceid) | |
| 1152 fprintf(fout,"\n\n} // namespace %s\n", namespaceid); | |
| 1153 if (cflag) | |
| 1154 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1155 fprintf(fout,"\n\n#if defined(__BORLANDC__)"); | |
| 1156 fprintf(fout,"\n#pragma option pop"); | |
| 1157 fprintf(fout,"\n#pragma option pop"); | |
| 1158 fprintf(fout,"\n#endif"); | |
| 1159 fprintf(fout, "\n\n/* End of %s */\n", soapC); | |
| 1160 fclose(fout); | |
| 1161 } | |
| 1162 | |
| 1163 if (namespaceid) | |
| 1164 fprintf(fhead,"\n\n} // namespace %s\n", namespaceid); | |
| 1165 if (cflag) | |
| 1166 fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1167 fprintf(fhead, "\n\n#endif"); | |
| 1168 fprintf(fhead, "\n\n/* End of %s */\n", soapH); | |
| 1169 fclose(fhead); | |
| 1170 | |
| 1171 if (namespaceid) | |
| 1172 fprintf(fheader,"\n\n} // namespace %s\n", namespaceid); | |
| 1173 if (cflag) | |
| 1174 fprintf(fheader,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1175 fprintf(fheader, "\n\n#endif"); | |
| 1176 fprintf(fheader, "\n\n/* End of %s */\n", soapStub); | |
| 1177 fclose(fheader); | |
| 1178 | |
| 1179 if (mflag) | |
| 1180 { DBGLOG(fprintf(stderr,"\n Calling matlab_def_table( ).")); | |
| 1181 matlab_def_table(table); | |
| 1182 DBGLOG(fprintf(stderr,"\n Completed matlab_def_table( ).")); | |
| 1183 fclose(fmatlab); | |
| 1184 fclose(fmheader); | |
| 1185 } | |
| 1186 | |
| 1187 if (!Sflag && !iflag && !jflag) | |
| 1188 { if (namespaceid) | |
| 1189 fprintf(fclient,"\n\n} // namespace %s\n", namespaceid); | |
| 1190 if (cflag) | |
| 1191 fprintf(fclient,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1192 fprintf(fclient,"\n\n#if defined(__BORLANDC__)"); | |
| 1193 fprintf(fclient,"\n#pragma option pop"); | |
| 1194 fprintf(fclient,"\n#pragma option pop"); | |
| 1195 fprintf(fclient,"\n#endif"); | |
| 1196 fprintf(fclient, "\n\n/* End of %s */\n", soapClient); | |
| 1197 fclose(fclient); | |
| 1198 } | |
| 1199 | |
| 1200 if (!Cflag && !iflag && !jflag) | |
| 1201 { if (namespaceid) | |
| 1202 fprintf(fserver,"\n\n} // namespace %s\n", namespaceid); | |
| 1203 if (cflag) | |
| 1204 fprintf(fserver,"\n\n#ifdef __cplusplus\n}\n#endif"); | |
| 1205 fprintf(fserver,"\n\n#if defined(__BORLANDC__)"); | |
| 1206 fprintf(fserver,"\n#pragma option pop"); | |
| 1207 fprintf(fserver,"\n#pragma option pop"); | |
| 1208 fprintf(fserver,"\n#endif"); | |
| 1209 fprintf(fserver, "\n\n/* End of %s */\n", soapServer); | |
| 1210 fclose(fserver); | |
| 1211 } | |
| 1212 } | |
| 1213 | |
| 1214 void | |
| 1215 gen_class(FILE *fd, Entry *p) | |
| 1216 { Entry *Eptr; | |
| 1217 Tnode *typ = p->info.typ; | |
| 1218 char *x; | |
| 1219 x = xsi_type(typ); | |
| 1220 if (!x || !*x) | |
| 1221 x = wsdl_type(typ, ""); | |
| 1222 typ->classed = True; | |
| 1223 if (is_header_or_fault(typ) || is_body(typ)) | |
| 1224 fprintf(fd, "\n\n#ifndef WITH_NOGLOBAL"); | |
| 1225 if (typ->ref) | |
| 1226 { fprintf(fd, "\n\n#ifndef %s", soap_type(typ)); | |
| 1227 fprintf(fd, "\n#define %s (%d)\n",soap_type(typ),typ->num); | |
| 1228 } | |
| 1229 else | |
| 1230 fprintf(fd, "\n\n"); | |
| 1231 if (is_volatile(typ)) | |
| 1232 fprintf(fd, "#if 0 /* volatile type: do not declare here, declared elsewhere */\n"); | |
| 1233 else if (is_transient(typ) && typ->ref) | |
| 1234 fprintf(fd, "/* Transient type: */\n"); | |
| 1235 else if (is_invisible(typ->id->name) && typ->ref) | |
| 1236 fprintf(fd, "/* Operation wrapper: */\n"); | |
| 1237 else if (is_hexBinary(typ)) | |
| 1238 fprintf(fd, "/* hexBinary schema type: */\n"); | |
| 1239 else if (is_binary(typ)) | |
| 1240 fprintf(fd, "/* Base64 schema type: */\n"); | |
| 1241 else if (is_discriminant(typ)) | |
| 1242 fprintf(fd, "/* Choice: */\n"); | |
| 1243 else if (is_dynamic_array(typ)) | |
| 1244 { Eptr = ((Table*)typ->ref)->list; | |
| 1245 if (has_ns(typ) || is_untyped(typ)) | |
| 1246 fprintf(fd, "/* Sequence of %s schema type: */\n", x); | |
| 1247 else | |
| 1248 { if (!eflag) | |
| 1249 { sprintf(errbuf, "array '%s' is not compliant with WS-I Basic Profile 1.0a, reason: SOAP encoded array", c_type(typ)); | |
| 1250 compliancewarn(errbuf); | |
| 1251 } | |
| 1252 fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); | |
| 1253 } | |
| 1254 } | |
| 1255 else if (is_primclass(typ)) | |
| 1256 fprintf(fd, "/* Primitive %s schema type: */\n", x); | |
| 1257 else if (!strcmp(typ->id->name, "SOAP_ENV__Header")) | |
| 1258 fprintf(fd, "/* SOAP Header: */\n"); | |
| 1259 else if (!strcmp(typ->id->name, "SOAP_ENV__Fault")) | |
| 1260 fprintf(fd, "/* SOAP Fault: */\n"); | |
| 1261 else if (!strcmp(typ->id->name, "SOAP_ENV__Code")) | |
| 1262 fprintf(fd, "/* SOAP Fault Code: */\n"); | |
| 1263 else if (x && *x && typ->ref) | |
| 1264 fprintf(fd, "/* %s */\n", x); | |
| 1265 fflush(fd); | |
| 1266 if (typ->type == Tstruct) | |
| 1267 { DBGLOG(fprintf(stderr,"\nstruct %s\n", typ->id->name)); | |
| 1268 if (typ->ref) | |
| 1269 { int permission = -1; | |
| 1270 fprintf(fd, "struct %s\n{", ident(typ->id->name)); | |
| 1271 for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) | |
| 1272 { if (!cflag && permission != (Eptr->info.sto & (Sprivate | Sprotected))) | |
| 1273 { if (Eptr->info.sto & Sprivate) | |
| 1274 fprintf(fd, "\nprivate:"); | |
| 1275 else if (Eptr->info.sto & Sprotected) | |
| 1276 fprintf(fd, "\nprotected:"); | |
| 1277 else | |
| 1278 fprintf(fd, "\npublic:"); | |
| 1279 permission = (Eptr->info.sto & (Sprivate | Sprotected)); | |
| 1280 } | |
| 1281 if (cflag && Eptr->info.typ->type == Tfun) | |
| 1282 continue; | |
| 1283 if (cflag && (Eptr->info.sto & Stypedef)) | |
| 1284 continue; | |
| 1285 fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); | |
| 1286 /*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) | |
| 1287 fprintf(fd, "class "); | |
| 1288 */ | |
| 1289 if (Eptr->sym == typ->id && Eptr->info.typ->type == Tfun) /* a hack to emit constructor in a struct, where constructor has no return value */ | |
| 1290 ((FNinfo*)Eptr->info.typ->ref)->ret = mknone(); | |
| 1291 fprintf(fd, "%s", c_type_id(Eptr->info.typ,Eptr->sym->name)); | |
| 1292 if (Eptr->info.sto & Sconst) | |
| 1293 fprintf(fd, "%s;", c_init(Eptr)); | |
| 1294 else if (Eptr->info.sto & Sconstobj) | |
| 1295 fprintf(fd, " const;"); | |
| 1296 else | |
| 1297 fprintf(fd, ";"); | |
| 1298 if (Eptr->info.sto & Sreturn) | |
| 1299 fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); | |
| 1300 if (is_external(Eptr->info.typ)) | |
| 1301 fprintf(fd, "\t/* external */"); | |
| 1302 if (is_transient(Eptr->info.typ)) | |
| 1303 fprintf(fd, "\t/* transient */"); | |
| 1304 if (is_imported(Eptr->info.typ)) | |
| 1305 fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); | |
| 1306 if (Eptr->info.sto & Sattribute) | |
| 1307 { if (Eptr->info.minOccurs >= 1) | |
| 1308 fprintf(fd, "\t/* required attribute of type %s */", wsdl_type(Eptr->info.typ, "")); | |
| 1309 else | |
| 1310 fprintf(fd, "\t/* optional attribute of type %s */", wsdl_type(Eptr->info.typ, "")); | |
| 1311 } | |
| 1312 if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 1313 fprintf(fd, "\t/* not serialized */"); | |
| 1314 else if (Eptr->info.sto & SmustUnderstand) | |
| 1315 fprintf(fd, "\t/* mustUnderstand */"); | |
| 1316 else if (!is_dynamic_array(typ) && is_repetition(Eptr)) | |
| 1317 { if (Eptr->info.maxOccurs > 1) | |
| 1318 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)); | |
| 1319 else | |
| 1320 fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name)); | |
| 1321 } | |
| 1322 else if (is_anytype(Eptr)) | |
| 1323 fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name)); | |
| 1324 else if (is_choice(Eptr)) | |
| 1325 fprintf(fd, "\t/* union discriminant (of union defined below) */"); | |
| 1326 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)) | |
| 1327 { if (Eptr->info.maxOccurs > 1) | |
| 1328 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, "")); | |
| 1329 else if (Eptr->info.minOccurs >= 1) | |
| 1330 fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, "")); | |
| 1331 else | |
| 1332 fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, "")); | |
| 1333 } | |
| 1334 if (!is_dynamic_array(typ) && !is_primclass(typ)) | |
| 1335 { if (!strncmp(Eptr->sym->name, "__size", 6)) | |
| 1336 { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer) | |
| 1337 { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); | |
| 1338 semwarn(errbuf); | |
| 1339 } | |
| 1340 } | |
| 1341 else if (!strncmp(Eptr->sym->name, "__type", 6)) | |
| 1342 { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) | |
| 1343 { 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); | |
| 1344 semwarn(errbuf); | |
| 1345 } | |
| 1346 } | |
| 1347 } | |
| 1348 } | |
| 1349 if (!cflag && !is_transient(typ) && !is_volatile(typ)) | |
| 1350 { fprintf(fd,"\npublic:\n\tint soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); | |
| 1351 #if 0 | |
| 1352 /* ctor not allowed in unions, so keep things simple for structs */ | |
| 1353 if (!has_constructor(typ)) | |
| 1354 { fprintf(fd,"\n\t %s()", ident(typ->id->name)); | |
| 1355 fprintf(fd, " { void soap_default_%s(struct soap*, %s); soap_default_%s(NULL, this); }", c_ident(typ), c_type_id(typ, "*"), c_ident(typ)); | |
| 1356 } | |
| 1357 if (!has_destructor(typ)) | |
| 1358 fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name)); | |
| 1359 #endif | |
| 1360 } | |
| 1361 if (!((Table*)typ->ref)->list) | |
| 1362 { if (cflag) | |
| 1363 fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); | |
| 1364 else | |
| 1365 fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); | |
| 1366 } | |
| 1367 fprintf(fd, "\n};"); | |
| 1368 } | |
| 1369 else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) | |
| 1370 { sprintf(errbuf, "struct '%s' is empty", typ->id->name); | |
| 1371 semwarn(errbuf); | |
| 1372 } | |
| 1373 } | |
| 1374 else if (typ->type == Tclass) | |
| 1375 { DBGLOG(fprintf(stderr,"\nclass %s\n", typ->id->name)); | |
| 1376 if (typ->ref) | |
| 1377 { int permission = -1; | |
| 1378 fprintf(fd,"class SOAP_CMAC %s", ident(typ->id->name)); | |
| 1379 if (typ->base) | |
| 1380 fprintf(fd," : public %s", ident(typ->base->name)); | |
| 1381 fprintf(fd,"\n{"); | |
| 1382 for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) | |
| 1383 { if (permission != (Eptr->info.sto & (Sprivate | Sprotected))) | |
| 1384 { if (Eptr->info.sto & Sprivate) | |
| 1385 fprintf(fd, "\nprivate:"); | |
| 1386 else if (Eptr->info.sto & Sprotected) | |
| 1387 fprintf(fd, "\nprotected:"); | |
| 1388 else | |
| 1389 fprintf(fd, "\npublic:"); | |
| 1390 permission = (Eptr->info.sto & (Sprivate | Sprotected)); | |
| 1391 } | |
| 1392 fprintf(fd,"\n\t%s", c_storage(Eptr->info.sto)); | |
| 1393 /* 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) | |
| 1394 fprintf(fd, "class "); | |
| 1395 */ | |
| 1396 fprintf(fd,"%s", c_type_id(Eptr->info.typ,Eptr->sym->name)); | |
| 1397 if (Eptr->info.sto & Sconstobj) | |
| 1398 fprintf(fd, " const"); | |
| 1399 if (Eptr->info.sto & Sconst) | |
| 1400 fprintf(fd, "%s;", c_init(Eptr)); | |
| 1401 else if (Eptr->info.sto & Sabstract) | |
| 1402 fprintf(fd, " = 0;"); | |
| 1403 else | |
| 1404 fprintf(fd, ";"); | |
| 1405 if (Eptr->info.sto & Sreturn) | |
| 1406 fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); | |
| 1407 if (is_external(Eptr->info.typ)) | |
| 1408 fprintf(fd, "\t/* external */"); | |
| 1409 if (is_transient(Eptr->info.typ)) | |
| 1410 fprintf(fd, "\t/* transient */"); | |
| 1411 if (is_imported(Eptr->info.typ)) | |
| 1412 fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); | |
| 1413 if (Eptr->info.sto & Sattribute) | |
| 1414 { if (Eptr->info.minOccurs >= 1) | |
| 1415 fprintf(fd, "\t/* required attribute */"); | |
| 1416 else | |
| 1417 fprintf(fd, "\t/* optional attribute */"); | |
| 1418 } | |
| 1419 if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 1420 fprintf(fd, "\t/* not serialized */"); | |
| 1421 else if (Eptr->info.sto & SmustUnderstand) | |
| 1422 fprintf(fd, "\t/* mustUnderstand */"); | |
| 1423 else if (!is_dynamic_array(typ) && is_repetition(Eptr)) | |
| 1424 { if (Eptr->info.maxOccurs > 1) | |
| 1425 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)); | |
| 1426 else | |
| 1427 fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name)); | |
| 1428 } | |
| 1429 else if (is_anytype(Eptr)) | |
| 1430 fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name)); | |
| 1431 else if (is_choice(Eptr)) | |
| 1432 fprintf(fd, "\t/* union discriminant (of union defined below) */"); | |
| 1433 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)) | |
| 1434 { if (Eptr->info.maxOccurs > 1) | |
| 1435 fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements */", Eptr->info.minOccurs, Eptr->info.maxOccurs); | |
| 1436 else if (Eptr->info.minOccurs >= 1) | |
| 1437 fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, "")); | |
| 1438 else | |
| 1439 fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, "")); | |
| 1440 } | |
| 1441 if (!is_dynamic_array(typ) && !is_primclass(typ)) | |
| 1442 { if (!strncmp(Eptr->sym->name, "__size", 6)) | |
| 1443 { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer) | |
| 1444 { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); | |
| 1445 semwarn(errbuf); | |
| 1446 } | |
| 1447 } | |
| 1448 else if (!strncmp(Eptr->sym->name, "__type", 6)) | |
| 1449 { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) | |
| 1450 { 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); | |
| 1451 semwarn(errbuf); | |
| 1452 } | |
| 1453 } | |
| 1454 } | |
| 1455 } | |
| 1456 if (!is_transient(typ) && !is_volatile(typ)) | |
| 1457 { fprintf(fd,"\npublic:\n\tvirtual int soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); | |
| 1458 fprintf(fd,"\n\tvirtual void soap_default(struct soap*);"); | |
| 1459 fprintf(fd,"\n\tvirtual void soap_serialize(struct soap*) const;"); | |
| 1460 if (kflag) | |
| 1461 fprintf(fd,"\n\tvirtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); | |
| 1462 fprintf(fd,"\n\tvirtual int soap_put(struct soap*, const char*, const char*) const;"); | |
| 1463 fprintf(fd,"\n\tvirtual int soap_out(struct soap*, const char*, int, const char*) const;"); | |
| 1464 fprintf(fd,"\n\tvirtual void *soap_get(struct soap*, const char*, const char*);"); | |
| 1465 fprintf(fd,"\n\tvirtual void *soap_in(struct soap*, const char*, const char*);"); | |
| 1466 if (!has_constructor(typ)) | |
| 1467 { fprintf(fd,"\n\t %s()", ident(typ->id->name)); | |
| 1468 fprintf(fd, " { %s::soap_default(NULL); }", ident(typ->id->name)); | |
| 1469 } | |
| 1470 if (!has_destructor(typ)) | |
| 1471 fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name)); | |
| 1472 /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) | |
| 1473 fprintf(fd,"\n\tfriend %s *soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", typ->id->name, typ->id->name); | |
| 1474 fprintf(fd,"\n\tfriend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); | |
| 1475 fprintf(fd,"\n\tfriend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); | |
| 1476 */ | |
| 1477 } | |
| 1478 else if (!((Table*)typ->ref)->list) | |
| 1479 fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); | |
| 1480 fprintf(fd,"\n};"); | |
| 1481 } | |
| 1482 else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) | |
| 1483 { sprintf(errbuf, "class '%s' is empty", typ->id->name); | |
| 1484 semwarn(errbuf); | |
| 1485 } | |
| 1486 } | |
| 1487 else if (typ->type == Tunion) | |
| 1488 { int i = 1; | |
| 1489 if (typ->ref) | |
| 1490 { fprintf(fd, "union %s\n{", ident(typ->id->name)); | |
| 1491 for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) | |
| 1492 { fprintf(fd, "\n#define SOAP_UNION_%s_%s\t(%d)", c_ident(typ), ident(Eptr->sym->name), i); | |
| 1493 i++; | |
| 1494 fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); | |
| 1495 fprintf(fd, "%s;", c_type_id(Eptr->info.typ,Eptr->sym->name)); | |
| 1496 if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 1497 fprintf(fd, "\t/* const field cannot be deserialized */"); | |
| 1498 if (is_external(Eptr->info.typ)) | |
| 1499 fprintf(fd, "\t/* external */"); | |
| 1500 if (is_transient(Eptr->info.typ)) | |
| 1501 fprintf(fd, "\t/* transient */"); | |
| 1502 if (Eptr->info.sto & Sattribute) | |
| 1503 { fprintf(fd, "\t/* attribute not allowed in union */"); | |
| 1504 sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); | |
| 1505 semwarn(errbuf); | |
| 1506 } | |
| 1507 if (Eptr->info.sto & SmustUnderstand) | |
| 1508 fprintf(fd, "\t/* mustUnderstand */"); | |
| 1509 } | |
| 1510 fprintf(fd, "\n};"); | |
| 1511 } | |
| 1512 else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) | |
| 1513 { sprintf(errbuf, "union '%s' is empty", typ->id->name); | |
| 1514 semwarn(errbuf); | |
| 1515 } | |
| 1516 } | |
| 1517 if (is_volatile(typ)) | |
| 1518 fprintf(fd, "\n#endif"); | |
| 1519 if ((typ->type == Tstruct || typ->type == Tunion) && p->sym->token == TYPE) | |
| 1520 fprintf(fd, "\ntypedef %s %s;", c_type(typ), ident(p->sym->name)); | |
| 1521 if (typ->ref) | |
| 1522 fprintf(fd, "\n#endif"); | |
| 1523 if (is_header_or_fault(typ) || is_body(typ)) | |
| 1524 fprintf(fd, "\n\n#endif"); | |
| 1525 fflush(fd); | |
| 1526 } | |
| 1527 | |
| 1528 void | |
| 1529 generate_header(Table *t) | |
| 1530 { Entry *p, *q; | |
| 1531 banner(fheader, "Enumerations"); | |
| 1532 fflush(fheader); | |
| 1533 if (enumtable) | |
| 1534 for (p = enumtable->list; p; p = p->next) | |
| 1535 { char *x; | |
| 1536 if (is_imported(p->info.typ) || (is_transient(p->info.typ) && !p->info.typ->ref)) | |
| 1537 continue; | |
| 1538 x = xsi_type(p->info.typ); | |
| 1539 if (!x || !*x) | |
| 1540 x = wsdl_type(p->info.typ, ""); | |
| 1541 fprintf(fheader, "\n\n#ifndef %s", soap_type(p->info.typ)); | |
| 1542 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); | |
| 1543 if (is_volatile(p->info.typ)) | |
| 1544 fprintf(fheader, "\n#if 0 /* volatile type: do not redeclare here */"); | |
| 1545 if (is_mask(p->info.typ)) | |
| 1546 fprintf(fheader, "\n/* Bitmask %s */", x); | |
| 1547 else | |
| 1548 fprintf(fheader, "\n/* %s */", x); | |
| 1549 fprintf(fheader, "\nenum %s { ", ident(p->info.typ->id->name)); | |
| 1550 if ((Table*)p->info.typ->ref) | |
| 1551 { const char *c = ""; | |
| 1552 for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 1553 { if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) | |
| 1554 fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); | |
| 1555 else | |
| 1556 fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); | |
| 1557 c = ", "; | |
| 1558 } | |
| 1559 } | |
| 1560 fprintf(fheader, " };"); | |
| 1561 if (p->sym->token == TYPE) | |
| 1562 fprintf(fheader, "\ntypedef %s %s;", c_type(p->info.typ), ident(p->sym->name)); | |
| 1563 if (is_volatile(p->info.typ)) | |
| 1564 fprintf(fheader, "\n#endif"); | |
| 1565 fprintf(fheader, "\n#endif"); | |
| 1566 } | |
| 1567 banner(fheader, "Types with Custom Serializers"); | |
| 1568 fflush(fheader); | |
| 1569 if (typetable) | |
| 1570 for (p = typetable->list; p; p = p->next) | |
| 1571 { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) | |
| 1572 { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); | |
| 1573 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); | |
| 1574 fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); | |
| 1575 fprintf(fheader, "\n#endif"); | |
| 1576 } | |
| 1577 } | |
| 1578 if (typetable) | |
| 1579 for (p = typetable->list; p; p = p->next) | |
| 1580 { 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)) | |
| 1581 { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); | |
| 1582 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); | |
| 1583 fprintf(fheader,"\n%sstd::string %s;", c_storage(p->info.sto), p->sym->name); | |
| 1584 fprintf(fheader, "\n#endif\n"); | |
| 1585 } | |
| 1586 } | |
| 1587 banner(fheader, "Classes and Structs"); | |
| 1588 fflush(fheader); | |
| 1589 if (classtable) | |
| 1590 for (p = classtable->list; p; p = p->next) | |
| 1591 { if (!is_imported(p->info.typ)) | |
| 1592 gen_class(fheader, p); | |
| 1593 } | |
| 1594 banner(fheader, "Typedefs"); | |
| 1595 fflush(fheader); | |
| 1596 if (typetable) | |
| 1597 for (p = typetable->list; p; p = p->next) | |
| 1598 { 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)) | |
| 1599 { 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); | |
| 1600 semwarn(errbuf); | |
| 1601 } | |
| 1602 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)) | |
| 1603 continue; | |
| 1604 if (!is_external(p->info.typ) && !is_imported(p->info.typ)) | |
| 1605 { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); | |
| 1606 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); | |
| 1607 fprintf(fheader,"\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); | |
| 1608 fprintf(fheader, "\n#endif\n"); | |
| 1609 } | |
| 1610 } | |
| 1611 banner(fheader, "Externals"); | |
| 1612 fflush(fheader); | |
| 1613 if (t) | |
| 1614 for (p = t->list; p; p = p->next) | |
| 1615 if (p->info.typ->type != Tfun || p->info.sto & Sextern) | |
| 1616 { fprintf(fheader,"\n\nextern %s", c_storage(p->info.sto)); | |
| 1617 fprintf(fheader,"%s;", c_type_id(p->info.typ, p->sym->name)); | |
| 1618 } | |
| 1619 fflush(fheader); | |
| 1620 } | |
| 1621 | |
| 1622 void | |
| 1623 get_namespace_prefixes(void) | |
| 1624 { Symbol *p, *q; | |
| 1625 int i, n; | |
| 1626 char *s, buf[256]; | |
| 1627 if (nslist) | |
| 1628 return; | |
| 1629 for (p = symlist; p; p = p->next) | |
| 1630 { if (*p->name != '~') | |
| 1631 { s = p->name; | |
| 1632 while (*s == '_') | |
| 1633 s++; | |
| 1634 n = (int)(strlen(s) - 2); | |
| 1635 for (i = 1; i < n; i++) | |
| 1636 { if (s[i] == ':' | |
| 1637 || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') | |
| 1638 || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) | |
| 1639 || !strncmp(s+i, "___USCORE", 9) | |
| 1640 || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) | |
| 1641 { if (s[i+1] == ':') | |
| 1642 { i++; | |
| 1643 continue; | |
| 1644 } | |
| 1645 strncpy(buf, s, i); | |
| 1646 buf[i] = '\0'; | |
| 1647 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)) | |
| 1648 goto nsnext; | |
| 1649 for (q = nslist; q; q = q->next) | |
| 1650 if (!strcmp(q->name, buf)) | |
| 1651 goto nsnext; | |
| 1652 q = (Symbol*)emalloc(sizeof(Symbol)); | |
| 1653 q->name = (char*)emalloc(i+1); | |
| 1654 strcpy(q->name, buf); | |
| 1655 q->name[i] = '\0'; | |
| 1656 q->next = nslist; | |
| 1657 nslist = q; | |
| 1658 break; | |
| 1659 } | |
| 1660 } | |
| 1661 } | |
| 1662 nsnext: | |
| 1663 ; | |
| 1664 } | |
| 1665 q = (Symbol*)emalloc(sizeof(Symbol)); | |
| 1666 q->name = "xsd"; | |
| 1667 q->next = nslist; | |
| 1668 nslist = q; | |
| 1669 q = (Symbol*)emalloc(sizeof(Symbol)); | |
| 1670 q->name = "xsi"; | |
| 1671 q->next = nslist; | |
| 1672 nslist = q; | |
| 1673 q = (Symbol*)emalloc(sizeof(Symbol)); | |
| 1674 q->name = "SOAP-ENC"; | |
| 1675 q->next = nslist; | |
| 1676 nslist = q; | |
| 1677 q = (Symbol*)emalloc(sizeof(Symbol)); | |
| 1678 q->name = "SOAP-ENV"; | |
| 1679 q->next = nslist; | |
| 1680 nslist = q; | |
| 1681 } | |
| 1682 | |
| 1683 void | |
| 1684 generate_schema(Table *t) | |
| 1685 { Entry *p; | |
| 1686 Symbol *ns; | |
| 1687 char *name = NULL; | |
| 1688 char *URL = NULL; | |
| 1689 char *executable = NULL; | |
| 1690 char *URI = NULL; | |
| 1691 char *style = NULL; | |
| 1692 char *encoding = NULL; | |
| 1693 char *protocol = NULL; | |
| 1694 char *import = NULL; | |
| 1695 Service *sp = NULL; | |
| 1696 char buf[1024]; | |
| 1697 FILE *fd; | |
| 1698 int flag = 0; | |
| 1699 get_namespace_prefixes(); | |
| 1700 for (ns = nslist; ns; ns = ns->next) | |
| 1701 { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) | |
| 1702 continue; | |
| 1703 name = NULL; | |
| 1704 URL = NULL; | |
| 1705 executable = NULL; | |
| 1706 URI = NULL; | |
| 1707 style = NULL; | |
| 1708 encoding = NULL; | |
| 1709 import = NULL; | |
| 1710 for (sp = services; sp; sp = sp->next) | |
| 1711 { if (!tagcmp(sp->ns, ns->name)) | |
| 1712 { name = ns_cname(sp->name, NULL); | |
| 1713 URL = sp->URL; | |
| 1714 executable = sp->executable; | |
| 1715 URI = sp->URI; | |
| 1716 style = sp->style; | |
| 1717 encoding = sp->encoding; | |
| 1718 protocol = sp->protocol; | |
| 1719 import = sp->import; | |
| 1720 break; | |
| 1721 } | |
| 1722 } | |
| 1723 if (!URI) | |
| 1724 { URI = emalloc(strlen(tmpURI) + strlen(ns->name) + 6); | |
| 1725 sprintf(URI, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); | |
| 1726 } | |
| 1727 if (vflag >= 0 && is_document(style) && encoding && !*encoding) | |
| 1728 { semwarn("Cannot use document style with SOAP encoding"); | |
| 1729 encoding = NULL; | |
| 1730 } | |
| 1731 if (!name) | |
| 1732 name = "Service"; | |
| 1733 if (!URL) | |
| 1734 URL = "http://localhost:80"; | |
| 1735 if (!import) | |
| 1736 flag = 1; | |
| 1737 if (t) | |
| 1738 { for (p = t->list; p; p = p->next) | |
| 1739 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) | |
| 1740 { if (name) | |
| 1741 fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); | |
| 1742 if (protocol) | |
| 1743 fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); | |
| 1744 if (style && vflag >= 0) | |
| 1745 fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); | |
| 1746 else if (!eflag && vflag >= 0) | |
| 1747 fprintf(fmsg, "Using %s service style: document\n", ns->name); | |
| 1748 if (encoding && *encoding) | |
| 1749 fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); | |
| 1750 else if (encoding && !*encoding && vflag >= 0) | |
| 1751 fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); | |
| 1752 else if (!eflag && vflag >= 0) | |
| 1753 fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); | |
| 1754 if (URL) | |
| 1755 fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); | |
| 1756 if (executable) | |
| 1757 fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); | |
| 1758 if (import) | |
| 1759 fprintf(fmsg, "Using %s schema import: %s\n", ns->name, import); | |
| 1760 else if (URI) | |
| 1761 fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); | |
| 1762 if (sp && sp->name) | |
| 1763 sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); | |
| 1764 else | |
| 1765 sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); | |
| 1766 if (!wflag && !import) | |
| 1767 { fprintf(fmsg, "Saving %s Web Service description\n", buf); | |
| 1768 fd = fopen(buf, "w"); | |
| 1769 if (!fd) | |
| 1770 execerror("Cannot write WSDL file"); | |
| 1771 gen_wsdl(fd, t, ns->name, name, URL, executable, URI, style, encoding, protocol); | |
| 1772 fclose(fd); | |
| 1773 } | |
| 1774 if (!cflag) | |
| 1775 { if (iflag || jflag) | |
| 1776 { char *sname; | |
| 1777 if (sp && sp->name) | |
| 1778 sname = sp->name; | |
| 1779 else | |
| 1780 sname = ""; | |
| 1781 if (!Sflag) | |
| 1782 { char *name1 = ns_cname(sname, "Proxy"); | |
| 1783 sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); | |
| 1784 fprintf(fmsg, "Saving %s client proxy class\n", buf); | |
| 1785 fd = fopen(buf, "w"); | |
| 1786 if (!fd) | |
| 1787 execerror("Cannot write proxy class file"); | |
| 1788 sprintf(buf, "%s%s.h", prefix, name1); | |
| 1789 copyrightnote(fd, buf); | |
| 1790 gen_proxy_header(fd, t, ns, name1, URL, executable, URI, encoding); | |
| 1791 fclose(fd); | |
| 1792 sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); | |
| 1793 fprintf(fmsg, "Saving %s client proxy class\n", buf); | |
| 1794 fd = fopen(buf, "w"); | |
| 1795 if (!fd) | |
| 1796 execerror("Cannot write proxy class file"); | |
| 1797 sprintf(buf, "%s%s.cpp", prefix, name1); | |
| 1798 copyrightnote(fd, buf); | |
| 1799 gen_proxy_code(fd, t, ns, name1, URL, executable, URI, encoding); | |
| 1800 fclose(fd); | |
| 1801 } | |
| 1802 if (!Cflag) | |
| 1803 { char *name1 = ns_cname(sname, "Service"); | |
| 1804 sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); | |
| 1805 fprintf(fmsg, "Saving %s service class\n", buf); | |
| 1806 fd = fopen(buf, "w"); | |
| 1807 if (!fd) | |
| 1808 execerror("Cannot write service class file"); | |
| 1809 sprintf(buf, "%s%s.h", prefix, name1); | |
| 1810 copyrightnote(fd, buf); | |
| 1811 gen_object_header(fd, t, ns, name1, URL, executable, URI, encoding); | |
| 1812 fclose(fd); | |
| 1813 sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); | |
| 1814 fprintf(fmsg, "Saving %s service class\n", buf); | |
| 1815 fd = fopen(buf, "w"); | |
| 1816 if (!fd) | |
| 1817 execerror("Cannot write service class file"); | |
| 1818 sprintf(buf, "%s%s.cpp", prefix, name1); | |
| 1819 copyrightnote(fd, buf); | |
| 1820 gen_object_code(fd, t, ns, name1, URL, executable, URI, encoding); | |
| 1821 fclose(fd); | |
| 1822 } | |
| 1823 } | |
| 1824 else if (zflag == 1) | |
| 1825 { if (!Sflag && sp && sp->name) | |
| 1826 { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); | |
| 1827 fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); | |
| 1828 fd = fopen(buf, "w"); | |
| 1829 if (!fd) | |
| 1830 execerror("Cannot write proxy file"); | |
| 1831 sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); | |
| 1832 copyrightnote(fd, buf); | |
| 1833 gen_proxy(fd, t, ns, name, URL, executable, URI, encoding); | |
| 1834 fclose(fd); | |
| 1835 } | |
| 1836 else if (!Sflag) | |
| 1837 { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); | |
| 1838 fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); | |
| 1839 fd = fopen(buf, "w"); | |
| 1840 if (!fd) | |
| 1841 execerror("Cannot write proxy file"); | |
| 1842 sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); | |
| 1843 copyrightnote(fd, buf); | |
| 1844 gen_proxy(fd, t, ns, "Service", URL, executable, URI, encoding); | |
| 1845 fclose(fd); | |
| 1846 } | |
| 1847 if (!Cflag && sp && sp->name) | |
| 1848 { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); | |
| 1849 fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); | |
| 1850 fd = fopen(buf, "w"); | |
| 1851 if (!fd) | |
| 1852 execerror("Cannot write server object file"); | |
| 1853 sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); | |
| 1854 copyrightnote(fd, buf); | |
| 1855 gen_object(fd, t, ns, name, URL, executable, URI, encoding); | |
| 1856 fclose(fd); | |
| 1857 } | |
| 1858 else if (!Cflag) | |
| 1859 { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); | |
| 1860 fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); | |
| 1861 fd = fopen(buf, "w"); | |
| 1862 if (!fd) | |
| 1863 execerror("Cannot write server object file"); | |
| 1864 sprintf(buf, "%s.h", ns_cname(prefix, "Object")); | |
| 1865 copyrightnote(fd, buf); | |
| 1866 gen_object(fd, t, ns, "Service", URL, executable, URI, encoding); | |
| 1867 fclose(fd); | |
| 1868 } | |
| 1869 } | |
| 1870 } | |
| 1871 if (!xflag) | |
| 1872 { strcpy(buf, dirpath); | |
| 1873 if (sp && sp->name) | |
| 1874 strcat(buf, ns_fname(name)); | |
| 1875 else | |
| 1876 strcat(buf, ns_fname(ns->name)); | |
| 1877 strcat(buf, "."); | |
| 1878 gen_data(buf, t, ns->name, name, URL, executable, URI, encoding); | |
| 1879 } | |
| 1880 break; | |
| 1881 } | |
| 1882 } | |
| 1883 if (sp && sp->name) | |
| 1884 { has_nsmap = 1; | |
| 1885 if (nflag) | |
| 1886 sprintf(buf, "%s%s.nsmap", dirpath, prefix); | |
| 1887 else | |
| 1888 sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); | |
| 1889 fprintf(fmsg, "Saving %s namespace mapping table\n", buf); | |
| 1890 fd = fopen(buf, "w"); | |
| 1891 if (!fd) | |
| 1892 execerror("Cannot write nsmap file"); | |
| 1893 fprintf(fd, "\n#include \"%sH.h\"", prefix); | |
| 1894 if (nflag) | |
| 1895 fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); | |
| 1896 else | |
| 1897 fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); | |
| 1898 gen_nsmap(fd, ns, URI); | |
| 1899 fclose(fd); | |
| 1900 | |
| 1901 if (Tflag && !Cflag) | |
| 1902 { Entry *method; | |
| 1903 char soapTester[1024]; | |
| 1904 char pathsoapTester[1024]; | |
| 1905 char *name1 = NULL; | |
| 1906 Tflag = 0; | |
| 1907 strcpy(soapTester, prefix); | |
| 1908 strcat(soapTester, "Tester"); | |
| 1909 if (cflag) | |
| 1910 strcat(soapTester, ".c"); | |
| 1911 else | |
| 1912 strcat(soapTester, ".cpp"); | |
| 1913 strcpy(pathsoapTester, dirpath); | |
| 1914 strcat(pathsoapTester, soapTester); | |
| 1915 fprintf(fmsg, "Saving %s server auto-test code\n", pathsoapTester); | |
| 1916 fd = fopen(pathsoapTester,"w"); | |
| 1917 if (!fd) | |
| 1918 execerror("Cannot write to file"); | |
| 1919 copyrightnote(fd, soapTester); | |
| 1920 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 \""); | |
| 1921 if (iflag || jflag) | |
| 1922 { char *sname; | |
| 1923 if (sp && sp->name) | |
| 1924 sname = sp->name; | |
| 1925 else | |
| 1926 sname = ""; | |
| 1927 name1 = ns_cname(sname, "Service"); | |
| 1928 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); | |
| 1929 } | |
| 1930 else | |
| 1931 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"); | |
| 1932 for (method = t->list; method; method = method->next) | |
| 1933 { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) | |
| 1934 { Entry *p, *q = entry(t, method->sym); | |
| 1935 Table *r; | |
| 1936 if (q) | |
| 1937 p = (Entry*)q->info.typ->ref; | |
| 1938 else | |
| 1939 { fprintf(stderr, "Internal error: no table entry\n"); | |
| 1940 return; | |
| 1941 } | |
| 1942 q = entry(classtable, method->sym); | |
| 1943 r = (Table*)q->info.typ->ref; | |
| 1944 if (iflag || jflag) | |
| 1945 fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); | |
| 1946 else | |
| 1947 fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); | |
| 1948 gen_params(fd, r, p, !iflag && !jflag); | |
| 1949 /* single param to single param echo */ | |
| 1950 if (p && r && r->list && r->list->info.typ == p->info.typ) | |
| 1951 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)); | |
| 1952 else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) | |
| 1953 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)); | |
| 1954 else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) | |
| 1955 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)); | |
| 1956 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) | |
| 1957 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)); | |
| 1958 /* params to wrapped params echo */ | |
| 1959 else | |
| 1960 { fprintf(fd, "\n{\t"); | |
| 1961 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)) | |
| 1962 { const char *s, *a; | |
| 1963 int d = 1; | |
| 1964 s = ident(p->sym->name); | |
| 1965 if (p->info.typ->type == Treference) | |
| 1966 a = "."; | |
| 1967 else | |
| 1968 a = "->"; | |
| 1969 for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) | |
| 1970 { if (p->info.typ == q->info.typ) | |
| 1971 fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); | |
| 1972 else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) | |
| 1973 fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); | |
| 1974 else | |
| 1975 d = 0; | |
| 1976 } | |
| 1977 if (!d) | |
| 1978 fprintf(fd, "\n\t/* Return incomplete response with default data values */"); | |
| 1979 } | |
| 1980 fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); | |
| 1981 } | |
| 1982 fflush(fd); | |
| 1983 } | |
| 1984 } | |
| 1985 fclose(fd); | |
| 1986 } | |
| 1987 } | |
| 1988 } | |
| 1989 if (!wflag && !import) | |
| 1990 { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); | |
| 1991 fprintf(fmsg, "Saving %s XML schema\n", buf); | |
| 1992 fd = fopen(buf, "w"); | |
| 1993 if (!fd) | |
| 1994 execerror("Cannot write schema file"); | |
| 1995 fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); | |
| 1996 if (t) | |
| 1997 for (p = t->list; p; p = p->next) | |
| 1998 if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) | |
| 1999 { gen_schema(fd, t, ns->name, ns->name, 0, 1, URL, URI, style, encoding); | |
| 2000 break; | |
| 2001 } | |
| 2002 if (!t || !p) | |
| 2003 gen_schema(fd, t, ns->name, ns->name, 0, 0, URL, URI, style, encoding); | |
| 2004 fclose(fd); | |
| 2005 } | |
| 2006 } | |
| 2007 if (!has_nsmap && flag) | |
| 2008 { if (Tflag && !Cflag && !iflag && !jflag) | |
| 2009 fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap service name\n"); | |
| 2010 for (ns = nslist; ns; ns = ns->next) | |
| 2011 if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) | |
| 2012 break; | |
| 2013 if (nflag) | |
| 2014 sprintf(buf, "%s%s.nsmap", dirpath, prefix); | |
| 2015 else if (ns && ns->name) | |
| 2016 sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); | |
| 2017 else | |
| 2018 sprintf(buf, "%ssoap.nsmap", dirpath); | |
| 2019 fprintf(fmsg, "Saving %s namespace mapping table\n", buf); | |
| 2020 fd = fopen(buf, "w"); | |
| 2021 if (!fd) | |
| 2022 execerror("Cannot write nsmap file"); | |
| 2023 fprintf(fd, "\n#include \"%sH.h\"", prefix); | |
| 2024 if (nflag) | |
| 2025 fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); | |
| 2026 else | |
| 2027 fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); | |
| 2028 gen_nsmap(fd, ns, URI); | |
| 2029 fclose(fd); | |
| 2030 } | |
| 2031 } | |
| 2032 | |
| 2033 int | |
| 2034 chkhdr(char *part) | |
| 2035 { Entry *p; | |
| 2036 p = entry(classtable, lookup("SOAP_ENV__Header")); | |
| 2037 if (p) | |
| 2038 for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) | |
| 2039 if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) | |
| 2040 return 1; | |
| 2041 sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member field is not qualified", part); | |
| 2042 semwarn(errbuf); | |
| 2043 return 0; | |
| 2044 } | |
| 2045 | |
| 2046 void | |
| 2047 gen_wsdl(FILE *fd, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *style, char *encoding, char *protocol) | |
| 2048 { Entry *p, *q, *r; | |
| 2049 Symbol *s; | |
| 2050 Service *sp, *sp2; | |
| 2051 Method *m; | |
| 2052 const char *mimein = NULL, *mimeout = NULL; | |
| 2053 int prot, mask = 0x0; /* 0x1 = SOAP, 0x2 = GET, 0x4 = PUT, 0x8 = POST */ | |
| 2054 char *action, *comment, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; | |
| 2055 char *portname; | |
| 2056 char *binding; | |
| 2057 fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); | |
| 2058 for (sp = services; sp; sp = sp->next) | |
| 2059 if (!tagcmp(sp->ns, ns)) | |
| 2060 break; | |
| 2061 if (sp && sp->definitions) | |
| 2062 fprintf(fd, "<definitions name=\"%s\"\n", sp->definitions); | |
| 2063 else | |
| 2064 fprintf(fd, "<definitions name=\"%s\"\n", name); | |
| 2065 if (sp && sp->WSDL) | |
| 2066 fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); | |
| 2067 else | |
| 2068 fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); | |
| 2069 if (sp && sp->binding) | |
| 2070 binding = ns_cname(sp->binding, NULL); | |
| 2071 else | |
| 2072 binding = name; | |
| 2073 if (sp && sp->portname) | |
| 2074 portname = ns_cname(sp->portname, NULL); | |
| 2075 else | |
| 2076 portname = name; | |
| 2077 for (s = nslist; s; s = s->next) | |
| 2078 { for (sp2 = services; sp2; sp2 = sp2->next) | |
| 2079 if (!tagcmp(sp2->ns, s->name) && sp2->URI) | |
| 2080 break; | |
| 2081 if (sp2) | |
| 2082 fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); | |
| 2083 else if (!strcmp(s->name, "SOAP-ENV")) | |
| 2084 fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); | |
| 2085 else if (!strcmp(s->name, "SOAP-ENC")) | |
| 2086 fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); | |
| 2087 else if (!strcmp(s->name, "xsi")) | |
| 2088 fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); | |
| 2089 else if (!strcmp(s->name, "xsd")) | |
| 2090 fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); | |
| 2091 else | |
| 2092 fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); | |
| 2093 } | |
| 2094 if (is_soap12(encoding)) | |
| 2095 fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); | |
| 2096 else | |
| 2097 fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); | |
| 2098 fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); | |
| 2099 fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); | |
| 2100 fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); | |
| 2101 fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); | |
| 2102 fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); | |
| 2103 fprintf(fd, "<types>\n\n"); | |
| 2104 for (s = nslist; s; s = s->next) | |
| 2105 gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), 1, URL, URI, style, encoding); | |
| 2106 fprintf(fd, "</types>\n\n"); | |
| 2107 fflush(fd); | |
| 2108 if (t) | |
| 2109 { for (p = t->list; p; p = p->next) | |
| 2110 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) | |
| 2111 { mimein = NULL; | |
| 2112 mimeout = NULL; | |
| 2113 comment = NULL; | |
| 2114 method_style = style; | |
| 2115 method_encoding = encoding; | |
| 2116 method_response_encoding = NULL; | |
| 2117 if (sp) | |
| 2118 { for (m = sp->list; m; m = m->next) | |
| 2119 { if (is_eq_nons(m->name, p->sym->name)) | |
| 2120 { if (m->mess&MIMEIN) | |
| 2121 mimein = m->part; | |
| 2122 if (m->mess&MIMEOUT) | |
| 2123 mimeout = m->part; | |
| 2124 if (m->mess == ENCODING) | |
| 2125 method_encoding = m->part; | |
| 2126 else if (m->mess == RESPONSE_ENCODING) | |
| 2127 method_response_encoding = m->part; | |
| 2128 else if (m->mess == STYLE) | |
| 2129 method_style = m->part; | |
| 2130 else if (m->mess == COMMENT) | |
| 2131 comment = m->part; | |
| 2132 } | |
| 2133 } | |
| 2134 } | |
| 2135 if (!method_response_encoding) | |
| 2136 method_response_encoding = method_encoding; | |
| 2137 if (get_response(p->info.typ)) | |
| 2138 fprintf(fd, "<message name=\"%sRequest\">\n", ns_remove(p->sym->name)); | |
| 2139 else | |
| 2140 fprintf(fd, "<message name=\"%s\">\n", ns_remove(p->sym->name)); | |
| 2141 fflush(fd); | |
| 2142 if (is_document(method_style)) | |
| 2143 { if (is_invisible(p->sym->name)) | |
| 2144 { q = entry(classtable, p->sym); | |
| 2145 if (q) | |
| 2146 { q = ((Table*)q->info.typ->ref)->list; | |
| 2147 if (q) | |
| 2148 { if (is_invisible(q->sym->name)) | |
| 2149 { r = entry(classtable, q->sym); | |
| 2150 if (r) | |
| 2151 { r = ((Table*)r->info.typ->ref)->list; | |
| 2152 if (r) | |
| 2153 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns)); | |
| 2154 if (gen_member_documentation(fd, p->sym, r, ns)) | |
| 2155 fprintf(fd, " </part>\n"); | |
| 2156 } | |
| 2157 } | |
| 2158 } | |
| 2159 else | |
| 2160 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(q, ns)); | |
| 2161 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2162 fprintf(fd, " </part>\n"); | |
| 2163 } | |
| 2164 } | |
| 2165 } | |
| 2166 } | |
| 2167 else | |
| 2168 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(p, ns)); | |
| 2169 if (gen_member_documentation(fd, p->sym, p, ns)) | |
| 2170 fprintf(fd, " </part>\n"); | |
| 2171 } | |
| 2172 } | |
| 2173 else | |
| 2174 { q = entry(classtable, p->sym); | |
| 2175 if (q) | |
| 2176 { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) | |
| 2177 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) | |
| 2178 { if (is_literal(method_encoding)) | |
| 2179 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); | |
| 2180 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2181 fprintf(fd, " </part>\n"); | |
| 2182 } | |
| 2183 else if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) | |
| 2184 fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); | |
| 2185 else | |
| 2186 { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); | |
| 2187 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2188 fprintf(fd, " </part>\n"); | |
| 2189 } | |
| 2190 } | |
| 2191 } | |
| 2192 } | |
| 2193 } | |
| 2194 if (mimein) | |
| 2195 fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); | |
| 2196 fprintf(fd, "</message>\n\n"); | |
| 2197 fflush(fd); | |
| 2198 q = (Entry*)p->info.typ->ref; | |
| 2199 for (r = t->list; r; r = r->next) | |
| 2200 if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) | |
| 2201 q = NULL; | |
| 2202 if (q && is_transient(q->info.typ)) | |
| 2203 ; | |
| 2204 else if (q && !is_response(q->info.typ)) | |
| 2205 { fprintf(fd, "<message name=\"%sResponse\">\n", ns_remove(p->sym->name)); | |
| 2206 if (is_document(method_style)) | |
| 2207 fprintf(fd, " <part name=\"Body\" element=\"%sResponse\"/>\n", ns_add(p, ns)); | |
| 2208 else if (is_literal(method_response_encoding)) | |
| 2209 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); | |
| 2210 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2211 fprintf(fd, " </part>\n"); | |
| 2212 } | |
| 2213 else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) | |
| 2214 fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); | |
| 2215 else | |
| 2216 { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); | |
| 2217 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2218 fprintf(fd, " </part>\n"); | |
| 2219 } | |
| 2220 if (mimeout) | |
| 2221 fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); | |
| 2222 fprintf(fd, "</message>\n\n"); | |
| 2223 } | |
| 2224 else if (q && q->info.typ->wsdl == False) | |
| 2225 { q->info.typ->wsdl = True; | |
| 2226 fprintf(fd, "<message name=\"%s\">\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); | |
| 2227 if (is_document(method_style)) | |
| 2228 { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) | |
| 2229 fprintf(fd, " <part name=\"Body\" element=\"%s\"/>\n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); | |
| 2230 else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) | |
| 2231 { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; | |
| 2232 if (r) | |
| 2233 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns)); | |
| 2234 if (gen_member_documentation(fd, p->sym, r, ns)) | |
| 2235 fprintf(fd, " </part>\n"); | |
| 2236 } | |
| 2237 } | |
| 2238 else | |
| 2239 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_convert(((Tnode*)q->info.typ->ref)->id->name)); | |
| 2240 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2241 fprintf(fd, " </part>\n"); | |
| 2242 } | |
| 2243 } | |
| 2244 else | |
| 2245 { if (((Tnode*)q->info.typ->ref)->ref) | |
| 2246 { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) | |
| 2247 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) | |
| 2248 { if (is_literal(method_response_encoding)) | |
| 2249 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); | |
| 2250 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2251 fprintf(fd, " </part>\n"); | |
| 2252 } | |
| 2253 else if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) | |
| 2254 fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); | |
| 2255 else | |
| 2256 { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); | |
| 2257 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2258 fprintf(fd, " </part>\n"); | |
| 2259 } | |
| 2260 } | |
| 2261 } | |
| 2262 } | |
| 2263 } | |
| 2264 if (mimeout) | |
| 2265 fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); | |
| 2266 fprintf(fd, "</message>\n\n"); | |
| 2267 } | |
| 2268 fflush(fd); | |
| 2269 } | |
| 2270 } | |
| 2271 if (custom_header) | |
| 2272 { Table *r; | |
| 2273 fprintf(fd, "<message name=\"%sHeader\">\n", name); | |
| 2274 r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; | |
| 2275 if (r) | |
| 2276 { for (q = r->list; q; q = q->next) | |
| 2277 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) | |
| 2278 fprintf(fd, " <part name=\"%s\" element=\"%s\"/>\n", ns_remove(q->sym->name), ns_add(q, ns)); | |
| 2279 } | |
| 2280 } | |
| 2281 fprintf(fd, "</message>\n\n"); | |
| 2282 } | |
| 2283 if (custom_fault) | |
| 2284 { Table *r; | |
| 2285 fprintf(fd, "<message name=\"%sFault\">\n", name); | |
| 2286 r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; | |
| 2287 if (r) | |
| 2288 for (q = r->list; q; q = q->next) | |
| 2289 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)) | |
| 2290 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); | |
| 2291 if (gen_member_documentation(fd, q->sym, q, ns)) | |
| 2292 fprintf(fd, " </part>\n"); | |
| 2293 } | |
| 2294 fprintf(fd, "</message>\n\n"); | |
| 2295 } | |
| 2296 if (sp) | |
| 2297 { for (m = sp->list; m; m = m->next) | |
| 2298 { if (m->mess&FAULT && m->part) | |
| 2299 { Method *m2; | |
| 2300 int flag = 0; | |
| 2301 for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) | |
| 2302 if (m2->mess&FAULT && !strcmp(m2->part, m->part)) | |
| 2303 flag = 1; | |
| 2304 if (!flag) | |
| 2305 { if (typetable) | |
| 2306 for (p = typetable->list; p; p = p->next) | |
| 2307 if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) | |
| 2308 break; | |
| 2309 if (!p && classtable) | |
| 2310 for (p = classtable->list; p; p = p->next) | |
| 2311 if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) | |
| 2312 break; | |
| 2313 if (p) | |
| 2314 { fprintf(fd, "<message name=\"%sFault\">\n", ns_remove(m->part)); | |
| 2315 fprintf(fd, " <part name=\"Fault\" element=\"%s\"/>\n", ns_convert(m->part)); | |
| 2316 fprintf(fd, "</message>\n\n"); | |
| 2317 flag = 0; | |
| 2318 if (custom_fault) | |
| 2319 { Table *r; | |
| 2320 r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; | |
| 2321 if (r) | |
| 2322 for (q = r->list; q; q = q->next) | |
| 2323 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))) | |
| 2324 { flag = 1; | |
| 2325 break; | |
| 2326 } | |
| 2327 } | |
| 2328 if (!flag) | |
| 2329 { 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); | |
| 2330 semwarn(errbuf); | |
| 2331 } | |
| 2332 } | |
| 2333 else | |
| 2334 { 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); | |
| 2335 semwarn(errbuf); | |
| 2336 } | |
| 2337 } | |
| 2338 } | |
| 2339 } | |
| 2340 } | |
| 2341 fflush(fd); | |
| 2342 if (sp && sp->porttype) | |
| 2343 fprintf(fd, "<portType name=\"%s\">\n", sp->porttype); | |
| 2344 else | |
| 2345 fprintf(fd, "<portType name=\"%s\">\n", ns_cname(name, "PortType")); | |
| 2346 if (protocol) | |
| 2347 { if (strncmp(protocol, "SOAP", 4)) | |
| 2348 { if (strstr(protocol, "GET")) | |
| 2349 mask = 0x2; | |
| 2350 else if (strstr(protocol, "PUT")) | |
| 2351 mask = 0x4; | |
| 2352 else /* POST */ | |
| 2353 mask = 0x8; | |
| 2354 } | |
| 2355 else | |
| 2356 mask = 0x1; | |
| 2357 } | |
| 2358 for (p = t->list; p; p = p->next) | |
| 2359 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) | |
| 2360 { comment = NULL; | |
| 2361 if (sp) | |
| 2362 { for (m = sp->list; m; m = m->next) | |
| 2363 { if (m->mess == COMMENT && is_eq_nons(m->name, p->sym->name)) | |
| 2364 comment = m->part; | |
| 2365 else if (m->mess == PROTOCOL) | |
| 2366 { if (strncmp(m->part, "SOAP", 4)) | |
| 2367 { if (strstr(m->part, "GET")) | |
| 2368 mask |= 0x2; | |
| 2369 else if (strstr(m->part, "PUT")) | |
| 2370 mask |= 0x4; | |
| 2371 else /* POST */ | |
| 2372 mask |= 0x8; | |
| 2373 } | |
| 2374 else | |
| 2375 mask |= 0x1; | |
| 2376 } | |
| 2377 } | |
| 2378 } | |
| 2379 if (!mask) | |
| 2380 { if (vflag < 0) | |
| 2381 mask = 0x8; /* -0 option: use POST */ | |
| 2382 else | |
| 2383 mask = 0x1; | |
| 2384 } | |
| 2385 fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); | |
| 2386 if (comment) | |
| 2387 fprintf(fd, " <documentation>%s</documentation>\n", comment); | |
| 2388 else | |
| 2389 fprintf(fd, " <documentation>Service definition of function %s</documentation>\n", p->sym->name); | |
| 2390 if (get_response(p->info.typ)) | |
| 2391 fprintf(fd, " <input message=\"tns:%sRequest\"/>\n", ns_remove(p->sym->name)); | |
| 2392 else | |
| 2393 fprintf(fd, " <input message=\"tns:%s\"/>\n", ns_remove(p->sym->name)); | |
| 2394 q = (Entry*)p->info.typ->ref; | |
| 2395 if (q && is_transient(q->info.typ)) | |
| 2396 ; | |
| 2397 else if (q && !is_response(q->info.typ)) | |
| 2398 fprintf(fd, " <output message=\"tns:%sResponse\"/>\n", ns_remove(p->sym->name)); | |
| 2399 else if (q) | |
| 2400 fprintf(fd, " <output message=\"tns:%s\"/>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); | |
| 2401 if (sp) | |
| 2402 for (m = sp->list; m; m = m->next) | |
| 2403 if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) | |
| 2404 fprintf(fd, " <fault name=\"%s\" message=\"tns:%sFault\"/>\n", ns_remove(m->part), ns_remove(m->part)); | |
| 2405 fprintf(fd, " </operation>\n"); | |
| 2406 } | |
| 2407 } | |
| 2408 fprintf(fd, "</portType>\n\n"); | |
| 2409 for (prot = 0x1; prot <= 0x8; prot <<= 1) | |
| 2410 { if ((prot & mask)) | |
| 2411 { const char *v = "", *b = ""; | |
| 2412 switch (prot) | |
| 2413 { case 0x1: v = ""; b = "SOAP"; break; | |
| 2414 case 0x2: v = "GET"; b = "HTTP"; break; | |
| 2415 case 0x4: v = "PUT"; b = "HTTP"; break; | |
| 2416 case 0x8: v = "POST"; b = "HTTP"; break; | |
| 2417 } | |
| 2418 fprintf(fd, "<binding name=\"%s%s\" ", binding, v); | |
| 2419 if (prot == 0x1) | |
| 2420 { if (is_document(style)) | |
| 2421 { if (sp && sp->porttype) | |
| 2422 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", sp->porttype); | |
| 2423 else | |
| 2424 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", ns_cname(name, "PortType")); | |
| 2425 } | |
| 2426 else | |
| 2427 { if (sp && sp->porttype) | |
| 2428 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", sp->porttype); | |
| 2429 else | |
| 2430 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", ns_cname(name, "PortType")); | |
| 2431 } | |
| 2432 if (sp && sp->transport) | |
| 2433 fprintf(fd, " transport=\"%s\"/>\n", sp->transport); | |
| 2434 else | |
| 2435 fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); | |
| 2436 } | |
| 2437 else | |
| 2438 { if (sp && sp->porttype) | |
| 2439 fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", sp->porttype, v); | |
| 2440 else | |
| 2441 fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", ns_cname(name, "PortType"), v); | |
| 2442 } | |
| 2443 fflush(fd); | |
| 2444 for (p = t->list; p; p = p->next) | |
| 2445 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) | |
| 2446 { action = ""; | |
| 2447 mimein = NULL; | |
| 2448 mimeout = NULL; | |
| 2449 method_style = style; | |
| 2450 method_encoding = encoding; | |
| 2451 method_response_encoding = NULL; | |
| 2452 if (sp) | |
| 2453 { int v = 0x1; | |
| 2454 if (sp->protocol) | |
| 2455 { if (strncmp(sp->protocol, "SOAP", 4)) | |
| 2456 { if (strstr(sp->protocol, "GET")) | |
| 2457 v = 0x2; | |
| 2458 else if (strstr(sp->protocol, "PUT")) | |
| 2459 v = 0x4; | |
| 2460 else /* POST */ | |
| 2461 v = 0x8; | |
| 2462 } | |
| 2463 } | |
| 2464 for (m = sp->list; m; m = m->next) | |
| 2465 { if (is_eq_nons(m->name, p->sym->name)) | |
| 2466 { if (m->mess&MIMEIN) | |
| 2467 mimein = m->part; | |
| 2468 if (m->mess&MIMEOUT) | |
| 2469 mimeout = m->part; | |
| 2470 if (m->mess == ENCODING) | |
| 2471 method_encoding = m->part; | |
| 2472 else if (m->mess == RESPONSE_ENCODING) | |
| 2473 method_response_encoding = m->part; | |
| 2474 else if (m->mess == STYLE) | |
| 2475 method_style = m->part; | |
| 2476 else if (m->mess == ACTION || m->mess == REQUEST_ACTION) | |
| 2477 action = m->part; | |
| 2478 else if (m->mess == RESPONSE_ACTION) | |
| 2479 action = m->part; | |
| 2480 else if (m->mess == PROTOCOL) | |
| 2481 { if (strncmp(m->part, "SOAP", 4)) | |
| 2482 { if (strstr(m->part, "GET")) | |
| 2483 v = 0x2; | |
| 2484 else if (strstr(m->part, "PUT")) | |
| 2485 v = 0x4; | |
| 2486 else /* POST */ | |
| 2487 v = 0x8; | |
| 2488 } | |
| 2489 else | |
| 2490 v = 0x1; | |
| 2491 } | |
| 2492 } | |
| 2493 } | |
| 2494 if (vflag < 0) | |
| 2495 v = 0x8; | |
| 2496 if (prot != v) | |
| 2497 continue; | |
| 2498 } | |
| 2499 if (!method_response_encoding) | |
| 2500 method_response_encoding = method_encoding; | |
| 2501 fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); | |
| 2502 if (prot == 0x1) | |
| 2503 { if (is_document(style)) | |
| 2504 { if (is_document(method_style)) | |
| 2505 { if (is_soap12(encoding) && !*action) | |
| 2506 fprintf(fd, " <SOAP:operation/>\n"); | |
| 2507 else if (*action == '"') | |
| 2508 fprintf(fd, " <SOAP:operation soapAction=%s/>\n", action); | |
| 2509 else | |
| 2510 fprintf(fd, " <SOAP:operation soapAction=\"%s\"/>\n", action); | |
| 2511 } | |
| 2512 else if (is_soap12(encoding) && !*action) | |
| 2513 fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n"); | |
| 2514 else if (*action == '"') | |
| 2515 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action); | |
| 2516 else | |
| 2517 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action); | |
| 2518 } | |
| 2519 else | |
| 2520 { if (is_document(method_style)) | |
| 2521 { if (is_soap12(encoding) && !*action) | |
| 2522 fprintf(fd, " <SOAP:operation style=\"document\"/>\n"); | |
| 2523 else if (*action == '"') | |
| 2524 fprintf(fd, " <SOAP:operation style=\"document\" soapAction=%s/>\n", action); | |
| 2525 else | |
| 2526 fprintf(fd, " <SOAP:operation style=\"document\" soapAction=\"%s\"/>\n", action); | |
| 2527 } | |
| 2528 else if (is_soap12(encoding) && !*action) | |
| 2529 fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n"); | |
| 2530 else if (*action == '"') | |
| 2531 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action); | |
| 2532 else | |
| 2533 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action); | |
| 2534 } | |
| 2535 } | |
| 2536 else | |
| 2537 { if (!*action) | |
| 2538 fprintf(fd, " <HTTP:operation/>\n"); | |
| 2539 else if (*action == '"') | |
| 2540 fprintf(fd, " <HTTP:operation location=%s/>\n", action); | |
| 2541 else | |
| 2542 fprintf(fd, " <HTTP:operation location=\"%s\"/>\n", action); | |
| 2543 } | |
| 2544 fprintf(fd, " <input>\n"); | |
| 2545 q = entry(classtable, p->sym); | |
| 2546 if (prot == 0x1) | |
| 2547 { if (mimein) | |
| 2548 fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n"); | |
| 2549 if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) | |
| 2550 { if (is_document(method_style)) | |
| 2551 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n"); | |
| 2552 else | |
| 2553 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI); | |
| 2554 } | |
| 2555 else | |
| 2556 { if (encoding && *encoding) | |
| 2557 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); | |
| 2558 else if (method_encoding && *method_encoding) | |
| 2559 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_encoding); | |
| 2560 else | |
| 2561 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI); | |
| 2562 if (!eflag) | |
| 2563 { sprintf(errbuf, "operation '%s' is not compliant with WS-I Basic Profile 1.0a, reason: uses SOAP encoding", p->sym->name); | |
| 2564 compliancewarn(errbuf); | |
| 2565 } | |
| 2566 } | |
| 2567 if (custom_header) | |
| 2568 { m = NULL; | |
| 2569 if (sp) | |
| 2570 { for (m = sp->list; m; m = m->next) | |
| 2571 if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) | |
| 2572 { if (chkhdr(m->part)) | |
| 2573 fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part)); | |
| 2574 } | |
| 2575 } | |
| 2576 } | |
| 2577 if (mimein) | |
| 2578 { if (sp) | |
| 2579 { for (m = sp->list; m; m = m->next) | |
| 2580 { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) | |
| 2581 fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part); | |
| 2582 } | |
| 2583 } | |
| 2584 fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n"); | |
| 2585 } | |
| 2586 } | |
| 2587 else if (prot == 0x2) | |
| 2588 fprintf(fd, " <HTTP:urlEncoded/>\n"); | |
| 2589 else | |
| 2590 { if (mimein) | |
| 2591 fprintf(fd, " <MIME:content type=\"%s\"/>\n", mimein); | |
| 2592 else if (!q || is_document(method_style)) | |
| 2593 fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); | |
| 2594 else | |
| 2595 fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name)); | |
| 2596 } | |
| 2597 fprintf(fd, " </input>\n"); | |
| 2598 | |
| 2599 q = (Entry*)p->info.typ->ref; | |
| 2600 if (!q || !q->info.typ->ref) | |
| 2601 { fprintf(fd, " </operation>\n"); | |
| 2602 continue; | |
| 2603 } | |
| 2604 if (prot != 0x4) | |
| 2605 { fprintf(fd, " <output>\n"); | |
| 2606 if (prot == 0x1) | |
| 2607 { if (mimeout) | |
| 2608 fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n"); | |
| 2609 if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) | |
| 2610 { if (is_document(method_style)) | |
| 2611 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n"); | |
| 2612 else | |
| 2613 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI); | |
| 2614 } | |
| 2615 else if (encoding && *encoding) | |
| 2616 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); | |
| 2617 else if (method_response_encoding && *method_response_encoding) | |
| 2618 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_response_encoding); | |
| 2619 else | |
| 2620 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI); | |
| 2621 if (custom_header) | |
| 2622 { if (sp) | |
| 2623 for (m = sp->list; m; m = m->next) | |
| 2624 if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) | |
| 2625 { if (chkhdr(m->part)) | |
| 2626 fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part)); | |
| 2627 } | |
| 2628 } | |
| 2629 if (mimeout) | |
| 2630 { if (sp) | |
| 2631 { for (m = sp->list; m; m = m->next) | |
| 2632 { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) | |
| 2633 fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part); | |
| 2634 } | |
| 2635 } | |
| 2636 fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n"); | |
| 2637 } | |
| 2638 } | |
| 2639 else | |
| 2640 { q = (Entry*)p->info.typ->ref; | |
| 2641 if (is_document(method_style)) | |
| 2642 fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); | |
| 2643 else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) | |
| 2644 fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name)); | |
| 2645 else | |
| 2646 fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); | |
| 2647 } | |
| 2648 fprintf(fd, " </output>\n"); | |
| 2649 } | |
| 2650 if (sp) | |
| 2651 for (m = sp->list; m; m = m->next) | |
| 2652 if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) | |
| 2653 fprintf(fd, " <fault name=\"%s\">\n <SOAP:fault name=\"%s\" use=\"literal\"/>\n </fault>\n", ns_remove(m->part), ns_remove(m->part)); | |
| 2654 fprintf(fd, " </operation>\n"); | |
| 2655 fflush(fd); | |
| 2656 } | |
| 2657 } | |
| 2658 fprintf(fd, "</binding>\n\n"); | |
| 2659 } | |
| 2660 } | |
| 2661 } | |
| 2662 fprintf(fd, "<service name=\"%s\">\n", name); | |
| 2663 if (sp && sp->documentation) | |
| 2664 fprintf(fd, " <documentation>%s</documentation>\n", sp->documentation); | |
| 2665 else | |
| 2666 fprintf(fd, " <documentation>gSOAP "VERSION" generated service definition</documentation>\n"); | |
| 2667 if (executable) | |
| 2668 fprintf(fd, " <port name=\"%s\" binding=\"tns:%s\">\n <SOAP:address location=\"%s/%s\"/>\n </port>", portname, binding, URL, executable); | |
| 2669 for (prot = 0x1; prot <= 0x8; prot <<= 1) | |
| 2670 { if ((prot & mask)) | |
| 2671 { const char *s, *t, *v = "", *b = ""; | |
| 2672 switch (prot) | |
| 2673 { case 0x1: v = ""; b = "SOAP"; break; | |
| 2674 case 0x2: v = "GET"; b = "HTTP"; break; | |
| 2675 case 0x4: v = "PUT"; b = "HTTP"; break; | |
| 2676 case 0x8: v = "POST"; b = "HTTP"; break; | |
| 2677 } | |
| 2678 fprintf(fd, " <port name=\"%s%s\" binding=\"tns:%s%s\">\n", portname, v, binding, v); | |
| 2679 for (s = URL; s; s = t) | |
| 2680 { int n; | |
| 2681 t = strchr(s, ' '); | |
| 2682 if (t) | |
| 2683 { n = (int)(t - s); | |
| 2684 t++; | |
| 2685 } | |
| 2686 else | |
| 2687 n = (int)strlen(s); | |
| 2688 fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); | |
| 2689 } | |
| 2690 fprintf(fd, " </port>\n"); | |
| 2691 } | |
| 2692 } | |
| 2693 fprintf(fd, "</service>\n\n</definitions>\n"); | |
| 2694 } | |
| 2695 | |
| 2696 char * | |
| 2697 default_value(Entry *e, const char *a) | |
| 2698 { Entry *q; | |
| 2699 static char buf[1024]; | |
| 2700 buf[0] = '\0'; | |
| 2701 if (e->info.hasval) | |
| 2702 switch (e->info.typ->type) | |
| 2703 { case Tchar: | |
| 2704 case Twchar: | |
| 2705 case Tuchar: | |
| 2706 case Tshort: | |
| 2707 case Tushort: | |
| 2708 case Tint: | |
| 2709 case Tuint: | |
| 2710 case Tlong: | |
| 2711 case Tllong: | |
| 2712 case Tulong: | |
| 2713 case Tullong: | |
| 2714 sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); | |
| 2715 break; | |
| 2716 case Tfloat: | |
| 2717 case Tdouble: | |
| 2718 case Tldouble: | |
| 2719 sprintf(buf, " %s=\"%g\"", a, e->info.val.r); | |
| 2720 break; | |
| 2721 case Ttime: | |
| 2722 break; /* should get value? */ | |
| 2723 case Tenum: | |
| 2724 for (q = ((Table*)e->info.typ->ref)->list; q; q = q->next) | |
| 2725 if (q->info.val.i == e->info.val.i) | |
| 2726 { sprintf(buf, " %s=\"%s\"", a, ns_convert(q->sym->name)); | |
| 2727 break; | |
| 2728 } | |
| 2729 break; | |
| 2730 default: | |
| 2731 if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) | |
| 2732 sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); | |
| 2733 break; | |
| 2734 } | |
| 2735 return buf; | |
| 2736 } | |
| 2737 | |
| 2738 const char * | |
| 2739 nillable(Tnode *typ) | |
| 2740 { if (typ->type == Tpointer) | |
| 2741 return "true"; | |
| 2742 return "false"; | |
| 2743 } | |
| 2744 | |
| 2745 void | |
| 2746 gen_schema(FILE *fd, Table *t, char *ns1, char *ns, int all, int wsdl, char *URL, char *URI, char *style, char *encoding) | |
| 2747 { int i, d; | |
| 2748 char cbuf[4]; | |
| 2749 Entry *p, *q, *r; | |
| 2750 Tnode *n; | |
| 2751 Symbol *s; | |
| 2752 Service *sp, *sp2; | |
| 2753 Method *m; | |
| 2754 int flag; | |
| 2755 if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) | |
| 2756 return; | |
| 2757 for (sp = services; sp; sp = sp->next) | |
| 2758 if (!tagcmp(sp->ns, ns) && sp->URI) | |
| 2759 break; | |
| 2760 if (sp && sp->import) | |
| 2761 return; | |
| 2762 fprintf(fd, " <schema "); | |
| 2763 if (sp) | |
| 2764 fprintf(fd, "targetNamespace=\"%s\"", sp->URI); | |
| 2765 else | |
| 2766 fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); | |
| 2767 for (s = nslist; s; s = s->next) | |
| 2768 { for (sp2 = services; sp2; sp2 = sp2->next) | |
| 2769 if (!tagcmp(sp2->ns, s->name) && sp2->URI) | |
| 2770 break; | |
| 2771 if (sp2) | |
| 2772 fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); | |
| 2773 else if (!strcmp(s->name, "SOAP-ENV")) | |
| 2774 fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); | |
| 2775 else if (!strcmp(s->name, "SOAP-ENC")) | |
| 2776 fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); | |
| 2777 else if (!strcmp(s->name, "xsi")) | |
| 2778 fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); | |
| 2779 else if (!strcmp(s->name, "xsd")) | |
| 2780 fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); | |
| 2781 else | |
| 2782 fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); | |
| 2783 } | |
| 2784 fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); | |
| 2785 if (sp && (sp->elementForm || sp->attributeForm)) | |
| 2786 fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); | |
| 2787 else if (style && !strcmp(style, "document")) | |
| 2788 fprintf(fd, " elementFormDefault=\"qualified\"\n attributeFormDefault=\"unqualified\">\n"); | |
| 2789 else | |
| 2790 fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); | |
| 2791 fflush(fd); | |
| 2792 flag = 0; | |
| 2793 for (s = nslist; s; s = s->next) | |
| 2794 { for (sp2 = services; sp2; sp2 = sp2->next) | |
| 2795 if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) | |
| 2796 break; | |
| 2797 if (sp2) | |
| 2798 { fprintf(fd, " <import namespace=\"%s\"", sp2->URI); | |
| 2799 if (sp2->import) | |
| 2800 fprintf(fd, " schemaLocation=\"%s\"", sp2->import); | |
| 2801 fprintf(fd, "/>\n"); | |
| 2802 if (!strcmp(sp2->URI, encURI)) | |
| 2803 flag = 1; | |
| 2804 } | |
| 2805 } | |
| 2806 if (!flag) | |
| 2807 fprintf(fd, " <import namespace=\"%s\"/>", encURI); | |
| 2808 fprintf(fd, "\n"); | |
| 2809 fflush(fd); | |
| 2810 if (typetable) | |
| 2811 { for (p = typetable->list; p; p = p->next) | |
| 2812 { 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)))) | |
| 2813 { /* typedefs that are used for SOAP Fault details */ | |
| 2814 m = NULL; | |
| 2815 if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) | |
| 2816 { for (sp2 = services; sp2 && !m; sp2 = sp2->next) | |
| 2817 { for (m = sp2->list; m; m = m->next) | |
| 2818 { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) | |
| 2819 break; | |
| 2820 } | |
| 2821 } | |
| 2822 } | |
| 2823 if (m) | |
| 2824 { if (!uflag) | |
| 2825 fprintf(fd, " <!-- fault element -->\n"); | |
| 2826 fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); | |
| 2827 gen_type_documentation(fd, p, ns); | |
| 2828 fprintf(fd, " </element>\n"); | |
| 2829 continue; | |
| 2830 } | |
| 2831 if (is_primitive_or_string(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) | |
| 2832 { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name)); | |
| 2833 gen_type_documentation(fd, p, ns); | |
| 2834 fprintf(fd, " <restriction base=\"%s\">\n", base_type(p->info.typ, ns1)); | |
| 2835 if (p->info.typ->pattern) | |
| 2836 fprintf(fd, " <pattern value=\"%s\"/>\n", p->info.typ->pattern); | |
| 2837 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))) | |
| 2838 { if (p->info.typ->minLength != MINLONG64) | |
| 2839 fprintf(fd, " <minInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); | |
| 2840 if (p->info.typ->maxLength != MAXLONG64) | |
| 2841 fprintf(fd, " <maxInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); | |
| 2842 } | |
| 2843 else | |
| 2844 { if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength) | |
| 2845 fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); | |
| 2846 else | |
| 2847 { if (p->info.typ->minLength > 0) | |
| 2848 fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); | |
| 2849 if (p->info.typ->maxLength != MAXLONG64) | |
| 2850 fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); | |
| 2851 } | |
| 2852 } | |
| 2853 fprintf(fd, " </restriction>\n </simpleType>\n"); | |
| 2854 } | |
| 2855 else | |
| 2856 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 2857 gen_type_documentation(fd, p, ns); | |
| 2858 fprintf(fd, " <complexContent>\n <restriction base=\"%s\">\n", base_type(p->info.typ, ns1)); | |
| 2859 fprintf(fd, " </restriction>\n </complexContent>\n </complexType>\n"); | |
| 2860 } | |
| 2861 } | |
| 2862 } | |
| 2863 } | |
| 2864 fflush(fd); | |
| 2865 if (enumtable) | |
| 2866 { for (p = enumtable->list; p; p = p->next) | |
| 2867 { if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) | |
| 2868 { if (is_mask(p->info.typ)) | |
| 2869 { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL)); | |
| 2870 gen_type_documentation(fd, p, ns); | |
| 2871 fprintf(fd, " <list>\n"); | |
| 2872 q = p; | |
| 2873 if ((Table*)p->info.typ->ref) | |
| 2874 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 2875 if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name))) | |
| 2876 break; | |
| 2877 } | |
| 2878 if (q) | |
| 2879 fprintf(fd, " <restriction base=\"xsd:string\">\n"); | |
| 2880 else | |
| 2881 fprintf(fd, " <restriction base=\"xsd:QName\">\n"); | |
| 2882 if ((Table*)p->info.typ->ref) | |
| 2883 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 2884 { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name)); | |
| 2885 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2886 fprintf(fd, " </enumeration>"); | |
| 2887 if (!uflag) | |
| 2888 fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i); | |
| 2889 fprintf(fd, "\n"); | |
| 2890 } | |
| 2891 } | |
| 2892 fprintf(fd, " </restriction>\n </list>\n </simpleType>\n"); | |
| 2893 } | |
| 2894 else | |
| 2895 { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL)); | |
| 2896 gen_type_documentation(fd, p, ns); | |
| 2897 q = p; | |
| 2898 if ((Table*)p->info.typ->ref) | |
| 2899 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 2900 if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name))) | |
| 2901 break; | |
| 2902 } | |
| 2903 if (q) | |
| 2904 fprintf(fd, " <restriction base=\"xsd:string\">\n"); | |
| 2905 else | |
| 2906 fprintf(fd, " <restriction base=\"xsd:QName\">\n"); | |
| 2907 if ((Table*)p->info.typ->ref) | |
| 2908 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 2909 { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name)); | |
| 2910 if (gen_member_documentation(fd, p->sym, q, ns)) | |
| 2911 fprintf(fd, " </enumeration>"); | |
| 2912 if (!uflag) | |
| 2913 fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i); | |
| 2914 fprintf(fd, "\n"); | |
| 2915 } | |
| 2916 } | |
| 2917 fprintf(fd, " </restriction>\n </simpleType>\n"); | |
| 2918 } | |
| 2919 } | |
| 2920 } | |
| 2921 } | |
| 2922 fflush(fd); | |
| 2923 if (classtable) | |
| 2924 { for (p = classtable->list; p; p = p->next) | |
| 2925 { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) | |
| 2926 continue; | |
| 2927 for (q = t->list; q; q = q->next) | |
| 2928 if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) | |
| 2929 break; | |
| 2930 /* omit the auto-generated and user-defined response struct/class (when necessary) */ | |
| 2931 if (!q) | |
| 2932 for (q = t->list; q; q = q->next) | |
| 2933 if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) | |
| 2934 { r = entry(t, q->sym); | |
| 2935 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) | |
| 2936 break; | |
| 2937 } | |
| 2938 if (q) | |
| 2939 continue; | |
| 2940 /* classes that are used for SOAP Fault details */ | |
| 2941 m = NULL; | |
| 2942 for (sp2 = services; sp2 && !m; sp2 = sp2->next) | |
| 2943 for (m = sp2->list; m; m = m->next) | |
| 2944 if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) | |
| 2945 break; | |
| 2946 if (m) | |
| 2947 { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) | |
| 2948 { if (!uflag) | |
| 2949 fprintf(fd, " <!-- fault element and type -->\n"); | |
| 2950 fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); | |
| 2951 gen_type_documentation(fd, p, ns); | |
| 2952 fprintf(fd, " </element>\n"); | |
| 2953 } | |
| 2954 } | |
| 2955 if (p->info.typ->ref && is_binary(p->info.typ)) | |
| 2956 { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) | |
| 2957 { if (is_attachment(p->info.typ)) | |
| 2958 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 2959 gen_type_documentation(fd, p, ns); | |
| 2960 fprintf(fd, " <simpleContent>\n <extension base=\"xsd:base64Binary\">\n"); | |
| 2961 if (!eflag) | |
| 2962 fprintf(fd, " <attribute name=\"href\" type=\"xsd:anyURI\" use=\"optional\"/>\n"); | |
| 2963 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 2964 fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); | |
| 2965 } | |
| 2966 else | |
| 2967 { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name)); | |
| 2968 gen_type_documentation(fd, p, ns); | |
| 2969 fprintf(fd, " <restriction base=\"xsd:base64Binary\">\n"); | |
| 2970 if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength) | |
| 2971 fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); | |
| 2972 else | |
| 2973 { if (p->info.typ->minLength > 0) | |
| 2974 fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); | |
| 2975 if (p->info.typ->maxLength != MAXLONG64) | |
| 2976 fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); | |
| 2977 } | |
| 2978 fprintf(fd, " </restriction>\n </simpleType>\n"); | |
| 2979 } | |
| 2980 } | |
| 2981 } | |
| 2982 else if (p->info.typ->ref && !is_transient(p->info.typ) && is_primclass(p->info.typ)) | |
| 2983 { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) | |
| 2984 { q = ((Table*)p->info.typ->ref)->list; | |
| 2985 if (q && strncmp(q->sym->name, "xsd__anyType", 12)) | |
| 2986 { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) | |
| 2987 { fprintf(fd, " <complexType name=\"%s\" mixed=\"true\">", ns_remove(p->sym->name)); | |
| 2988 gen_type_documentation(fd, p, ns); | |
| 2989 fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); | |
| 2990 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 2991 fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); | |
| 2992 } | |
| 2993 else if (is_primitive(q->info.typ)) | |
| 2994 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 2995 gen_type_documentation(fd, p, ns); | |
| 2996 fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); | |
| 2997 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 2998 fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); | |
| 2999 } | |
| 3000 else | |
| 3001 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3002 gen_type_documentation(fd, p, ns); | |
| 3003 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); | |
| 3004 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 3005 fprintf(fd, " </extension>\n </complexContent>\n </complexType>\n"); | |
| 3006 } | |
| 3007 } | |
| 3008 } | |
| 3009 } | |
| 3010 else if (p->info.typ->ref && !is_transient(p->info.typ)) | |
| 3011 { q = ((Table*)p->info.typ->ref)->list; | |
| 3012 if (entry(t, p->sym) && (!q || !is_XML(q->info.typ))) | |
| 3013 ; | |
| 3014 else if (is_dynamic_array(p->info.typ)) | |
| 3015 { if (eflag || (!has_ns(p->info.typ) && !is_untyped(p->info.typ))) | |
| 3016 { if (all) | |
| 3017 { d = get_Darraydims(p->info.typ)-1; | |
| 3018 for (i = 0; i < d; i++) | |
| 3019 cbuf[i] = ','; | |
| 3020 cbuf[i] = '\0'; | |
| 3021 if (q->info.maxOccurs == 1) | |
| 3022 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); | |
| 3023 else | |
| 3024 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); | |
| 3025 } | |
| 3026 } | |
| 3027 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)) | |
| 3028 { if (q->info.maxOccurs == 1) | |
| 3029 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3030 gen_type_documentation(fd, p, ns); | |
| 3031 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); | |
| 3032 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)); | |
| 3033 fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); | |
| 3034 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 3035 fprintf(fd, " </complexType>\n"); | |
| 3036 } | |
| 3037 else | |
| 3038 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3039 gen_type_documentation(fd, p, ns); | |
| 3040 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); | |
| 3041 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)); | |
| 3042 fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); | |
| 3043 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 3044 fprintf(fd, " </complexType>\n"); | |
| 3045 } | |
| 3046 } | |
| 3047 else | |
| 3048 { if (q->info.maxOccurs == 1) | |
| 3049 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3050 gen_type_documentation(fd, p, ns); | |
| 3051 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)); | |
| 3052 } | |
| 3053 else | |
| 3054 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3055 gen_type_documentation(fd, p, ns); | |
| 3056 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)); | |
| 3057 } | |
| 3058 } | |
| 3059 } | |
| 3060 else if (is_discriminant(p->info.typ) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) | |
| 3061 { if (p->info.typ->ref) | |
| 3062 { fprintf(fd, " <complexType name=\"%s\">\n", ns_remove(p->sym->name)); | |
| 3063 gen_schema_elements(fd, p->info.typ, ns, ns1); | |
| 3064 fprintf(fd, " </complexType>\n"); | |
| 3065 } | |
| 3066 } | |
| 3067 else if (p->info.typ->type == Tstruct && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) | |
| 3068 { if (p->info.typ->ref) | |
| 3069 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3070 gen_type_documentation(fd, p, ns); | |
| 3071 fprintf(fd, " <sequence>\n"); | |
| 3072 gen_schema_elements(fd, p->info.typ, ns, ns1); | |
| 3073 fprintf(fd, " </sequence>\n"); | |
| 3074 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 3075 fprintf(fd, " </complexType>\n"); | |
| 3076 } | |
| 3077 } | |
| 3078 else if (p->info.typ->type == Tclass && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) | |
| 3079 { if (p->info.typ->ref) | |
| 3080 { 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)) | |
| 3081 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3082 gen_type_documentation(fd, p, ns); | |
| 3083 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); | |
| 3084 gen_schema_elements(fd, p->info.typ, ns, ns1); | |
| 3085 fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); | |
| 3086 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 3087 fprintf(fd, " </complexType>\n"); | |
| 3088 } | |
| 3089 else | |
| 3090 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); | |
| 3091 gen_type_documentation(fd, p, ns); | |
| 3092 fprintf(fd, " <sequence>\n"); | |
| 3093 gen_schema_elements(fd, p->info.typ, ns, ns1); | |
| 3094 fprintf(fd, " </sequence>\n"); | |
| 3095 gen_schema_attributes(fd, p->info.typ, ns, ns1); | |
| 3096 fprintf(fd, " </complexType>\n"); | |
| 3097 } | |
| 3098 } | |
| 3099 } | |
| 3100 } | |
| 3101 } | |
| 3102 } | |
| 3103 fflush(fd); | |
| 3104 for (n = Tptr[Tarray]; n; n = n->next) | |
| 3105 { if (is_transient(n) || is_fixedstring(n)) | |
| 3106 continue; | |
| 3107 if (1 /* wsdl */) | |
| 3108 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)); | |
| 3109 else | |
| 3110 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)); | |
| 3111 fflush(fd); | |
| 3112 } | |
| 3113 gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); | |
| 3114 fprintf(fd, " </schema>\n\n"); | |
| 3115 } | |
| 3116 | |
| 3117 void | |
| 3118 gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1) | |
| 3119 { Entry *q; | |
| 3120 for (q = ((Table*)p->ref)->list; q; q = q->next) | |
| 3121 if (gen_schema_element(fd, p, q, ns, ns1)) | |
| 3122 q = q->next; | |
| 3123 } | |
| 3124 | |
| 3125 int | |
| 3126 gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1) | |
| 3127 { char *s, *t; | |
| 3128 if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) | |
| 3129 return 0; | |
| 3130 if (is_repetition(q)) | |
| 3131 { if (is_sequence(q->next)) | |
| 3132 { fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n"); | |
| 3133 if (q->next->info.typ->ref) | |
| 3134 gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, ns, ns1); | |
| 3135 fprintf(fd, " </sequence>\n"); | |
| 3136 return 1; | |
| 3137 } | |
| 3138 t = ns_convert(q->next->sym->name); | |
| 3139 if (*t == '-') | |
| 3140 fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->next->sym->name); | |
| 3141 else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) | |
| 3142 { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) | |
| 3143 if (q->info.maxOccurs == 1) | |
| 3144 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); | |
| 3145 else | |
| 3146 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); | |
| 3147 else if (q->info.maxOccurs == 1) | |
| 3148 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); | |
| 3149 else | |
| 3150 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); | |
| 3151 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3152 fprintf(fd, " </element>\n"); | |
| 3153 } | |
| 3154 else | |
| 3155 { const char *form = ""; | |
| 3156 if (!s) | |
| 3157 { s = t; | |
| 3158 if (*s == ':') | |
| 3159 { s++; | |
| 3160 form = " form=\"unqualified\""; | |
| 3161 } | |
| 3162 } | |
| 3163 else | |
| 3164 { s++; | |
| 3165 form = " form=\"qualified\""; | |
| 3166 } | |
| 3167 if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) | |
| 3168 if (q->info.maxOccurs == 1) | |
| 3169 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); | |
| 3170 else | |
| 3171 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); | |
| 3172 else if (q->info.maxOccurs == 1) | |
| 3173 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); | |
| 3174 else | |
| 3175 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); | |
| 3176 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3177 fprintf(fd, " </element>\n"); | |
| 3178 } | |
| 3179 return 1; | |
| 3180 } | |
| 3181 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)) | |
| 3182 { t = ns_convert(q->sym->name); | |
| 3183 if (*t == '-') | |
| 3184 fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->sym->name); | |
| 3185 else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) | |
| 3186 { if (((Tnode*)q->info.typ->ref)->type == Tpointer) | |
| 3187 if (q->info.maxOccurs == 1) | |
| 3188 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); | |
| 3189 else | |
| 3190 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); | |
| 3191 else if (q->info.maxOccurs == 1) | |
| 3192 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); | |
| 3193 else | |
| 3194 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); | |
| 3195 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3196 fprintf(fd, " </element>\n"); | |
| 3197 } | |
| 3198 else | |
| 3199 { const char *form = ""; | |
| 3200 if (!s) | |
| 3201 { s = t; | |
| 3202 if (*s == ':') | |
| 3203 { s++; | |
| 3204 form = " form=\"unqualified\""; | |
| 3205 } | |
| 3206 } | |
| 3207 else | |
| 3208 { s++; | |
| 3209 form = " form=\"qualified\""; | |
| 3210 } | |
| 3211 if (((Tnode*)q->info.typ->ref)->type == Tpointer) | |
| 3212 if (q->info.maxOccurs == 1) | |
| 3213 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); | |
| 3214 else | |
| 3215 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); | |
| 3216 else if (q->info.maxOccurs == 1) | |
| 3217 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); | |
| 3218 else | |
| 3219 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); | |
| 3220 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3221 fprintf(fd, " </element>\n"); | |
| 3222 } | |
| 3223 } | |
| 3224 else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ | |
| 3225 { 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); | |
| 3226 return 1; | |
| 3227 } | |
| 3228 else if (is_choice(q)) | |
| 3229 { if (q->info.minOccurs == 0) | |
| 3230 fprintf(fd, " <choice minOccurs=\"0\" maxOccurs=\"1\">\n"); | |
| 3231 else | |
| 3232 fprintf(fd, " <choice>\n"); | |
| 3233 if (q->next->info.typ->ref) | |
| 3234 gen_schema_elements(fd, q->next->info.typ, ns, ns1); | |
| 3235 fprintf(fd, " </choice>\n"); | |
| 3236 return 1; | |
| 3237 } | |
| 3238 else if (is_sequence(q)) | |
| 3239 { if (q->info.minOccurs == 0) | |
| 3240 fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"1\">\n"); | |
| 3241 else | |
| 3242 fprintf(fd, " <sequence>\n"); | |
| 3243 if (q->info.typ->type == Tpointer) | |
| 3244 gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); | |
| 3245 else if (q->info.typ->ref) | |
| 3246 gen_schema_elements(fd, q->info.typ, ns, ns1); | |
| 3247 fprintf(fd, " </sequence>\n"); | |
| 3248 return 0; | |
| 3249 } | |
| 3250 else | |
| 3251 { t = ns_convert(q->sym->name); | |
| 3252 if (*t == '-') | |
| 3253 fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"1\"/><!-- %s -->\n", q->sym->name); | |
| 3254 else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) | |
| 3255 { if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) | |
| 3256 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); | |
| 3257 else | |
| 3258 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); | |
| 3259 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3260 fprintf(fd, " </element>\n"); | |
| 3261 } | |
| 3262 else | |
| 3263 { const char *form = ""; | |
| 3264 if (!s) | |
| 3265 { s = t; | |
| 3266 if (*s == ':') | |
| 3267 { s++; | |
| 3268 form = " form=\"unqualified\""; | |
| 3269 } | |
| 3270 } | |
| 3271 else | |
| 3272 { s++; | |
| 3273 form = " form=\"qualified\""; | |
| 3274 } | |
| 3275 if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) | |
| 3276 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); | |
| 3277 else | |
| 3278 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); | |
| 3279 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3280 fprintf(fd, " </element>\n"); | |
| 3281 } | |
| 3282 } | |
| 3283 fflush(fd); | |
| 3284 return 0; | |
| 3285 } | |
| 3286 | |
| 3287 void | |
| 3288 gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *style, char *encoding) | |
| 3289 { Entry *p, *q, *e; | |
| 3290 Table *r; | |
| 3291 Service *sp; | |
| 3292 Method *m; | |
| 3293 char *method_style, *method_encoding, *method_response_encoding; | |
| 3294 int all = !strcmp(ns, ns1); | |
| 3295 r = mktable(NULL); | |
| 3296 for (p = classtable->list; p; p = p->next) | |
| 3297 { 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)) | |
| 3298 continue; | |
| 3299 for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 3300 { 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) | |
| 3301 { Service *sp2; | |
| 3302 Method *m; | |
| 3303 m = NULL; | |
| 3304 for (sp2 = services; sp2 && !m; sp2 = sp2->next) | |
| 3305 for (m = sp2->list; m; m = m->next) | |
| 3306 if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) | |
| 3307 break; | |
| 3308 if (m) | |
| 3309 continue; /* already generated element for fault */ | |
| 3310 e = entry(r, q->sym); | |
| 3311 if (e) | |
| 3312 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute) || reftype(e->info.typ) != reftype(q->info.typ)) | |
| 3313 { 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)); | |
| 3314 semwarn(errbuf); | |
| 3315 } | |
| 3316 } | |
| 3317 else | |
| 3318 { if (q->info.sto & Sattribute) | |
| 3319 fprintf(fd, " <attribute name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); | |
| 3320 else | |
| 3321 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); | |
| 3322 e = enter(r, q->sym); | |
| 3323 e->info = q->info; | |
| 3324 } | |
| 3325 } | |
| 3326 } | |
| 3327 } | |
| 3328 if (t && all) | |
| 3329 { for (p = t->list; p; p = p->next) | |
| 3330 { if (p->info.typ->type == Tfun && !is_invisible(p->sym->name) && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) | |
| 3331 { method_encoding = encoding; | |
| 3332 method_response_encoding = NULL; | |
| 3333 method_style = style; | |
| 3334 for (sp = services; sp; sp = sp->next) | |
| 3335 { if (!tagcmp(sp->ns, ns)) | |
| 3336 { for (m = sp->list; m; m = m->next) | |
| 3337 { if (is_eq_nons(m->name, p->sym->name)) | |
| 3338 { if (m->mess == ENCODING) | |
| 3339 method_encoding = m->part; | |
| 3340 else if (m->mess == RESPONSE_ENCODING) | |
| 3341 method_response_encoding = m->part; | |
| 3342 else if (m->mess == STYLE) | |
| 3343 method_style = m->part; | |
| 3344 } | |
| 3345 } | |
| 3346 } | |
| 3347 } | |
| 3348 if (!eflag) | |
| 3349 { if (!method_response_encoding) | |
| 3350 method_response_encoding = method_encoding; | |
| 3351 q = entry(classtable, p->sym); | |
| 3352 if (q) | |
| 3353 { if (is_document(method_style)) | |
| 3354 { if (!uflag) | |
| 3355 fprintf(fd, " <!-- operation request element -->\n"); | |
| 3356 fprintf(fd, " <element name=\"%s\">\n <complexType>\n <sequence>\n", ns_remove(p->sym->name)); | |
| 3357 gen_schema_elements(fd, q->info.typ, ns, ns1); | |
| 3358 fprintf(fd, " </sequence>\n"); | |
| 3359 gen_schema_attributes(fd, q->info.typ, ns, ns1); | |
| 3360 fprintf(fd, " </complexType>\n </element>\n"); | |
| 3361 } | |
| 3362 else if (is_literal(method_encoding)) | |
| 3363 { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) | |
| 3364 { 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)) | |
| 3365 { e = entry(r, q->sym); | |
| 3366 if (e) | |
| 3367 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) | |
| 3368 { 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)); | |
| 3369 semwarn(errbuf); | |
| 3370 } | |
| 3371 } | |
| 3372 else | |
| 3373 { if (!uflag) | |
| 3374 fprintf(fd, " <!-- operation request element -->\n"); | |
| 3375 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); | |
| 3376 e = enter(r, q->sym); | |
| 3377 e->info = q->info; | |
| 3378 } | |
| 3379 } | |
| 3380 } | |
| 3381 } | |
| 3382 q = (Entry*)p->info.typ->ref; | |
| 3383 for (e = t->list; e; e = e->next) | |
| 3384 if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) | |
| 3385 q = NULL; | |
| 3386 if (q && !is_transient(q->info.typ)) | |
| 3387 { if (!is_response(q->info.typ)) | |
| 3388 { if (is_document(method_style)) | |
| 3389 { if (!uflag) | |
| 3390 fprintf(fd, " <!-- operation response element -->\n"); | |
| 3391 fprintf(fd, " <element name=\"%sResponse\">\n <complexType>\n", ns_remove(p->sym->name)); | |
| 3392 fprintf(fd, " <sequence>\n"); | |
| 3393 gen_schema_element(fd, p->info.typ, q, ns, ns1); | |
| 3394 fprintf(fd, " </sequence>\n"); | |
| 3395 fprintf(fd, " </complexType>\n </element>\n"); | |
| 3396 } | |
| 3397 else if (is_literal(method_response_encoding)) | |
| 3398 { e = entry(r, q->sym); | |
| 3399 if (e) | |
| 3400 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) | |
| 3401 { 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)); | |
| 3402 semwarn(errbuf); | |
| 3403 } | |
| 3404 } | |
| 3405 else | |
| 3406 { if (!uflag) | |
| 3407 fprintf(fd, " <!-- operation response element -->\n"); | |
| 3408 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); | |
| 3409 e = enter(r, q->sym); | |
| 3410 e->info = q->info; | |
| 3411 } | |
| 3412 } | |
| 3413 } | |
| 3414 else if (((Tnode*)q->info.typ->ref)->ref) | |
| 3415 { if (is_document(method_style)) | |
| 3416 { if (!has_ns_eq(NULL, q->sym->name)) | |
| 3417 { e = entry(r, ((Tnode*)q->info.typ->ref)->id); | |
| 3418 if (!e) | |
| 3419 { if (!uflag) | |
| 3420 fprintf(fd, " <!-- operation response element -->\n"); | |
| 3421 fprintf(fd, " <element name=\"%s\">\n <complexType>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); | |
| 3422 fprintf(fd, " <sequence>\n"); | |
| 3423 gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); | |
| 3424 fprintf(fd, " </sequence>\n"); | |
| 3425 gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, ns, ns1); | |
| 3426 fprintf(fd, " </complexType>\n </element>\n"); | |
| 3427 e = enter(r, ((Tnode*)q->info.typ->ref)->id); | |
| 3428 e->info = q->info; | |
| 3429 } | |
| 3430 } | |
| 3431 } | |
| 3432 else if (is_literal(method_response_encoding)) | |
| 3433 { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) | |
| 3434 { 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)) | |
| 3435 { e = entry(r, q->sym); | |
| 3436 if (e) | |
| 3437 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) | |
| 3438 { 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)); | |
| 3439 semwarn(errbuf); | |
| 3440 } | |
| 3441 } | |
| 3442 else | |
| 3443 { if (!uflag) | |
| 3444 fprintf(fd, " <!-- operation response element -->\n"); | |
| 3445 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); | |
| 3446 e = enter(r, q->sym); | |
| 3447 e->info = q->info; | |
| 3448 } | |
| 3449 } | |
| 3450 } | |
| 3451 } | |
| 3452 } | |
| 3453 } | |
| 3454 } | |
| 3455 } | |
| 3456 } | |
| 3457 } | |
| 3458 } | |
| 3459 if (t) | |
| 3460 { for (p = t->list; p; p = p->next) | |
| 3461 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && !eflag) | |
| 3462 { q = (Entry*)p->info.typ->ref; | |
| 3463 if (q && !is_transient(q->info.typ)) | |
| 3464 { if (is_response(q->info.typ)) | |
| 3465 { if (has_ns_eq(ns, q->sym->name)) | |
| 3466 { e = entry(r, q->sym); | |
| 3467 if (!e) | |
| 3468 { if (!uflag) | |
| 3469 fprintf(fd, " <!-- operation response element -->\n"); | |
| 3470 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); | |
| 3471 e = enter(r, q->sym); | |
| 3472 e->info = q->info; | |
| 3473 } | |
| 3474 } | |
| 3475 } | |
| 3476 } | |
| 3477 } | |
| 3478 } | |
| 3479 } | |
| 3480 freetable(r); | |
| 3481 } | |
| 3482 | |
| 3483 void | |
| 3484 gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1) | |
| 3485 { Entry *q; | |
| 3486 char *t, *s, *r; | |
| 3487 for (q = ((Table*)p->ref)->list; q; q = q->next) | |
| 3488 { if (q->info.sto & Sattribute) | |
| 3489 { r = default_value(q, "default"); | |
| 3490 t = ns_convert(q->sym->name); | |
| 3491 if (*t == '-' || is_anyAttribute(q->info.typ)) | |
| 3492 fprintf(fd, " <anyAttribute processContents=\"lax\"/><!-- %s -->\n", q->sym->name); | |
| 3493 else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) | |
| 3494 { if (r && *r) | |
| 3495 fprintf(fd, " <attribute ref=\"%s\" use=\"default\"%s/>\n", t, r); | |
| 3496 else if (q->info.typ->type != Tpointer || q->info.minOccurs) | |
| 3497 fprintf(fd, " <attribute ref=\"%s\" use=\"required\"/>\n", t); | |
| 3498 else if (q->info.maxOccurs == 0) | |
| 3499 fprintf(fd, " <attribute ref=\"%s\" use=\"prohibited\"/>\n", t); | |
| 3500 else | |
| 3501 fprintf(fd, " <attribute ref=\"%s\" use=\"optional\"/>\n", t); | |
| 3502 } | |
| 3503 else | |
| 3504 { const char *form = ""; | |
| 3505 if (!s) | |
| 3506 { s = t; | |
| 3507 if (*s == ':') | |
| 3508 { s++; | |
| 3509 form = " form=\"unqualified\""; | |
| 3510 } | |
| 3511 } | |
| 3512 else | |
| 3513 { s++; | |
| 3514 form = " form=\"qualified\""; | |
| 3515 } | |
| 3516 if (r && *r) | |
| 3517 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"default\"%s%s", s, wsdl_type(q->info.typ, ns1), r, form); | |
| 3518 else if ((q->info.typ->type != Tpointer && !is_stdstring(q->info.typ) && !is_stdwstring(q->info.typ)) || q->info.minOccurs) | |
| 3519 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"required\"%s", s, wsdl_type(q->info.typ, ns1), form); | |
| 3520 else if (q->info.maxOccurs == 0) | |
| 3521 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"prohibited\"", s, wsdl_type(q->info.typ, ns1)); | |
| 3522 else | |
| 3523 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"optional\"%s", s, wsdl_type(q->info.typ, ns1), form); | |
| 3524 if (gen_member_documentation(fd, p->id, q, ns)) | |
| 3525 fprintf(fd, " </attribute>\n"); | |
| 3526 } | |
| 3527 fflush(fd); | |
| 3528 } | |
| 3529 } | |
| 3530 } | |
| 3531 | |
| 3532 void | |
| 3533 gen_type_documentation(FILE *fd, Entry *type, char *ns) | |
| 3534 { Service *sp; | |
| 3535 Data *d; | |
| 3536 if (!type->sym) | |
| 3537 { fprintf(fd, "\n"); | |
| 3538 return; | |
| 3539 } | |
| 3540 for (sp = services; sp; sp = sp->next) | |
| 3541 { if (!tagcmp(sp->ns, ns)) | |
| 3542 { for (d = sp->data; d; d = d->next) | |
| 3543 { if (!strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) | |
| 3544 { fprintf(fd, "\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text); | |
| 3545 return; | |
| 3546 } | |
| 3547 } | |
| 3548 } | |
| 3549 } | |
| 3550 if (!uflag) | |
| 3551 fprintf(fd, "<!-- %s -->\n", type->sym->name); | |
| 3552 fprintf(fd, "\n"); | |
| 3553 } | |
| 3554 | |
| 3555 int | |
| 3556 gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns) | |
| 3557 { Service *sp; | |
| 3558 Data *d; | |
| 3559 char *t; | |
| 3560 if (!type || !member->sym) | |
| 3561 { fprintf(fd, "/>\n"); | |
| 3562 return 0; | |
| 3563 } | |
| 3564 t = ns_remove(type->name); | |
| 3565 for (sp = services; sp; sp = sp->next) | |
| 3566 { if (!tagcmp(sp->ns, ns)) | |
| 3567 { for (d = sp->data; d; d = d->next) | |
| 3568 { char *s = strstr(d->name, "::"); | |
| 3569 if (s && !strncmp(t, d->name, s-d->name) && !strcmp(s + 2, member->sym->name)) | |
| 3570 { fprintf(fd, ">\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text); | |
| 3571 return 1; | |
| 3572 } | |
| 3573 } | |
| 3574 } | |
| 3575 } | |
| 3576 fprintf(fd, "/>"); | |
| 3577 if (!uflag) | |
| 3578 fprintf(fd, "<!-- %s::%s -->", type->name, member->sym->name); | |
| 3579 fprintf(fd, "\n"); | |
| 3580 return 0; | |
| 3581 } | |
| 3582 | |
| 3583 void | |
| 3584 gen_nsmap(FILE *fd, Symbol *ns, char *URI) | |
| 3585 { Symbol *ns1; | |
| 3586 Service *sp; | |
| 3587 fprintf(fd, "{\n"); | |
| 3588 for (ns1 = nslist; ns1; ns1 = ns1->next) | |
| 3589 { for (sp = services; sp; sp = sp->next) | |
| 3590 if (!tagcmp(sp->ns, ns1->name) && sp->URI) | |
| 3591 break; | |
| 3592 if (sp) | |
| 3593 { if (!strcmp(ns1->name, "SOAP-ENV")) | |
| 3594 { if (vflag < 0) | |
| 3595 fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); | |
| 3596 else | |
| 3597 fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); | |
| 3598 } | |
| 3599 else if (!strcmp(ns1->name, "SOAP-ENC")) | |
| 3600 { if (vflag < 0) | |
| 3601 fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); | |
| 3602 else | |
| 3603 fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); | |
| 3604 } | |
| 3605 else if (sp->URI2) | |
| 3606 fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2); | |
| 3607 else | |
| 3608 fprintf(fd, "\t{\"%s\", \"%s\", NULL, NULL},\n", ns_convert(ns1->name), sp->URI); | |
| 3609 } | |
| 3610 else if (!strcmp(ns1->name, "SOAP-ENV")) | |
| 3611 { if (vflag < 0) | |
| 3612 fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); | |
| 3613 else if (is_soap12(NULL)) | |
| 3614 fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL},\n", envURI); | |
| 3615 else | |
| 3616 fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL},\n", envURI); | |
| 3617 } | |
| 3618 else if (!strcmp(ns1->name, "SOAP-ENC")) | |
| 3619 { if (vflag < 0) | |
| 3620 fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); | |
| 3621 else if (is_soap12(NULL)) | |
| 3622 fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL},\n", encURI); | |
| 3623 else | |
| 3624 fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL},\n", encURI); | |
| 3625 } | |
| 3626 else if (!strcmp(ns1->name, "xsi")) | |
| 3627 fprintf(fd, "\t{\"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n", xsiURI); | |
| 3628 else if (!strcmp(ns1->name, "xsd")) | |
| 3629 fprintf(fd, "\t{\"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL},\n", xsdURI); | |
| 3630 else | |
| 3631 fprintf(fd, "\t{\"%s\", \"%s/%s.xsd\", NULL, NULL},\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); | |
| 3632 } | |
| 3633 fprintf(fd, "\t{NULL, NULL, NULL, NULL}\n};\n"); | |
| 3634 } | |
| 3635 | |
| 3636 void | |
| 3637 gen_proxy(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 3638 { Entry *p, *q, *r; | |
| 3639 Table *t, *output; | |
| 3640 Service *sp; | |
| 3641 int flag; | |
| 3642 char *name1; | |
| 3643 name1 = ns_cname(name, NULL); | |
| 3644 for (sp = services; sp; sp = sp->next) | |
| 3645 if (!tagcmp(sp->ns, ns->name)) | |
| 3646 break; | |
| 3647 fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); | |
| 3648 if (nflag) | |
| 3649 fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); | |
| 3650 if (namespaceid) | |
| 3651 fprintf(fd,"\n\nnamespace %s {", namespaceid); | |
| 3652 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); | |
| 3653 if (nflag) | |
| 3654 fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; endpoint = \"%s\"; };\n", name1, prefix, URL); | |
| 3655 else | |
| 3656 { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); endpoint = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = \n", name1, URL); | |
| 3657 gen_nsmap(fd, ns, URI); | |
| 3658 fprintf(fd, "\tsoap->namespaces = namespaces; } };\n"); | |
| 3659 } | |
| 3660 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); | |
| 3661 fflush(fd); | |
| 3662 for (r = table->list; r; r = r->next) | |
| 3663 if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) | |
| 3664 { p = entry(table, r->sym); | |
| 3665 if (p) | |
| 3666 q = (Entry*)p->info.typ->ref; | |
| 3667 else | |
| 3668 { fprintf(stderr, "Internal error: no table entry\n"); | |
| 3669 return; | |
| 3670 } | |
| 3671 p = entry(classtable, r->sym); | |
| 3672 if (!p) | |
| 3673 { fprintf(stderr, "Internal error: no parameter table entry\n"); | |
| 3674 return; | |
| 3675 } | |
| 3676 output = (Table*)p->info.typ->ref; | |
| 3677 /* | |
| 3678 if ((s = strstr(r->sym->name, "__"))) | |
| 3679 s += 2; | |
| 3680 else | |
| 3681 s = r->sym->name; | |
| 3682 fprintf(fd, "\tvirtual int %s(", s); | |
| 3683 */ | |
| 3684 fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); | |
| 3685 fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); | |
| 3686 flag = 0; | |
| 3687 for (t = output; t; t = t->prev) | |
| 3688 { p = t->list; | |
| 3689 if (p) | |
| 3690 { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); | |
| 3691 for (p = p->next; p; p = p->next) | |
| 3692 fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); | |
| 3693 flag = 1; | |
| 3694 } | |
| 3695 } | |
| 3696 if (is_transient(q->info.typ)) | |
| 3697 fprintf(fd,") { return soap ? soap_send_%s(soap, endpoint, NULL", ident(r->sym->name)); | |
| 3698 else if (flag) | |
| 3699 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)); | |
| 3700 else | |
| 3701 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)); | |
| 3702 /* the action is now handled by the soap_call/soap_send operation when we pass NULL */ | |
| 3703 #if 0 | |
| 3704 m = NULL; | |
| 3705 if (sp && (s = strstr(r->sym->name, "__"))) | |
| 3706 for (m = sp->list; m; m = m->next) | |
| 3707 if (m->part && m->mess == ACTION && !strcmp(m->name, s+2)) | |
| 3708 { if (*m->part == '"') | |
| 3709 fprintf(fd, "%s", m->part); | |
| 3710 else | |
| 3711 fprintf(fd, "\"%s\"", m->part); | |
| 3712 break; | |
| 3713 } | |
| 3714 if (!m) | |
| 3715 fprintf(fd, "NULL"); | |
| 3716 #endif | |
| 3717 for (t = output; t; t = t->prev) | |
| 3718 for (p = t->list; p; p = p->next) | |
| 3719 fprintf(fd, ", %s", ident(p->sym->name)); | |
| 3720 if (is_transient(q->info.typ)) | |
| 3721 fprintf(fd,") : SOAP_EOM; };\n"); | |
| 3722 else | |
| 3723 fprintf(fd,", %s) : SOAP_EOM; };\n", ident(q->sym->name)); | |
| 3724 fflush(fd); | |
| 3725 } | |
| 3726 fprintf(fd, "};"); | |
| 3727 if (namespaceid) | |
| 3728 fprintf(fd,"\n\n} // namespace %s\n", namespaceid); | |
| 3729 fprintf(fd, "\n#endif\n"); | |
| 3730 } | |
| 3731 | |
| 3732 void | |
| 3733 gen_object(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 3734 { char *name1; | |
| 3735 Entry *method; | |
| 3736 name1 = ns_cname(name, NULL); | |
| 3737 fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); | |
| 3738 banner(fd, "Service Object"); | |
| 3739 if (namespaceid) | |
| 3740 fprintf(fd,"\n\nnamespace %s {", namespaceid); | |
| 3741 fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); | |
| 3742 fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] =\n", name1); | |
| 3743 gen_nsmap(fd, ns, URI); | |
| 3744 fprintf(fd, "\n\tthis->namespaces = namespaces; };"); | |
| 3745 fprintf(fd, "\n\tvirtual ~%sService() { };", name1); | |
| 3746 fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); | |
| 3747 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); | |
| 3748 fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); | |
| 3749 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); | |
| 3750 fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); | |
| 3751 fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); | |
| 3752 fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); | |
| 3753 fprintf(fd, "\n#endif"); | |
| 3754 fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); | |
| 3755 if (nflag) | |
| 3756 fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); | |
| 3757 else | |
| 3758 fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); | |
| 3759 fprintf(fd, "\n};"); | |
| 3760 banner(fd, "Service Operations (you should define these globally)"); | |
| 3761 for (method = table->list; method; method = method->next) | |
| 3762 { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) | |
| 3763 { Entry *p, *q=entry(table, method->sym); | |
| 3764 Table *output; | |
| 3765 if (q) | |
| 3766 p = (Entry*)q->info.typ->ref; | |
| 3767 else | |
| 3768 { fprintf(stderr, "Internal error: no table entry\n"); | |
| 3769 return; | |
| 3770 } | |
| 3771 q = entry(classtable, method->sym); | |
| 3772 output = (Table*)q->info.typ->ref; | |
| 3773 fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); | |
| 3774 gen_params(fd, output, p, 1); | |
| 3775 fprintf(fd, ";"); | |
| 3776 } | |
| 3777 } | |
| 3778 if (namespaceid) | |
| 3779 fprintf(fd,"\n\n} // namespace %s\n", namespaceid); | |
| 3780 fprintf(fd, "\n\n#endif\n"); | |
| 3781 } | |
| 3782 | |
| 3783 void | |
| 3784 gen_proxy_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 3785 { Entry *p, *method; | |
| 3786 Table *t; | |
| 3787 fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); | |
| 3788 if (namespaceid) | |
| 3789 fprintf(fd,"\n\nnamespace %s {", namespaceid); | |
| 3790 if (iflag) | |
| 3791 fprintf(fd, "\n\nclass SOAP_CMAC %s : public soap\n{ public:", name); | |
| 3792 else | |
| 3793 fprintf(fd, "\n\nclass SOAP_CMAC %s\n{ public:", name); | |
| 3794 if (!iflag) | |
| 3795 fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;"); | |
| 3796 fprintf(fd, "\n\t/// Endpoint URL of service '%s' (change as needed)", name); | |
| 3797 fprintf(fd, "\n\tconst char *soap_endpoint;"); | |
| 3798 fprintf(fd, "\n\t/// Constructor"); | |
| 3799 fprintf(fd, "\n\t%s();", name); | |
| 3800 if (iflag) | |
| 3801 { fprintf(fd, "\n\t/// Construct from another engine state"); | |
| 3802 fprintf(fd, "\n\t%s(const struct soap&);", name); | |
| 3803 } | |
| 3804 else | |
| 3805 { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); | |
| 3806 fprintf(fd, "\n\t%s(struct soap*);", name); | |
| 3807 } | |
| 3808 fprintf(fd, "\n\t/// Constructor with endpoint URL"); | |
| 3809 fprintf(fd, "\n\t%s(const char *url);", name); | |
| 3810 fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); | |
| 3811 fprintf(fd, "\n\t%s(soap_mode iomode);", name); | |
| 3812 fprintf(fd, "\n\t/// Constructor with URL and input+output mode control"); | |
| 3813 fprintf(fd, "\n\t%s(const char *url, soap_mode iomode);", name); | |
| 3814 fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); | |
| 3815 fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); | |
| 3816 fprintf(fd, "\n\t/// Destructor frees deserialized data"); | |
| 3817 fprintf(fd, "\n\tvirtual\t~%s();", name); | |
| 3818 fprintf(fd, "\n\t/// Initializer used by constructors"); | |
| 3819 fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); | |
| 3820 fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); | |
| 3821 fprintf(fd, "\n\tvirtual\tvoid destroy();"); | |
| 3822 fprintf(fd, "\n\t/// Delete all deserialized data and reset to default"); | |
| 3823 fprintf(fd, "\n\tvirtual\tvoid reset();"); | |
| 3824 fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); | |
| 3825 fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); | |
| 3826 if (!namespaceid) | |
| 3827 { | |
| 3828 p = entry(classtable, lookup("SOAP_ENV__Header")); | |
| 3829 if (p) | |
| 3830 { t = (Table*)p->info.typ->ref; | |
| 3831 if (t && t->list && !is_void(t->list->info.typ)) | |
| 3832 { fprintf(fd, "\n\t/// Put SOAP Header in message"); | |
| 3833 fprintf(fd, "\n\tvirtual\tvoid soap_header("); | |
| 3834 gen_params(fd, t, NULL, 0); | |
| 3835 fprintf(fd, ";"); | |
| 3836 } | |
| 3837 } | |
| 3838 } | |
| 3839 fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); | |
| 3840 fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); | |
| 3841 fprintf(fd, "\n\t/// Get SOAP Fault structure (NULL when absent)"); | |
| 3842 fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Fault *soap_fault();"); | |
| 3843 fprintf(fd, "\n\t/// Get SOAP Fault string (NULL when absent)"); | |
| 3844 fprintf(fd, "\n\tvirtual\tconst char *soap_fault_string();"); | |
| 3845 fprintf(fd, "\n\t/// Get SOAP Fault detail as string (NULL when absent)"); | |
| 3846 fprintf(fd, "\n\tvirtual\tconst char *soap_fault_detail();"); | |
| 3847 fprintf(fd, "\n\t/// Close connection (normally automatic, except for send_X ops)"); | |
| 3848 fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); | |
| 3849 fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); | |
| 3850 fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); | |
| 3851 fprintf(fd, "\n\t/// Print fault"); | |
| 3852 fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); | |
| 3853 fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); | |
| 3854 fprintf(fd, "\n#ifndef WITH_COMPAT"); | |
| 3855 fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); | |
| 3856 fprintf(fd, "\n#endif\n"); | |
| 3857 fprintf(fd, "\n\t/// Put fault into buffer"); | |
| 3858 fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); | |
| 3859 for (method = table->list; method; method = method->next) | |
| 3860 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) | |
| 3861 gen_method(fd, table, method, 0); | |
| 3862 fprintf(fd, "\n};"); | |
| 3863 if (namespaceid) | |
| 3864 fprintf(fd,"\n\n} // namespace %s\n", namespaceid); | |
| 3865 fprintf(fd, "\n#endif\n"); | |
| 3866 } | |
| 3867 | |
| 3868 void | |
| 3869 gen_proxy_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 3870 { Entry *p, *method, *param; | |
| 3871 Table *t; | |
| 3872 char *soap; | |
| 3873 if (iflag) | |
| 3874 soap = "this"; | |
| 3875 else | |
| 3876 soap = "this->soap"; | |
| 3877 fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); | |
| 3878 if (namespaceid) | |
| 3879 fprintf(fd,"\n\nnamespace %s {", namespaceid); | |
| 3880 if (iflag) | |
| 3881 { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); | |
| 3882 fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); | |
| 3883 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); | |
| 3884 fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); | |
| 3885 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); | |
| 3886 fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name); | |
| 3887 fprintf(fd, "\n\n%s::~%s()\n{ }", name, name); | |
| 3888 } | |
| 3889 else | |
| 3890 { 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); | |
| 3891 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); | |
| 3892 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); | |
| 3893 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); | |
| 3894 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); | |
| 3895 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); | |
| 3896 fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name); | |
| 3897 } | |
| 3898 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); | |
| 3899 gen_nsmap(fd, ns, URI); | |
| 3900 fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); | |
| 3901 fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); | |
| 3902 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); | |
| 3903 fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); | |
| 3904 if (!namespaceid) | |
| 3905 { | |
| 3906 p = entry(classtable, lookup("SOAP_ENV__Header")); | |
| 3907 if (p) | |
| 3908 { t = (Table*)p->info.typ->ref; | |
| 3909 if (t && t->list && !is_void(t->list->info.typ)) | |
| 3910 { fprintf(fd, "\n\nvoid %s::soap_header(", name); | |
| 3911 gen_params(fd, t, NULL, 0); | |
| 3912 fprintf(fd, "\n{\t::soap_header(%s);", soap); | |
| 3913 for (param = t->list; param; param = param->next) | |
| 3914 { if (namespaceid) | |
| 3915 fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); | |
| 3916 else | |
| 3917 fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); | |
| 3918 } | |
| 3919 fprintf(fd, "\n}"); | |
| 3920 } | |
| 3921 } | |
| 3922 } | |
| 3923 fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); | |
| 3924 fprintf(fd, "\n\nconst SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); | |
| 3925 fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn *soap_faultstring(%s);\n}", name, soap); | |
| 3926 fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn *soap_faultdetail(%s);\n}", name, soap); | |
| 3927 fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); | |
| 3928 fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); | |
| 3929 fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); | |
| 3930 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); | |
| 3931 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); | |
| 3932 for (method = table->list; method; method = method->next) | |
| 3933 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) | |
| 3934 gen_call_method(fd, table, method, name); | |
| 3935 if (namespaceid) | |
| 3936 fprintf(fd,"\n\n} // namespace %s\n", namespaceid); | |
| 3937 fprintf(fd,"\n/* End of client proxy code */\n"); | |
| 3938 } | |
| 3939 | |
| 3940 void | |
| 3941 gen_object_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 3942 { Entry *p, *method; | |
| 3943 Table *t; | |
| 3944 fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); | |
| 3945 if (namespaceid) | |
| 3946 fprintf(fd,"\n\nnamespace %s {", namespaceid); | |
| 3947 if (iflag) | |
| 3948 fprintf(fd, "\nclass SOAP_CMAC %s : public soap\n{ public:", name); | |
| 3949 else | |
| 3950 { fprintf(fd, "\nclass SOAP_CMAC %s\n{ public:", name); | |
| 3951 fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;"); | |
| 3952 } | |
| 3953 fprintf(fd, "\n\t/// Constructor"); | |
| 3954 fprintf(fd, "\n\t%s();", name); | |
| 3955 if (iflag) | |
| 3956 { fprintf(fd, "\n\t/// Construct from another engine state"); | |
| 3957 fprintf(fd, "\n\t%s(const struct soap&);", name); | |
| 3958 } | |
| 3959 else | |
| 3960 { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); | |
| 3961 fprintf(fd, "\n\t%s(struct soap*);", name); | |
| 3962 } | |
| 3963 fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); | |
| 3964 fprintf(fd, "\n\t%s(soap_mode iomode);", name); | |
| 3965 fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); | |
| 3966 fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); | |
| 3967 fprintf(fd, "\n\t/// Destructor, also frees all deserialized data"); | |
| 3968 fprintf(fd, "\n\tvirtual ~%s();", name); | |
| 3969 fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); | |
| 3970 fprintf(fd, "\n\tvirtual\tvoid destroy();"); | |
| 3971 fprintf(fd, "\n\t/// Delete all deserialized data and reset to defaults"); | |
| 3972 fprintf(fd, "\n\tvirtual\tvoid reset();"); | |
| 3973 fprintf(fd, "\n\t/// Initializer used by constructor"); | |
| 3974 fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); | |
| 3975 fprintf(fd, "\n\t/// Create a copy"); | |
| 3976 fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); | |
| 3977 fprintf(fd, "\n\t/// Close connection (normally automatic)"); | |
| 3978 fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); | |
| 3979 fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); | |
| 3980 fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); | |
| 3981 fprintf(fd, "\n\t/// Return sender-related fault to sender"); | |
| 3982 fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *string, const char *detailXML);"); | |
| 3983 fprintf(fd, "\n\t/// Return sender-related fault with SOAP 1.2 subcode to sender"); | |
| 3984 fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); | |
| 3985 fprintf(fd, "\n\t/// Return receiver-related fault to sender"); | |
| 3986 fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *string, const char *detailXML);"); | |
| 3987 fprintf(fd, "\n\t/// Return receiver-related fault with SOAP 1.2 subcode to sender"); | |
| 3988 fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); | |
| 3989 fprintf(fd, "\n\t/// Print fault"); | |
| 3990 fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); | |
| 3991 fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); | |
| 3992 fprintf(fd, "\n#ifndef WITH_COMPAT"); | |
| 3993 fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); | |
| 3994 fprintf(fd, "\n#endif"); | |
| 3995 fprintf(fd, "\n\t/// Put fault into buffer"); | |
| 3996 fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); | |
| 3997 fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); | |
| 3998 fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); | |
| 3999 if (!namespaceid) | |
| 4000 { | |
| 4001 p = entry(classtable, lookup("SOAP_ENV__Header")); | |
| 4002 if (p) | |
| 4003 { t = (Table*)p->info.typ->ref; | |
| 4004 if (t && t->list && !is_void(t->list->info.typ)) | |
| 4005 { fprintf(fd, "\n\t/// Put SOAP Header in message"); | |
| 4006 fprintf(fd, "\n\tvirtual\tvoid soap_header("); | |
| 4007 gen_params(fd, t, NULL, 0); | |
| 4008 fprintf(fd, ";"); | |
| 4009 } | |
| 4010 } | |
| 4011 } | |
| 4012 fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); | |
| 4013 fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); | |
| 4014 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"); | |
| 4015 fprintf(fd, "\n\tvirtual\tint run(int port);"); | |
| 4016 fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); | |
| 4017 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog);"); | |
| 4018 fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); | |
| 4019 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept();"); | |
| 4020 fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); | |
| 4021 fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); | |
| 4022 fprintf(fd, "\n\tvirtual\tint ssl_accept();"); | |
| 4023 fprintf(fd, "\n#endif"); | |
| 4024 fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); | |
| 4025 fprintf(fd, "\n\tvirtual\tint serve();"); | |
| 4026 fprintf(fd, "\n\t/// Used by serve() to dispatch a request (returns error code or SOAP_OK)"); | |
| 4027 fprintf(fd, "\n\tvirtual\tint dispatch();"); | |
| 4028 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///"); | |
| 4029 for (method = table->list; method; method = method->next) | |
| 4030 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) | |
| 4031 gen_method(fd, table, method, 1); | |
| 4032 fprintf(fd, "\n};"); | |
| 4033 if (namespaceid) | |
| 4034 fprintf(fd,"\n\n} // namespace %s\n", namespaceid); | |
| 4035 fprintf(fd, "\n#endif\n"); | |
| 4036 } | |
| 4037 | |
| 4038 void | |
| 4039 gen_method(FILE *fd, Table *table, Entry *method, int server) | |
| 4040 { Table *params; | |
| 4041 Entry *result, *p; | |
| 4042 char *soap; | |
| 4043 if (iflag) | |
| 4044 soap = "this"; | |
| 4045 else | |
| 4046 soap = "this->soap"; | |
| 4047 result = (Entry*)method->info.typ->ref; | |
| 4048 p = entry(classtable, method->sym); | |
| 4049 if (!p) | |
| 4050 execerror("no table entry"); | |
| 4051 params = (Table*)p->info.typ->ref; | |
| 4052 if (server || !is_transient(result->info.typ)) | |
| 4053 { if (is_transient(result->info.typ)) | |
| 4054 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)); | |
| 4055 else | |
| 4056 fprintf(fd, "\n\n\t/// Web service operation '%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); | |
| 4057 fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); | |
| 4058 gen_params(fd, params, result, 0); | |
| 4059 if (!server) | |
| 4060 { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); | |
| 4061 gen_args(fd, params, result, 1); | |
| 4062 fprintf(fd, "; }"); | |
| 4063 fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); | |
| 4064 gen_params(fd, params, result, 1); | |
| 4065 } | |
| 4066 if (server) | |
| 4067 fprintf(fd, " SOAP_PURE_VIRTUAL;"); | |
| 4068 else | |
| 4069 fprintf(fd, ";"); | |
| 4070 if (is_transient(result->info.typ)) | |
| 4071 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); | |
| 4072 } | |
| 4073 else | |
| 4074 { fprintf(fd, "\n\n\t/// Web service one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); | |
| 4075 fprintf(fd, "\n\tvirtual\tint send_%s(", ns_cname(method->sym->name, NULL)); | |
| 4076 gen_params(fd, params, result, 0); | |
| 4077 fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); | |
| 4078 gen_args(fd, params, result, 1); | |
| 4079 fprintf(fd, "; }"); | |
| 4080 fprintf(fd, "\n\tvirtual\tint send_%s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); | |
| 4081 gen_params(fd, params, result, 1); | |
| 4082 fprintf(fd, ";\n\t/// Web service one-way receive operation 'recv_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); | |
| 4083 fprintf(fd, ";\n\tvirtual\tint recv_%s(", ns_cname(method->sym->name, NULL)); | |
| 4084 fprintf(fd, "struct %s&);", ident(method->sym->name)); | |
| 4085 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)); | |
| 4086 fprintf(fd, "\n\tvirtual\tint recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); | |
| 4087 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)); | |
| 4088 fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); | |
| 4089 gen_params(fd, params, result, 0); | |
| 4090 fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); | |
| 4091 gen_args(fd, params, result, 1); | |
| 4092 fprintf(fd, "; }"); | |
| 4093 fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); | |
| 4094 gen_params(fd, params, result, 1); | |
| 4095 fprintf(fd, " { if (this->send_%s(endpoint, soap_action", ns_cname(method->sym->name, NULL)); | |
| 4096 gen_args(fd, params, result, 1); | |
| 4097 fprintf(fd, " || soap_recv_empty_response(%s)) return %s->error; return SOAP_OK; }", soap, soap); | |
| 4098 } | |
| 4099 } | |
| 4100 | |
| 4101 void | |
| 4102 gen_params(FILE *fd, Table *params, Entry *result, int flag) | |
| 4103 { Entry *param; | |
| 4104 for (param = params->list; param; param = param->next) | |
| 4105 fprintf(fd, "%s%s%s", flag || param != params->list ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); | |
| 4106 if (!result || is_transient(result->info.typ)) | |
| 4107 fprintf(fd, ")"); | |
| 4108 else | |
| 4109 fprintf(fd, "%s%s%s)", flag || params->list ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); | |
| 4110 } | |
| 4111 | |
| 4112 void | |
| 4113 gen_args(FILE *fd, Table *params, Entry *result, int flag) | |
| 4114 { Entry *param; | |
| 4115 for (param = params->list; param; param = param->next) | |
| 4116 fprintf(fd, "%s%s", flag || param != params->list ? ", " : "", param->sym->name); | |
| 4117 if (!result || is_transient(result->info.typ)) | |
| 4118 fprintf(fd, ")"); | |
| 4119 else | |
| 4120 fprintf(fd, "%s%s)", flag || params->list ? ", " : "", result->sym->name); | |
| 4121 } | |
| 4122 | |
| 4123 void | |
| 4124 gen_query_url(FILE *fd, Table *params) | |
| 4125 { Entry *param; | |
| 4126 int flag = 0; | |
| 4127 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?"); | |
| 4128 for (param = params->list; param; param = param->next) | |
| 4129 if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) | |
| 4130 fprintf(fd, "%s%s=%s", flag++ ? "&" : "", ns_remove(param->sym->name), gen_format(fd, param->info.typ)); | |
| 4131 fprintf(fd, "\", soap_endpoint"); | |
| 4132 for (param = params->list; param; param = param->next) | |
| 4133 { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) | |
| 4134 { if (is_stdstring(param->info.typ)) | |
| 4135 fprintf(fd, ", soap_encode_url_string(soap, %s.c_str())", ident(param->sym->name)); | |
| 4136 else if (is_string(param->info.typ)) | |
| 4137 fprintf(fd, ", soap_encode_url_string(soap, %s)", ident(param->sym->name)); | |
| 4138 else if (is_primitive(param->info.typ)) | |
| 4139 fprintf(fd, ", %s", ident(param->sym->name)); | |
| 4140 } | |
| 4141 } | |
| 4142 fprintf(fd, ") < 0)\n\t{\tsoap->error = SOAP_EOM;\n\t\treturn soap_closesock(soap);\n\t}"); | |
| 4143 } | |
| 4144 | |
| 4145 void | |
| 4146 gen_query_form(FILE *fd, Table *params) | |
| 4147 { Entry *param; | |
| 4148 int flag = 0; | |
| 4149 fprintf(fd, "\n\tif ("); | |
| 4150 for (param = params->list; param; param = param->next) | |
| 4151 { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) | |
| 4152 { fprintf(fd, "soap_send(soap, \"%s%s=\")", flag++ ? "&" : "", ns_remove(param->sym->name)); | |
| 4153 if (is_stdstring(param->info.typ)) | |
| 4154 fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s.c_str()))\n\t || ", ident(param->sym->name)); | |
| 4155 else if (is_string(param->info.typ)) | |
| 4156 fprintf(fd, " || soap_send(soap_encode_url_string(soap, %s))\n\t || ", ident(param->sym->name)); | |
| 4157 else if (is_primitive(param->info.typ)) | |
| 4158 fprintf(fd, " || soap_send(soap, soap_%s2s(soap, %s))\n\t || ", c_ident(param->info.typ), ident(param->sym->name)); | |
| 4159 } | |
| 4160 } | |
| 4161 } | |
| 4162 | |
| 4163 const char* | |
| 4164 gen_format(FILE *fd, Tnode *typ) | |
| 4165 { if (is_string(typ) || is_stdstring(typ)) | |
| 4166 return "%s"; | |
| 4167 switch (typ->type) | |
| 4168 { case Tchar: return "%hhd"; | |
| 4169 case Tshort: return "%hd"; | |
| 4170 case Tint: return "%d"; | |
| 4171 case Tlong: return "%ld"; | |
| 4172 case Tllong: return SOAP_LONG_FORMAT; | |
| 4173 case Tfloat: return "%.9G"; | |
| 4174 case Tdouble: return "%.17lG"; | |
| 4175 case Tuchar: return "%hhu"; | |
| 4176 case Tushort: return "%hu"; | |
| 4177 case Tuint: return "%u"; | |
| 4178 case Tulong: return "%lu"; | |
| 4179 case Tullong: return SOAP_ULONG_FORMAT; | |
| 4180 default: return ""; | |
| 4181 } | |
| 4182 } | |
| 4183 | |
| 4184 void | |
| 4185 gen_call_method(FILE *fd, Table *table, Entry *method, char *name) | |
| 4186 { Service *sp; | |
| 4187 Method *m; | |
| 4188 int soap = (vflag >= 0); | |
| 4189 int version = vflag; | |
| 4190 int get = 0; | |
| 4191 int put = 0; | |
| 4192 int post = 0; | |
| 4193 int mime = 0; | |
| 4194 const char *style, *encoding; | |
| 4195 const char *xtag, *xtyp; | |
| 4196 const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; | |
| 4197 Table *params; | |
| 4198 Entry *param, *result, *p, *response = NULL; | |
| 4199 result = (Entry*)method->info.typ->ref; | |
| 4200 p = entry(classtable, method->sym); | |
| 4201 if (!p) | |
| 4202 execerror("no table entry"); | |
| 4203 params = (Table*)p->info.typ->ref; | |
| 4204 if (!is_response(result->info.typ) && !is_XML(result->info.typ)) | |
| 4205 response = get_response(method->info.typ); | |
| 4206 if (name) | |
| 4207 { if (!is_transient(result->info.typ)) | |
| 4208 fprintf(fd, "\n\nint %s::%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); | |
| 4209 else | |
| 4210 fprintf(fd, "\n\nint %s::send_%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); | |
| 4211 gen_params(fd, params, result, 1); | |
| 4212 } | |
| 4213 else if (!is_transient(result->info.typ)) | |
| 4214 { 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)); | |
| 4215 gen_params(fheader, params, result, 1); | |
| 4216 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)); | |
| 4217 gen_params(fd, params, result, 1); | |
| 4218 } | |
| 4219 else | |
| 4220 { 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)); | |
| 4221 gen_params(fheader, params, result, 1); | |
| 4222 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)); | |
| 4223 gen_params(fd, params, result, 1); | |
| 4224 } | |
| 4225 if (name) | |
| 4226 { if (iflag) | |
| 4227 fprintf(fd, "\n{\tstruct soap *soap = this;\n"); | |
| 4228 else | |
| 4229 fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); | |
| 4230 } | |
| 4231 else | |
| 4232 { fprintf(fheader, ";"); | |
| 4233 fprintf(fd, "\n{"); | |
| 4234 } | |
| 4235 for (sp = services; sp; sp = sp->next) | |
| 4236 { if (has_ns_eq(sp->ns, method->sym->name)) | |
| 4237 { style = sp->style; | |
| 4238 encoding = sp->encoding; | |
| 4239 method_encoding = encoding; | |
| 4240 method_response_encoding = NULL; | |
| 4241 if (sp->protocol) | |
| 4242 { if (strstr(sp->protocol, "GET")) | |
| 4243 get = 1; | |
| 4244 else if (strstr(sp->protocol, "POST")) | |
| 4245 post = 1; | |
| 4246 else if (strstr(sp->protocol, "PUT")) | |
| 4247 put = 1; | |
| 4248 if (strncmp(sp->protocol, "SOAP", 4)) | |
| 4249 soap = 0; | |
| 4250 else if (strlen(sp->protocol) > 6) | |
| 4251 version = sp->protocol[6] - '0'; | |
| 4252 } | |
| 4253 for (m = sp->list; m; m = m->next) | |
| 4254 { if (is_eq_nons(m->name, method->sym->name)) | |
| 4255 { if (m->mess == ACTION || m->mess == REQUEST_ACTION) | |
| 4256 action = m->part; | |
| 4257 else if (m->mess == ENCODING) | |
| 4258 method_encoding = m->part; | |
| 4259 else if (m->mess == RESPONSE_ENCODING) | |
| 4260 method_response_encoding = m->part; | |
| 4261 else if (m->mess == PROTOCOL) | |
| 4262 { if (strstr(m->part, "GET")) | |
| 4263 get = 1; | |
| 4264 else if (strstr(m->part, "POST")) | |
| 4265 post = 1; | |
| 4266 else if (strstr(m->part, "PUT")) | |
| 4267 put = 1; | |
| 4268 if (strncmp(m->part, "SOAP", 4)) | |
| 4269 soap = 0; | |
| 4270 else if (strlen(m->part) > 6) | |
| 4271 version = m->part[6] - '0'; | |
| 4272 } | |
| 4273 else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) | |
| 4274 mime = 1; | |
| 4275 } | |
| 4276 } | |
| 4277 break; | |
| 4278 } | |
| 4279 } | |
| 4280 if (!get && !mime) | |
| 4281 fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); | |
| 4282 if (response) | |
| 4283 fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4284 if (name) | |
| 4285 fprintf(fd, "\n\tif (endpoint)\n\t\tsoap_endpoint = endpoint;"); | |
| 4286 if (sp && sp->URL) | |
| 4287 fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); | |
| 4288 if (action) | |
| 4289 { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); | |
| 4290 if (*action == '"') | |
| 4291 fprintf(fd, "%s;", action); | |
| 4292 else | |
| 4293 fprintf(fd, "\"%s\";", action); | |
| 4294 } | |
| 4295 if (!method_response_encoding) | |
| 4296 method_response_encoding = method_encoding; | |
| 4297 if (!get && !mime) | |
| 4298 { fprintf(fd, "\n\tsoap_begin(soap);"); | |
| 4299 if (soap && sp && sp->URI && method_encoding) | |
| 4300 { if (is_literal(method_encoding)) | |
| 4301 fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); | |
| 4302 else if (method_encoding) | |
| 4303 fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_encoding); | |
| 4304 } | |
| 4305 else if (!soap || !eflag) | |
| 4306 fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); | |
| 4307 for (param = params->list; param; param = param->next) | |
| 4308 { if (param->info.typ->type == Tarray) | |
| 4309 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)); | |
| 4310 else | |
| 4311 fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); | |
| 4312 } | |
| 4313 if (!soap) | |
| 4314 fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); | |
| 4315 else if (version) | |
| 4316 fprintf(fd, "\n\tsoap_set_version(soap, %d); /* SOAP1.%d */", version, version); | |
| 4317 if (soap) | |
| 4318 fprintf(fd, "\n\tsoap_serializeheader(soap);"); | |
| 4319 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); | |
| 4320 fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); | |
| 4321 fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); | |
| 4322 fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); | |
| 4323 if (soap) | |
| 4324 { fprintf(fd, "\n\t\t || soap_putheader(soap)"); | |
| 4325 fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); | |
| 4326 } | |
| 4327 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)); | |
| 4328 if (soap) | |
| 4329 fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); | |
| 4330 fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); | |
| 4331 fprintf(fd, "\n\t\t\t return soap->error;"); | |
| 4332 fprintf(fd, "\n\t}"); | |
| 4333 fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); | |
| 4334 if (soap) | |
| 4335 fprintf(fd, "\n\tif (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)"); | |
| 4336 else | |
| 4337 { fprintf(fd, "\n\tsoap->http_content = \"text/xml\";"); | |
| 4338 if (put) | |
| 4339 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action)"); | |
| 4340 else | |
| 4341 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action)"); | |
| 4342 } | |
| 4343 fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); | |
| 4344 if (soap) | |
| 4345 { fprintf(fd, "\n\t || soap_putheader(soap)"); | |
| 4346 fprintf(fd, "\n\t || soap_body_begin_out(soap)"); | |
| 4347 } | |
| 4348 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)); | |
| 4349 if (soap) | |
| 4350 fprintf(fd, "\n\t || soap_body_end_out(soap)"); | |
| 4351 fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); | |
| 4352 fprintf(fd, "\n\t || soap_end_send(soap))"); | |
| 4353 fprintf(fd, "\n\t\treturn soap_closesock(soap);"); | |
| 4354 } | |
| 4355 else if (get) | |
| 4356 { if (params->list) | |
| 4357 { gen_query_url(fd, params); | |
| 4358 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap->msgbuf, soap_action))"); | |
| 4359 } | |
| 4360 else if (soap) | |
| 4361 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, NULL), soap_action))"); | |
| 4362 else | |
| 4363 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, soap_action), soap_action))"); | |
| 4364 fprintf(fd, "\n\t\treturn soap_closesock(soap);"); | |
| 4365 } | |
| 4366 else if (mime) | |
| 4367 { fprintf(fd, "\n\tsoap->http_content = \"application/x-www-form-urlencoded\";"); | |
| 4368 if (post) | |
| 4369 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action))"); | |
| 4370 else if (put) | |
| 4371 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action))"); | |
| 4372 fprintf(fd, "\n\t\treturn soap_closesock(soap);"); | |
| 4373 gen_query_form(fd, params); | |
| 4374 fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); | |
| 4375 } | |
| 4376 if (is_transient(result->info.typ)) | |
| 4377 { fprintf(fd, "\n\treturn SOAP_OK;\n}"); | |
| 4378 if (name) | |
| 4379 { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); | |
| 4380 fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); | |
| 4381 if (iflag) | |
| 4382 fprintf(fd, "\n{\tstruct soap *soap = this;\n"); | |
| 4383 else | |
| 4384 fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); | |
| 4385 fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); | |
| 4386 } | |
| 4387 else | |
| 4388 { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); | |
| 4389 fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); | |
| 4390 fprintf(fheader, "struct %s *%s);\n", ident(method->sym->name), ident(result->sym->name)); | |
| 4391 fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); | |
| 4392 } | |
| 4393 fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); | |
| 4394 fprintf(fd, "\n\tsoap_begin(soap);"); | |
| 4395 } | |
| 4396 else if (result->info.typ->type == Tarray) | |
| 4397 fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); | |
| 4398 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)) | |
| 4399 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)); | |
| 4400 else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) | |
| 4401 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)); | |
| 4402 else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) | |
| 4403 fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); | |
| 4404 else if (((Tnode*)result->info.typ->ref)->type == Tpointer) | |
| 4405 fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); | |
| 4406 else if (result->info.typ->type == Treference) | |
| 4407 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)); | |
| 4408 else if (!is_void(result->info.typ)) | |
| 4409 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)); | |
| 4410 fprintf(fd,"\n\tif (soap_begin_recv(soap)"); | |
| 4411 fprintf(fd,"\n\t || soap_envelope_begin_in(soap)"); | |
| 4412 fprintf(fd,"\n\t || soap_recv_header(soap)"); | |
| 4413 fprintf(fd,"\n\t || soap_body_begin_in(soap))"); | |
| 4414 fprintf(fd,"\n\t\treturn soap_closesock(soap);"); | |
| 4415 if (is_transient(result->info.typ)) | |
| 4416 { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); | |
| 4417 fprintf(fd,"\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); | |
| 4418 fprintf(fd,"\n\tif (soap->error"); | |
| 4419 fprintf(fd,"\n\t || soap_body_end_in(soap)"); | |
| 4420 fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); | |
| 4421 fprintf(fd,"\n\t || soap_end_recv(soap))"); | |
| 4422 fprintf(fd,"\n\t\treturn soap_closesock(soap);"); | |
| 4423 fprintf(fd,"\n\treturn soap_closesock(soap);\n}"); | |
| 4424 fflush(fd); | |
| 4425 return; | |
| 4426 } | |
| 4427 /* With RPC encoded responses, try to parse the fault first */ | |
| 4428 if (!is_literal(method_response_encoding)) | |
| 4429 { fprintf(fd,"\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); | |
| 4430 xtag = xtyp = ""; | |
| 4431 } | |
| 4432 else if (has_ns_eq(NULL, result->sym->name)) | |
| 4433 { if (response) | |
| 4434 xtag = xml_tag(response->info.typ); | |
| 4435 else | |
| 4436 xtag = ns_convert(result->sym->name); | |
| 4437 xtyp = xsi_type(result->info.typ); | |
| 4438 } | |
| 4439 else | |
| 4440 { if (response) | |
| 4441 xtag = xml_tag(response->info.typ); | |
| 4442 else | |
| 4443 xtag = xml_tag(result->info.typ); | |
| 4444 xtyp = ""; | |
| 4445 } | |
| 4446 if (response) | |
| 4447 { 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); | |
| 4448 fprintf(fd,"\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); | |
| 4449 } | |
| 4450 else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty(result->info.typ->ref)) | |
| 4451 { 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)) | |
| 4452 fprintf(fd,"\n\t%s.soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp); | |
| 4453 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)) | |
| 4454 fprintf(fd,"\n\t%s->soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp); | |
| 4455 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)) | |
| 4456 { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp); | |
| 4457 } | |
| 4458 else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) | |
| 4459 { | |
| 4460 fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp); | |
| 4461 } | |
| 4462 else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) | |
| 4463 { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, %s);", ident(result->sym->name)); | |
| 4464 } | |
| 4465 else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) | |
| 4466 { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, &%s);", ident(result->sym->name)); | |
| 4467 } | |
| 4468 else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) | |
| 4469 { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, %s);", ident(result->sym->name)); | |
| 4470 } | |
| 4471 else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) | |
| 4472 { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, &%s);", ident(result->sym->name)); | |
| 4473 } | |
| 4474 else if (result->info.typ->type == Treference) | |
| 4475 { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp); | |
| 4476 } | |
| 4477 else | |
| 4478 { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp); | |
| 4479 } | |
| 4480 fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); | |
| 4481 } | |
| 4482 fflush(fd); | |
| 4483 fprintf(fd,"\n\tif (soap_body_end_in(soap)"); | |
| 4484 fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); | |
| 4485 fprintf(fd,"\n\t || soap_end_recv(soap))"); | |
| 4486 fprintf(fd,"\n\t\treturn soap_closesock(soap);"); | |
| 4487 if (response) | |
| 4488 { if (result->info.typ->type == Tarray) | |
| 4489 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)); | |
| 4490 else if (result->info.typ->type == Treference) | |
| 4491 fprintf(fd,"\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); | |
| 4492 else if (!is_external((Tnode*)result->info.typ->ref)) | |
| 4493 { fprintf(fd,"\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); | |
| 4494 fprintf(fd,"\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); | |
| 4495 } | |
| 4496 } | |
| 4497 fprintf(fd,"\n\treturn soap_closesock(soap);"); | |
| 4498 fprintf(fd ,"\n}"); | |
| 4499 fflush(fd); | |
| 4500 } | |
| 4501 | |
| 4502 void | |
| 4503 gen_serve_method(FILE *fd, Table *table, Entry *param, char *name) | |
| 4504 { Service *sp = NULL; | |
| 4505 char *style, *encoding; | |
| 4506 Entry *result, *p, *q, *pin, *pout, *response = NULL; | |
| 4507 Table *input; | |
| 4508 char *xtag; | |
| 4509 Method *m; | |
| 4510 char *method_encoding = NULL, *method_response_encoding = NULL; | |
| 4511 result = (Entry*)param->info.typ->ref; | |
| 4512 p = entry(classtable, param->sym); | |
| 4513 if (!p) | |
| 4514 execerror("no table entry"); | |
| 4515 if (!is_response(result->info.typ) && !is_XML(result->info.typ)) | |
| 4516 response = get_response(param->info.typ); | |
| 4517 q = entry(table, param->sym); | |
| 4518 if (!q) | |
| 4519 execerror("no table entry"); | |
| 4520 pout = (Entry*)q->info.typ->ref; | |
| 4521 if (name) | |
| 4522 { if (iflag) | |
| 4523 fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); | |
| 4524 else | |
| 4525 fprintf(fd, "\n\nstatic int serve_%s(%s *service)\n{\tstruct soap *soap = service->soap;\n", ident(param->sym->name), name); | |
| 4526 } | |
| 4527 else | |
| 4528 { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); | |
| 4529 fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); | |
| 4530 } | |
| 4531 fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); | |
| 4532 for (sp = services; sp; sp = sp->next) | |
| 4533 if (has_ns_eq(sp->ns, param->sym->name)) | |
| 4534 { style = sp->style; | |
| 4535 encoding = sp->encoding; | |
| 4536 method_encoding = encoding; | |
| 4537 method_response_encoding = NULL; | |
| 4538 for (m = sp->list; m; m = m->next) | |
| 4539 { if (is_eq_nons(m->name, param->sym->name)) | |
| 4540 { if (m->mess == ENCODING) | |
| 4541 method_encoding = m->part; | |
| 4542 else if (m->mess == RESPONSE_ENCODING) | |
| 4543 method_response_encoding = m->part; | |
| 4544 } | |
| 4545 } | |
| 4546 break; | |
| 4547 } | |
| 4548 if (!method_response_encoding) | |
| 4549 method_response_encoding = method_encoding; | |
| 4550 fflush(fd); | |
| 4551 if (!is_transient(pout->info.typ)) | |
| 4552 { if (pout->info.typ->type == Tarray && response) | |
| 4553 { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4554 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4555 } | |
| 4556 else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) | |
| 4557 { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4558 fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4559 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4560 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)) | |
| 4561 fprintf(fd,"\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); | |
| 4562 else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) | |
| 4563 fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); | |
| 4564 else | |
| 4565 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4566 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)); | |
| 4567 } | |
| 4568 else if (response) | |
| 4569 { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4570 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4571 } | |
| 4572 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)) | |
| 4573 { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4574 fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4575 } | |
| 4576 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)) | |
| 4577 { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4578 fprintf(fd,"\n\t%s.soap_default(soap);", ident(pout->sym->name)); | |
| 4579 } | |
| 4580 else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) | |
| 4581 { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4582 fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4583 } | |
| 4584 else | |
| 4585 { fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4586 if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) | |
| 4587 fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); | |
| 4588 else | |
| 4589 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4590 } | |
| 4591 } | |
| 4592 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); | |
| 4593 fflush(fd); | |
| 4594 q = entry(classtable, param->sym); | |
| 4595 if (!is_invisible_empty(q->info.typ)) | |
| 4596 { 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)); | |
| 4597 fprintf(fd,"\n\t\treturn soap->error;"); | |
| 4598 } | |
| 4599 fprintf(fd,"\n\tif (soap_body_end_in(soap)"); | |
| 4600 fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); | |
| 4601 fprintf(fd,"\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); | |
| 4602 if (name) | |
| 4603 { if (iflag) | |
| 4604 fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); | |
| 4605 else | |
| 4606 fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); | |
| 4607 } | |
| 4608 else | |
| 4609 fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); | |
| 4610 fflush(fd); | |
| 4611 input = (Table*) q->info.typ->ref; | |
| 4612 for (pin = input->list; pin; pin = pin->next) | |
| 4613 fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); | |
| 4614 if (is_transient(pout->info.typ)) | |
| 4615 fprintf(fd, ");"); | |
| 4616 else | |
| 4617 { if (!name || input->list) | |
| 4618 fprintf(fd, ", "); | |
| 4619 if (response) | |
| 4620 fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); | |
| 4621 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)) | |
| 4622 fprintf(fd, "%s);", ident(pout->sym->name)); | |
| 4623 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)) | |
| 4624 fprintf(fd, "&%s);", ident(pout->sym->name)); | |
| 4625 else if(pout->info.typ->type == Treference) | |
| 4626 fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); | |
| 4627 else | |
| 4628 fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); | |
| 4629 } | |
| 4630 fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap->error;"); | |
| 4631 if (!is_transient(pout->info.typ)) | |
| 4632 { if (sp && sp->URI && method_response_encoding) | |
| 4633 { if (is_literal(method_response_encoding)) | |
| 4634 fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); | |
| 4635 else if (sp->encoding) | |
| 4636 fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", sp->encoding); | |
| 4637 else if (method_response_encoding) | |
| 4638 fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_response_encoding); | |
| 4639 else if (!eflag) | |
| 4640 fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); | |
| 4641 } | |
| 4642 else if (!eflag) | |
| 4643 fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); | |
| 4644 fprintf(fd,"\n\tsoap_serializeheader(soap);"); | |
| 4645 if (pout->info.typ->type == Tarray && response) | |
| 4646 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4647 else if (response) | |
| 4648 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 4649 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)) | |
| 4650 fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4651 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)) | |
| 4652 fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); | |
| 4653 else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) | |
| 4654 fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); | |
| 4655 else if (!is_XML((Tnode*)pout->info.typ->ref)) | |
| 4656 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4657 if (has_ns_eq(NULL, pout->sym->name)) | |
| 4658 xtag = ns_convert(pout->sym->name); | |
| 4659 else | |
| 4660 xtag = xml_tag(pout->info.typ); | |
| 4661 fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); | |
| 4662 fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); | |
| 4663 fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); | |
| 4664 fprintf(fd,"\n\t\t || soap_putheader(soap)"); | |
| 4665 fprintf(fd,"\n\t\t || soap_body_begin_out(soap)"); | |
| 4666 if (response) | |
| 4667 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)); | |
| 4668 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)) | |
| 4669 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)); | |
| 4670 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)) | |
| 4671 fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); | |
| 4672 else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) | |
| 4673 fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); | |
| 4674 else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) | |
| 4675 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)); | |
| 4676 else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) | |
| 4677 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)); | |
| 4678 else | |
| 4679 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)); | |
| 4680 fprintf(fd,"\n\t\t || soap_body_end_out(soap)"); | |
| 4681 fprintf(fd,"\n\t\t || soap_envelope_end_out(soap))"); | |
| 4682 fprintf(fd,"\n\t\t\t return soap->error;"); | |
| 4683 fprintf(fd,"\n\t};"); | |
| 4684 fprintf(fd,"\n\tif (soap_end_count(soap)"); | |
| 4685 fprintf(fd,"\n\t || soap_response(soap, SOAP_OK)"); | |
| 4686 fprintf(fd,"\n\t || soap_envelope_begin_out(soap)"); | |
| 4687 fprintf(fd,"\n\t || soap_putheader(soap)"); | |
| 4688 fprintf(fd,"\n\t || soap_body_begin_out(soap)"); | |
| 4689 if (response) | |
| 4690 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)); | |
| 4691 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)) | |
| 4692 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)); | |
| 4693 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)) | |
| 4694 fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); | |
| 4695 else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) | |
| 4696 fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); | |
| 4697 else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) | |
| 4698 fprintf(fd,"\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4699 else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) | |
| 4700 fprintf(fd,"\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); | |
| 4701 else | |
| 4702 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)); | |
| 4703 fprintf(fd,"\n\t || soap_body_end_out(soap)"); | |
| 4704 fprintf(fd,"\n\t || soap_envelope_end_out(soap)"); | |
| 4705 fprintf(fd,"\n\t || soap_end_send(soap))"); | |
| 4706 fprintf(fd, "\n\t\treturn soap->error;"); | |
| 4707 } | |
| 4708 fprintf(fd,"\n\treturn soap_closesock(soap);"); | |
| 4709 fprintf(fd,"\n}"); | |
| 4710 fflush(fd); | |
| 4711 } | |
| 4712 | |
| 4713 void | |
| 4714 gen_object_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 4715 { Entry *p, *method, *catch_method, *param; | |
| 4716 Table *t; | |
| 4717 char *soap, *catch_action; | |
| 4718 if (iflag) | |
| 4719 soap = "this"; | |
| 4720 else | |
| 4721 soap = "this->soap"; | |
| 4722 fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); | |
| 4723 if (namespaceid) | |
| 4724 fprintf(fd,"\n\nnamespace %s {", namespaceid); | |
| 4725 if (iflag) | |
| 4726 { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); | |
| 4727 fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); | |
| 4728 fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); | |
| 4729 fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name); | |
| 4730 fprintf(fd, "\n\n%s::~%s()\n{ }", name, name); | |
| 4731 } | |
| 4732 else | |
| 4733 { 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); | |
| 4734 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); | |
| 4735 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); | |
| 4736 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); | |
| 4737 fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name); | |
| 4738 } | |
| 4739 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); | |
| 4740 gen_nsmap(fd, ns, URI); | |
| 4741 fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); | |
| 4742 fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); | |
| 4743 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); | |
| 4744 if (iflag) | |
| 4745 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); | |
| 4746 else | |
| 4747 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); | |
| 4748 fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); | |
| 4749 fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); | |
| 4750 fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); | |
| 4751 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); | |
| 4752 fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); | |
| 4753 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); | |
| 4754 fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); | |
| 4755 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); | |
| 4756 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); | |
| 4757 fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); | |
| 4758 if (!namespaceid) | |
| 4759 { | |
| 4760 p = entry(classtable, lookup("SOAP_ENV__Header")); | |
| 4761 if (p) | |
| 4762 { t = (Table*)p->info.typ->ref; | |
| 4763 if (t && t->list && !is_void(t->list->info.typ)) | |
| 4764 { fprintf(fd, "\n\nvoid %s::soap_header(", name); | |
| 4765 gen_params(fd, t, NULL, 0); | |
| 4766 fprintf(fd, "\n{\t::soap_header(%s);", soap); | |
| 4767 for (param = t->list; param; param = param->next) | |
| 4768 { if (namespaceid) | |
| 4769 fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); | |
| 4770 else | |
| 4771 fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); | |
| 4772 } | |
| 4773 fprintf(fd, "\n}"); | |
| 4774 } | |
| 4775 } | |
| 4776 } | |
| 4777 fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); | |
| 4778 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); | |
| 4779 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); | |
| 4780 fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); | |
| 4781 fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); | |
| 4782 fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); | |
| 4783 fprintf(fd, "\n#endif"); | |
| 4784 fprintf(fd, "\n\nint %s::serve()", name); | |
| 4785 fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = %s->max_keep_alive;\n#endif\n\tdo\n\t{", soap); | |
| 4786 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); | |
| 4787 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); | |
| 4788 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); | |
| 4789 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); | |
| 4790 fprintf(fd, "\n\treturn SOAP_OK;"); | |
| 4791 fprintf(fd, "\n}\n"); | |
| 4792 for (method = table->list; method; method = method->next) | |
| 4793 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) | |
| 4794 fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); | |
| 4795 fprintf(fd, "\n\nint %s::dispatch()\n{", name); | |
| 4796 if (!iflag) | |
| 4797 fprintf(fd, "\t%s_init(this->soap->imode, this->soap->omode);\n", name); | |
| 4798 fprintf(fd, "\tsoap_peek_element(%s);", soap); | |
| 4799 catch_method = NULL; | |
| 4800 catch_action = NULL; | |
| 4801 for (method = table->list; method; method = method->next) | |
| 4802 { char *action = NULL; | |
| 4803 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) | |
| 4804 { if (aflag) | |
| 4805 { Service *sp; | |
| 4806 for (sp = services; sp; sp = sp->next) | |
| 4807 { if (has_ns_eq(sp->ns, method->sym->name)) | |
| 4808 { Method *m; | |
| 4809 for (m = sp->list; m; m = m->next) | |
| 4810 { if (is_eq_nons(m->name, method->sym->name)) | |
| 4811 { if (m->mess == ACTION || m->mess == REQUEST_ACTION) | |
| 4812 action = m->part; | |
| 4813 } | |
| 4814 } | |
| 4815 } | |
| 4816 } | |
| 4817 } | |
| 4818 if (is_invisible(method->sym->name)) | |
| 4819 { Entry *param = entry(classtable, method->sym); | |
| 4820 if (param) | |
| 4821 param = ((Table*)param->info.typ->ref)->list; | |
| 4822 if (action) | |
| 4823 { if (*action == '"') | |
| 4824 { fprintf(fd, "\n\tif ("); | |
| 4825 if (param && !Aflag) | |
| 4826 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); | |
| 4827 else | |
| 4828 { catch_method = method; | |
| 4829 catch_action = action; | |
| 4830 } | |
| 4831 fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); | |
| 4832 } | |
| 4833 else | |
| 4834 { fprintf(fd, "\n\tif ("); | |
| 4835 if (param && !Aflag) | |
| 4836 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); | |
| 4837 else | |
| 4838 { catch_method = method; | |
| 4839 catch_action = action; | |
| 4840 } | |
| 4841 fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); | |
| 4842 } | |
| 4843 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); | |
| 4844 } | |
| 4845 else | |
| 4846 { if (Aflag) | |
| 4847 compliancewarn("Option -A requires a SOAPAction where none is defined"); | |
| 4848 if (param) | |
| 4849 { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); | |
| 4850 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); | |
| 4851 } | |
| 4852 else | |
| 4853 { catch_method = method; | |
| 4854 catch_action = action; | |
| 4855 } | |
| 4856 } | |
| 4857 } | |
| 4858 else | |
| 4859 { if (action) | |
| 4860 { if (*action == '"') | |
| 4861 { fprintf(fd, "\n\tif ("); | |
| 4862 if (!Aflag) | |
| 4863 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); | |
| 4864 fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); | |
| 4865 } | |
| 4866 else | |
| 4867 { fprintf(fd, "\n\tif ("); | |
| 4868 if (!Aflag) | |
| 4869 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); | |
| 4870 fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); | |
| 4871 } | |
| 4872 } | |
| 4873 else | |
| 4874 { if (Aflag) | |
| 4875 compliancewarn("Option -A requires a SOAPAction where none is defined"); | |
| 4876 fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); | |
| 4877 } | |
| 4878 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); | |
| 4879 } | |
| 4880 } | |
| 4881 } | |
| 4882 if (catch_method) | |
| 4883 { if (Aflag && catch_action) | |
| 4884 { if (*catch_action == '"') | |
| 4885 { fprintf(fd, "\n\tif ("); | |
| 4886 fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, catch_action); | |
| 4887 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); | |
| 4888 } | |
| 4889 else | |
| 4890 { fprintf(fd, "\n\tif ("); | |
| 4891 fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, catch_action); | |
| 4892 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); | |
| 4893 } | |
| 4894 fprintf(fd,"\n\treturn %s->error = SOAP_NO_METHOD;", soap); | |
| 4895 } | |
| 4896 fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); | |
| 4897 } | |
| 4898 else | |
| 4899 fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); | |
| 4900 for (method = table->list; method; method = method->next) | |
| 4901 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) | |
| 4902 gen_serve_method(fd, table, method, name); | |
| 4903 if (namespaceid) | |
| 4904 fprintf(fd,"\n\n} // namespace %s\n", namespaceid); | |
| 4905 fprintf(fd,"\n/* End of server object code */\n"); | |
| 4906 } | |
| 4907 | |
| 4908 void | |
| 4909 gen_response_begin(FILE *fd, int n, char *s) | |
| 4910 { if (!is_invisible(s)) | |
| 4911 { fprintf(fd, "%*s<%sResponse", n, "", s); | |
| 4912 if (vflag < 0) | |
| 4913 gen_xmlns(fd); | |
| 4914 fprintf(fd, ">\n"); | |
| 4915 } | |
| 4916 } | |
| 4917 | |
| 4918 void | |
| 4919 gen_response_end(FILE *fd, int n, char *s) | |
| 4920 { if (!is_invisible(s)) | |
| 4921 fprintf(fd, "%*s</%sResponse>\n", n, "", s); | |
| 4922 } | |
| 4923 | |
| 4924 void | |
| 4925 gen_element_begin(FILE *fd, int n, char *s, char *t) | |
| 4926 { if (!is_invisible(s)) | |
| 4927 { if (tflag && t && *t) | |
| 4928 fprintf(fd, "%*s<%s xsi:type=\"%s\"", n, "", s, t); | |
| 4929 else | |
| 4930 fprintf(fd, "%*s<%s", n, "", s); | |
| 4931 } | |
| 4932 } | |
| 4933 | |
| 4934 void | |
| 4935 gen_element_end(FILE *fd, int n, char *s) | |
| 4936 { if (!is_invisible(s)) | |
| 4937 fprintf(fd, "%*s</%s>\n", n, "", s); | |
| 4938 else | |
| 4939 fprintf(fd, "\n"); | |
| 4940 } | |
| 4941 | |
| 4942 void | |
| 4943 gen_data(char *buf, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding) | |
| 4944 { Entry *p, *q, *r; | |
| 4945 FILE *fd; | |
| 4946 char *method_encoding = NULL; | |
| 4947 char *method_response_encoding = NULL; | |
| 4948 if (t) | |
| 4949 { for (p = t->list; p; p = p->next) | |
| 4950 if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) | |
| 4951 { int get = 0, soap = 1, mime = 0; | |
| 4952 Service *sp; | |
| 4953 Method *m; | |
| 4954 char *nse = ns_qualifiedElement(p->info.typ); | |
| 4955 char *nsa = ns_qualifiedAttribute(p->info.typ); | |
| 4956 method_encoding = encoding; | |
| 4957 method_response_encoding = NULL; | |
| 4958 for (sp = services; sp; sp = sp->next) | |
| 4959 { if (!tagcmp(sp->ns, ns)) | |
| 4960 { for (m = sp->list; m; m = m->next) | |
| 4961 { if (is_eq_nons(m->name, p->sym->name)) | |
| 4962 { if (m->mess == ENCODING) | |
| 4963 method_encoding = m->part; | |
| 4964 else if (m->mess == RESPONSE_ENCODING) | |
| 4965 method_response_encoding = m->part; | |
| 4966 else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) | |
| 4967 mime = 1; | |
| 4968 else if (m->mess == PROTOCOL) | |
| 4969 { if (strncmp(m->part, "SOAP", 4)) | |
| 4970 soap = 0; | |
| 4971 if (strstr(m->part, "GET")) | |
| 4972 get = 1; | |
| 4973 } | |
| 4974 } | |
| 4975 } | |
| 4976 } | |
| 4977 } | |
| 4978 if (!method_response_encoding) | |
| 4979 method_response_encoding = method_encoding; | |
| 4980 /* request */ | |
| 4981 if (!get && !mime) | |
| 4982 { fd = gen_env(buf, ns_remove(p->sym->name), 0, t, ns, name, URL, executable, URI, method_encoding, soap); | |
| 4983 if (!fd) | |
| 4984 return; | |
| 4985 q = entry(classtable, p->sym); | |
| 4986 if (yflag) | |
| 4987 { fprintf(fd, "%*s<!-- %s(...", 2, "", ident(p->sym->name)); | |
| 4988 if (q) | |
| 4989 { Table *r = (Table*)q->info.typ->ref; | |
| 4990 while (r) | |
| 4991 { Entry *e; | |
| 4992 for (e = r->list; e; e = e->next) | |
| 4993 fprintf(fd, ", %s", c_type_id(e->info.typ, e->sym->name)); | |
| 4994 r = r->prev; | |
| 4995 } | |
| 4996 } | |
| 4997 fprintf(fd, ", ...) -->\n"); | |
| 4998 } | |
| 4999 gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); | |
| 5000 if (q) | |
| 5001 { if (!is_invisible(p->sym->name)) | |
| 5002 { if (soap && vflag < 0) | |
| 5003 gen_xmlns(fd); | |
| 5004 gen_atts(fd, 2, (Table*)q->info.typ->ref, nsa); | |
| 5005 fprintf(fd, "\n"); | |
| 5006 } | |
| 5007 for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) | |
| 5008 gen_field(fd, 3, q, nse, nsa, method_encoding); | |
| 5009 } | |
| 5010 gen_element_end(fd, 2, ns_convert(p->sym->name)); | |
| 5011 if (soap && vflag >= 0) | |
| 5012 fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"); | |
| 5013 fclose(fd); | |
| 5014 } | |
| 5015 /* response */ | |
| 5016 q = (Entry*)p->info.typ->ref; | |
| 5017 if (!mime && q && !is_transient(q->info.typ)) | |
| 5018 { fd = gen_env(buf, ns_remove(p->sym->name), 1, t, ns, name, URL, executable, URI, method_response_encoding, soap); | |
| 5019 if (!fd) | |
| 5020 return; | |
| 5021 if (q && !is_response(q->info.typ)) | |
| 5022 { if (is_XML((Tnode*)q->info.typ->ref)) | |
| 5023 { gen_response_begin(fd, 2, ns_convert(p->sym->name)); | |
| 5024 gen_response_end(fd, 2, ns_convert(p->sym->name)); | |
| 5025 } | |
| 5026 else | |
| 5027 { gen_response_begin(fd, 2, ns_convert(p->sym->name)); | |
| 5028 gen_field(fd, 3, q, nse, nsa, method_response_encoding); | |
| 5029 gen_response_end(fd, 2, ns_convert(p->sym->name)); | |
| 5030 } | |
| 5031 } | |
| 5032 else if (q && q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) | |
| 5033 { char *xtag; | |
| 5034 nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); | |
| 5035 nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); | |
| 5036 if (has_ns_eq(NULL, q->sym->name)) | |
| 5037 xtag = q->sym->name; | |
| 5038 else | |
| 5039 xtag = ((Tnode*)q->info.typ->ref)->id->name; | |
| 5040 if (yflag) | |
| 5041 fprintf(fd, "%*s<!-- %s(..., %s) -->\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); | |
| 5042 gen_element_begin(fd, 2, ns_addx(xtag, nse), NULL); | |
| 5043 if (!is_invisible(xtag)) | |
| 5044 { if (soap && vflag < 0) | |
| 5045 gen_xmlns(fd); | |
| 5046 gen_atts(fd, 2, ((Tnode*)q->info.typ->ref)->ref, nsa); | |
| 5047 fprintf(fd, "\n"); | |
| 5048 } | |
| 5049 for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) | |
| 5050 gen_field(fd, 3, r, nse, nsa, method_response_encoding); | |
| 5051 gen_element_end(fd, 2, ns_addx(xtag, nse)); | |
| 5052 } | |
| 5053 fflush(fd); | |
| 5054 if (soap && vflag >= 0) | |
| 5055 fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"); | |
| 5056 fclose(fd); | |
| 5057 } | |
| 5058 } | |
| 5059 } | |
| 5060 } | |
| 5061 | |
| 5062 void | |
| 5063 gen_field(FILE *fd, int n, Entry *p, char *nse, char *nsa, char *encoding) | |
| 5064 { Entry *q; | |
| 5065 char tmp[32]; | |
| 5066 LONG64 i; | |
| 5067 int d; | |
| 5068 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)) | |
| 5069 { if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) | |
| 5070 fprintf(fd, "%*s<SOAP-RPC:result xmlns:SOAP-RPC=\"%s\">%s</SOAP-RPC:result>\n", n, "", rpcURI, ns_add(p, nse)); | |
| 5071 if (is_XML(p->info.typ)) | |
| 5072 { if (yflag) | |
| 5073 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5074 gen_element_begin(fd, n, ns_add(p, nse), NULL); | |
| 5075 if (!is_invisible(p->sym->name)) | |
| 5076 fprintf(fd, ">"); | |
| 5077 else | |
| 5078 fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); | |
| 5079 gen_element_end(fd, n, ns_add(p, nse)); | |
| 5080 } | |
| 5081 else | |
| 5082 { if (!is_string(p->info.typ) && n >= 10 && p->info.minOccurs <= 0) | |
| 5083 { /* Do not generate nil, since some tools don't accept it: | |
| 5084 if (!is_invisible(p->sym->name)) | |
| 5085 { gen_element_begin(fd, n, ns_add(p->sym->name, nse), NULL); | |
| 5086 fprintf(fd, " xsi:nil=\"true\"/>"); | |
| 5087 } | |
| 5088 */ | |
| 5089 return; | |
| 5090 } | |
| 5091 else if (n >= 20) | |
| 5092 { 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, ""); | |
| 5093 return; | |
| 5094 } | |
| 5095 else if (is_fixedstring(p->info.typ)) | |
| 5096 { if (yflag) | |
| 5097 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5098 gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); | |
| 5099 fprintf(fd, ">"); | |
| 5100 fflush(fd); | |
| 5101 if (p->info.hasval) | |
| 5102 fprintf(fd, "%s", xstring(p->info.val.s)); | |
| 5103 else | |
| 5104 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5105 } | |
| 5106 else if (p->info.typ->type == Tarray) | |
| 5107 { i = ((Tnode*) p->info.typ->ref)->width; | |
| 5108 if (i) | |
| 5109 { i = p->info.typ->width / i; | |
| 5110 if (i > 4) | |
| 5111 i = 2; | |
| 5112 } | |
| 5113 if (yflag) | |
| 5114 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5115 gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); | |
| 5116 fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\">", xsi_type_Tarray(p->info.typ), i); | |
| 5117 fflush(fd); | |
| 5118 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5119 } | |
| 5120 else if (is_dynamic_array(p->info.typ) && !is_binary(p->info.typ)) | |
| 5121 { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) | |
| 5122 { if (yflag) | |
| 5123 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5124 gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); | |
| 5125 gen_atts(fd, n, (Table*)p->info.typ->ref, nsa); | |
| 5126 } | |
| 5127 else | |
| 5128 { d = get_Darraydims(p->info.typ); | |
| 5129 if (d) | |
| 5130 { for (i = 0; i < d-1; i++) | |
| 5131 { tmp[2*i] = ','; | |
| 5132 tmp[2*i+1] = '1'; | |
| 5133 } | |
| 5134 tmp[2*d-2] = '\0'; | |
| 5135 } | |
| 5136 else | |
| 5137 *tmp = '\0'; | |
| 5138 if (yflag) | |
| 5139 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5140 gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); | |
| 5141 if (((Table*)p->info.typ->ref)->list->info.minOccurs > 0) | |
| 5142 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); | |
| 5143 else | |
| 5144 fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)p->info.typ->ref)->list->info.typ, ""), tmp); | |
| 5145 } | |
| 5146 fflush(fd); | |
| 5147 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5148 } | |
| 5149 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)) | |
| 5150 { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) | |
| 5151 { if (yflag) | |
| 5152 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5153 gen_element_begin(fd, n, ns_add(p, nse), xsi_type((Tnode*)p->info.typ->ref)); | |
| 5154 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); | |
| 5155 } | |
| 5156 else | |
| 5157 { d = get_Darraydims((Tnode*)p->info.typ->ref); | |
| 5158 if (d) | |
| 5159 { for (i = 0; i < d-1; i++) | |
| 5160 { tmp[2*i] = ','; | |
| 5161 tmp[2*i+1] = '1'; | |
| 5162 } | |
| 5163 tmp[2*d-2] = '\0'; | |
| 5164 } | |
| 5165 else | |
| 5166 *tmp = '\0'; | |
| 5167 if (yflag) | |
| 5168 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5169 gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); | |
| 5170 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) | |
| 5171 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); | |
| 5172 else | |
| 5173 fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); | |
| 5174 } | |
| 5175 fflush(fd); | |
| 5176 gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); | |
| 5177 } | |
| 5178 else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) | |
| 5179 { /* | |
| 5180 if (!is_primclass(p->info.typ)) | |
| 5181 { char *nse1 = ns_qualifiedElement(p->info.typ); | |
| 5182 char *nsa1 = ns_qualifiedAttribute(p->info.typ); | |
| 5183 if (nse1) | |
| 5184 nse = nse1; | |
| 5185 if (nsa1) | |
| 5186 nsa = nsa1; | |
| 5187 } | |
| 5188 */ | |
| 5189 if (!is_invisible(p->sym->name)) | |
| 5190 { if (yflag) | |
| 5191 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5192 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); | |
| 5193 gen_atts(fd, n, (Table*)p->info.typ->ref, nsa); | |
| 5194 } | |
| 5195 else if (is_anyType(p->info.typ)) | |
| 5196 fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); | |
| 5197 } | |
| 5198 else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference) | |
| 5199 && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) | |
| 5200 { /* | |
| 5201 if (!is_primclass(p->info.typ->ref)) | |
| 5202 { char *nse1 = ns_qualifiedElement(p->info.typ->ref); | |
| 5203 char *nsa1 = ns_qualifiedAttribute(p->info.typ->ref); | |
| 5204 if (nse1) | |
| 5205 nse = nse1; | |
| 5206 if (nsa1) | |
| 5207 nsa = nsa1; | |
| 5208 } | |
| 5209 */ | |
| 5210 if (!is_invisible(p->sym->name)) | |
| 5211 { if (yflag) | |
| 5212 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5213 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); | |
| 5214 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); | |
| 5215 } | |
| 5216 else if (is_anyType(p->info.typ)) | |
| 5217 fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); | |
| 5218 } | |
| 5219 else if (p->info.typ->type != Tunion) | |
| 5220 { if (!is_invisible(p->sym->name)) | |
| 5221 { if (yflag) | |
| 5222 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5223 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); | |
| 5224 if (p->info.typ->type == Ttemplate) | |
| 5225 { if (((Tnode*)p->info.typ->ref)->type == Tpointer | |
| 5226 && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass | |
| 5227 || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) | |
| 5228 gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); | |
| 5229 else if (((Tnode*)p->info.typ->ref)->type == Tclass | |
| 5230 || ((Tnode*)p->info.typ->ref)->type == Tstruct) | |
| 5231 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); | |
| 5232 else | |
| 5233 fprintf(fd, ">"); | |
| 5234 } | |
| 5235 else | |
| 5236 fprintf(fd, ">"); | |
| 5237 } | |
| 5238 } | |
| 5239 switch (p->info.typ->type) | |
| 5240 { case Tchar: | |
| 5241 case Tshort: | |
| 5242 case Tint: | |
| 5243 case Tlong: | |
| 5244 case Tllong: | |
| 5245 case Tuchar: | |
| 5246 case Tushort: | |
| 5247 case Tuint: | |
| 5248 case Tulong: | |
| 5249 case Tullong: | |
| 5250 if (p->info.hasval) | |
| 5251 fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); | |
| 5252 else | |
| 5253 fprintf(fd, "0"); | |
| 5254 break; | |
| 5255 case Tfloat: | |
| 5256 case Tdouble: | |
| 5257 case Tldouble: | |
| 5258 if (p->info.hasval) | |
| 5259 fprintf(fd, "%g", p->info.val.r); | |
| 5260 else | |
| 5261 fprintf(fd, "0.0"); | |
| 5262 break; | |
| 5263 case Ttime: | |
| 5264 { char tmp[256]; | |
| 5265 time_t t = time(NULL), *p = &t; | |
| 5266 strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); | |
| 5267 fprintf(fd, "%s", tmp); | |
| 5268 } | |
| 5269 break; | |
| 5270 case Tenum: | |
| 5271 if (p->info.hasval && p->info.typ->ref) | |
| 5272 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) | |
| 5273 if (p->info.val.i == q->info.val.i) | |
| 5274 { fprintf(fd, "%s", ns_remove2(q->sym->name)); | |
| 5275 break; | |
| 5276 } | |
| 5277 } | |
| 5278 else | |
| 5279 gen_val(fd, n+1, p->info.typ, nse, nsa, encoding); | |
| 5280 break; | |
| 5281 case Tpointer: | |
| 5282 case Treference: | |
| 5283 if (is_string(p->info.typ) || is_wstring(p->info.typ)) | |
| 5284 { if (p->info.hasval) | |
| 5285 fprintf(fd, "%s", xstring(p->info.val.s)); | |
| 5286 else | |
| 5287 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5288 } | |
| 5289 else | |
| 5290 gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); | |
| 5291 break; | |
| 5292 case Tclass: | |
| 5293 if (is_stdstr(p->info.typ)) | |
| 5294 { if (p->info.hasval) | |
| 5295 fprintf(fd, "%s", xstring(p->info.val.s)); | |
| 5296 else | |
| 5297 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5298 break; | |
| 5299 } | |
| 5300 case Tstruct: | |
| 5301 if (!is_dynamic_array(p->info.typ)) | |
| 5302 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5303 break; | |
| 5304 case Tunion: | |
| 5305 gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5306 break; | |
| 5307 case Ttemplate: | |
| 5308 i = p->info.maxOccurs; | |
| 5309 if (i <= 1 || i > 4) | |
| 5310 i = p->info.minOccurs; | |
| 5311 if (i <= 1) | |
| 5312 i = 2; | |
| 5313 do | |
| 5314 { /* a bit of a hack, I don't like the copy of the code above */ | |
| 5315 { gen_val(fd, n, p->info.typ, nse, nsa, encoding); | |
| 5316 if (i > 1) | |
| 5317 { gen_element_end(fd, 0, ns_add(p, nse)); | |
| 5318 if (!is_invisible(p->sym->name)) | |
| 5319 { if (yflag) | |
| 5320 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); | |
| 5321 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); | |
| 5322 if (p->info.typ->type == Ttemplate) | |
| 5323 { if (((Tnode*)p->info.typ->ref)->type == Tpointer | |
| 5324 && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass | |
| 5325 || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) | |
| 5326 gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); | |
| 5327 else if (((Tnode*)p->info.typ->ref)->type == Tclass | |
| 5328 || ((Tnode*)p->info.typ->ref)->type == Tstruct) | |
| 5329 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); | |
| 5330 else | |
| 5331 fprintf(fd, ">"); | |
| 5332 } | |
| 5333 else | |
| 5334 fprintf(fd, ">"); | |
| 5335 } | |
| 5336 } | |
| 5337 fflush(fd); | |
| 5338 } | |
| 5339 } while (--i); | |
| 5340 break; | |
| 5341 default: | |
| 5342 break; | |
| 5343 } | |
| 5344 if (p->info.typ->type != Tunion) | |
| 5345 gen_element_end(fd, 0, ns_add(p, nse)); | |
| 5346 fflush(fd); | |
| 5347 } | |
| 5348 } | |
| 5349 } | |
| 5350 | |
| 5351 void | |
| 5352 gen_atts(FILE *fd, int n, Table *t, char *nsa) | |
| 5353 { static unsigned long idnum = 0; | |
| 5354 Entry *q, *r; | |
| 5355 Tnode *p; | |
| 5356 int i; | |
| 5357 for (; t; t = t->prev) | |
| 5358 { | |
| 5359 for (q = t->list; q; q = q->next) | |
| 5360 { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) | |
| 5361 { fprintf(fd, " %s=\"", ns_add(q, nsa)); | |
| 5362 if ((q->info.typ->type == Tpointer || q->info.typ->type == Treference) && !is_string(q->info.typ)) | |
| 5363 p = (Tnode*)q->info.typ->ref; | |
| 5364 else | |
| 5365 p = q->info.typ; | |
| 5366 if (is_eq(q->sym->name, "id")) | |
| 5367 fprintf(fd, "%lu", ++idnum); /* id="#" should be unique */ | |
| 5368 else | |
| 5369 switch (p->type) | |
| 5370 { case Tchar: | |
| 5371 case Tshort: | |
| 5372 case Tint: | |
| 5373 case Tuchar: | |
| 5374 case Tushort: | |
| 5375 case Tuint: | |
| 5376 case Tlong: | |
| 5377 case Tulong: | |
| 5378 case Tllong: | |
| 5379 case Tullong: | |
| 5380 if (q->info.hasval) | |
| 5381 fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); | |
| 5382 else | |
| 5383 fprintf(fd, "0"); | |
| 5384 break; | |
| 5385 case Tfloat: | |
| 5386 case Tdouble: | |
| 5387 case Tldouble: | |
| 5388 if (q->info.hasval) | |
| 5389 fprintf(fd, "%g", q->info.val.r); | |
| 5390 else | |
| 5391 fprintf(fd, "0.0"); | |
| 5392 break; | |
| 5393 case Ttime: | |
| 5394 { char tmp[256]; | |
| 5395 time_t T = time(NULL); | |
| 5396 strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); | |
| 5397 fprintf(fd, "%s", tmp); | |
| 5398 } | |
| 5399 break; | |
| 5400 case Tenum: | |
| 5401 if (q->info.hasval && p->ref) | |
| 5402 { for (r = ((Table*)p->ref)->list; r; r = r->next) | |
| 5403 { if (r->info.val.i == q->info.val.i) | |
| 5404 { fprintf(fd, "%s", ns_remove2(r->sym->name)); | |
| 5405 break; | |
| 5406 } | |
| 5407 } | |
| 5408 } | |
| 5409 else if (p->ref) | |
| 5410 fprintf(fd, "%s", ns_remove2((((Table*)p->ref)->list)->sym->name)); | |
| 5411 else | |
| 5412 fprintf(fd, "0"); | |
| 5413 break; | |
| 5414 case Tpointer: | |
| 5415 case Treference: | |
| 5416 if (is_string(p)) | |
| 5417 { if (q->info.hasval) | |
| 5418 fprintf(fd, "%s", xstring(q->info.val.s)); | |
| 5419 else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000) | |
| 5420 for (i = 0; i < (int)q->info.typ->minLength; i++) | |
| 5421 fprintf(fd, "X"); | |
| 5422 } | |
| 5423 break; | |
| 5424 case Tclass: | |
| 5425 if (is_stdstr(p)) | |
| 5426 { if (q->info.hasval) | |
| 5427 fprintf(fd, "%s", xstring(q->info.val.s)); | |
| 5428 else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000) | |
| 5429 for (i = 0; i < (int)q->info.typ->minLength; i++) | |
| 5430 fprintf(fd, "X"); | |
| 5431 } | |
| 5432 break; | |
| 5433 default: | |
| 5434 break; | |
| 5435 } | |
| 5436 if (yflag) | |
| 5437 fprintf(fd, " // %s //", c_type_id(q->info.typ, q->sym->name)); | |
| 5438 fprintf(fd, "\""); | |
| 5439 } | |
| 5440 } | |
| 5441 } | |
| 5442 fprintf(fd, ">"); | |
| 5443 fflush(fd); | |
| 5444 } | |
| 5445 | |
| 5446 void | |
| 5447 gen_val(FILE *fd, int n, Tnode *p, char *nse, char *nsa, char *encoding) | |
| 5448 { Entry *q; | |
| 5449 LONG64 i; | |
| 5450 if (!is_transient(p) && p->type != Tfun && !is_XML(p)) | |
| 5451 { if (is_fixedstring(p)) | |
| 5452 { for (i = 0; i < p->width / ((Tnode*)p->ref)->width - 1; i++) | |
| 5453 fprintf(fd, "X"); | |
| 5454 } | |
| 5455 else if (p->type == Tarray) | |
| 5456 { i = ((Tnode*) p->ref)->width; | |
| 5457 if (i) | |
| 5458 { i = p->width / i; | |
| 5459 if (i > 4) | |
| 5460 i = 2; | |
| 5461 fprintf(fd, "\n"); | |
| 5462 for (; i > 0; i--) | |
| 5463 { fprintf(fd, "%*s<item>", n+1, ""); | |
| 5464 gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding); | |
| 5465 fprintf(fd, "</item>\n"); | |
| 5466 } | |
| 5467 fprintf(fd, "%*s", n, ""); | |
| 5468 } | |
| 5469 } | |
| 5470 else if (is_dynamic_array(p)) | |
| 5471 { if (!is_binary(p)) | |
| 5472 { Table *t; | |
| 5473 fprintf(fd, "\n"); | |
| 5474 for (t = (Table*)p->ref; t && !t->list; t = t->prev) | |
| 5475 ; | |
| 5476 if (t) | |
| 5477 gen_field(fd, n+1, t->list, nse, nsa, encoding); | |
| 5478 fprintf(fd, "%*s", n, ""); | |
| 5479 } | |
| 5480 } | |
| 5481 switch (p->type) | |
| 5482 { case Tchar: | |
| 5483 case Tshort: | |
| 5484 case Tint: | |
| 5485 case Tlong: | |
| 5486 case Tllong: | |
| 5487 case Tuchar: | |
| 5488 case Tushort: | |
| 5489 case Tuint: | |
| 5490 case Tulong: | |
| 5491 case Tullong: | |
| 5492 fprintf(fd, "0"); | |
| 5493 break; | |
| 5494 case Tfloat: | |
| 5495 case Tdouble: | |
| 5496 case Tldouble: | |
| 5497 fprintf(fd, "0.0"); | |
| 5498 break; | |
| 5499 case Ttime: | |
| 5500 { char tmp[256]; | |
| 5501 time_t T = time(NULL); | |
| 5502 strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); | |
| 5503 fprintf(fd, "%s", tmp); | |
| 5504 } | |
| 5505 break; | |
| 5506 case Tenum: | |
| 5507 if (p->ref && (q = ((Table*)p->ref)->list)) | |
| 5508 fprintf(fd, "%s", ns_remove2(q->sym->name)); | |
| 5509 else | |
| 5510 fprintf(fd, "0"); | |
| 5511 break; | |
| 5512 case Tpointer: | |
| 5513 case Treference: | |
| 5514 if (is_string(p) || is_wstring(p)) | |
| 5515 { if (p->minLength > 0 && p->minLength < 10000) | |
| 5516 for (i = 0; i < (int)p->minLength; i++) | |
| 5517 fprintf(fd, "X"); | |
| 5518 } | |
| 5519 else | |
| 5520 gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); | |
| 5521 break; | |
| 5522 case Tclass: | |
| 5523 case Tstruct: | |
| 5524 nse = ns_qualifiedElement(p); | |
| 5525 nsa = ns_qualifiedAttribute(p); | |
| 5526 if (is_stdstr(p)) | |
| 5527 { if (p->minLength > 0 && p->minLength < 10000) | |
| 5528 for (i = 0; i < (int)p->minLength; i++) | |
| 5529 fprintf(fd, "X"); | |
| 5530 } | |
| 5531 else if (is_primclass(p)) | |
| 5532 { Table *t; | |
| 5533 for (t = (Table*)p->ref; t; t = t->prev) | |
| 5534 { Entry *r = entry(classtable, t->sym); | |
| 5535 r = t->list; | |
| 5536 if (r && is_item(r)) | |
| 5537 { gen_val(fd, n, r->info.typ, nse, nsa, encoding); | |
| 5538 return; | |
| 5539 } | |
| 5540 } | |
| 5541 } | |
| 5542 else if (!is_dynamic_array(p) && p->ref) | |
| 5543 { Table *t; | |
| 5544 fprintf(fd, "\n"); | |
| 5545 for (t = (Table*)p->ref; t; t = t->prev) | |
| 5546 { for (q = t->list; q; q = q->next) | |
| 5547 { if (is_repetition(q)) | |
| 5548 { i = q->info.maxOccurs; | |
| 5549 if (i <= 1 || i > 4) | |
| 5550 i = q->info.minOccurs; | |
| 5551 if (i <= 1) | |
| 5552 i = 2; | |
| 5553 do | |
| 5554 gen_field(fd, n+1, q->next, nse, nsa, encoding); | |
| 5555 while (--i); | |
| 5556 q = q->next; | |
| 5557 } | |
| 5558 else | |
| 5559 gen_field(fd, n+1, q, nse, nsa, encoding); | |
| 5560 } | |
| 5561 } | |
| 5562 fprintf(fd, "%*s", n, ""); | |
| 5563 } | |
| 5564 break; | |
| 5565 case Tunion: | |
| 5566 if (((Table*)p->ref)->list) | |
| 5567 gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding); | |
| 5568 break; | |
| 5569 case Ttemplate: | |
| 5570 gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); | |
| 5571 break; | |
| 5572 default: | |
| 5573 break; | |
| 5574 } | |
| 5575 } | |
| 5576 } | |
| 5577 | |
| 5578 void | |
| 5579 gen_header(FILE *fd, char *method, int response, char *encoding) | |
| 5580 { if (custom_header) | |
| 5581 { Service *sp; | |
| 5582 Method *m = NULL; | |
| 5583 Entry *q; | |
| 5584 Table *r; | |
| 5585 if (yflag) | |
| 5586 { if (cflag) | |
| 5587 fprintf(fd, " <!-- struct SOAP_ENV__Header -->\n"); | |
| 5588 else | |
| 5589 fprintf(fd, " <!-- SOAP_ENV__Header *soap::header -->\n"); | |
| 5590 } | |
| 5591 fprintf(fd, " <SOAP-ENV:Header>\n"); | |
| 5592 q = entry(classtable, lookup("SOAP_ENV__Header")); | |
| 5593 if (q) | |
| 5594 { r = (Table*)q->info.typ->ref; | |
| 5595 if (r) | |
| 5596 { for (q = r->list; q; q = q->next) | |
| 5597 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) | |
| 5598 { for (sp = services; sp; sp = sp->next) | |
| 5599 for (m = sp->list; m; m = m->next) | |
| 5600 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)))) | |
| 5601 { gen_field(fd, 2, q, NULL, NULL, encoding); | |
| 5602 break; | |
| 5603 } | |
| 5604 } | |
| 5605 } | |
| 5606 fprintf(fd, " </SOAP-ENV:Header>\n"); | |
| 5607 } | |
| 5608 } | |
| 5609 } | |
| 5610 } | |
| 5611 | |
| 5612 FILE * | |
| 5613 gen_env(char *buf, char *method, int response, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding, int soap) | |
| 5614 { char tmp[1024]; | |
| 5615 FILE *fd; | |
| 5616 strcpy(tmp, buf); | |
| 5617 if (!soap) | |
| 5618 strcat(tmp, "REST."); | |
| 5619 #ifdef __vms | |
| 5620 if (!response) | |
| 5621 { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); | |
| 5622 fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); | |
| 5623 } | |
| 5624 else | |
| 5625 { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); | |
| 5626 fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); | |
| 5627 } | |
| 5628 #else | |
| 5629 strcpy(strrchr(tmp, '.')+1, method); | |
| 5630 if (!response) | |
| 5631 { strcat(tmp, ".req.xml"); | |
| 5632 fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); | |
| 5633 } | |
| 5634 else | |
| 5635 { strcat(tmp, ".res.xml"); | |
| 5636 fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); | |
| 5637 } | |
| 5638 #endif | |
| 5639 fd = fopen(tmp, "w"); | |
| 5640 if (!fd) | |
| 5641 execerror("Cannot write XML file"); | |
| 5642 fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); | |
| 5643 if (soap && vflag >= 0) | |
| 5644 { fprintf(fd, "<SOAP-ENV:Envelope"); | |
| 5645 gen_xmlns(fd); | |
| 5646 fprintf(fd, ">\n"); | |
| 5647 gen_header(fd, method, response, encoding); | |
| 5648 fprintf(fd, " <SOAP-ENV:Body"); | |
| 5649 if (eflag && !encoding) | |
| 5650 fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI); | |
| 5651 else if (encoding && !*encoding) | |
| 5652 fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI); | |
| 5653 else if (encoding && strcmp(encoding, "literal")) | |
| 5654 fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encoding); | |
| 5655 fprintf(fd, ">\n"); | |
| 5656 } | |
| 5657 return fd; | |
| 5658 } | |
| 5659 | |
| 5660 void | |
| 5661 gen_xmlns(FILE *fd) | |
| 5662 { Symbol *s; | |
| 5663 Service *sp = NULL; | |
| 5664 for (s = nslist; s; s = s->next) | |
| 5665 { for (sp = services; sp; sp = sp->next) | |
| 5666 if (!tagcmp(sp->ns, s->name) && sp->URI) | |
| 5667 break; | |
| 5668 if (sp) | |
| 5669 fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); | |
| 5670 else if (!strcmp(s->name, "SOAP-ENV")) | |
| 5671 { if (vflag >= 0) | |
| 5672 fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); | |
| 5673 } | |
| 5674 else if (!strcmp(s->name, "SOAP-ENC")) | |
| 5675 { if (vflag >= 0) | |
| 5676 fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); | |
| 5677 } | |
| 5678 else if (!strcmp(s->name, "xsi")) | |
| 5679 fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); | |
| 5680 else if (!strcmp(s->name, "xsd")) | |
| 5681 fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); | |
| 5682 else | |
| 5683 fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); | |
| 5684 } | |
| 5685 } | |
| 5686 | |
| 5687 char * | |
| 5688 emalloc(size_t n) | |
| 5689 { char *p; | |
| 5690 if ((p = (char*)malloc(n)) == NULL) | |
| 5691 execerror("out of memory"); | |
| 5692 return p; | |
| 5693 } | |
| 5694 | |
| 5695 void | |
| 5696 soap_serve(Table *table) | |
| 5697 { Entry *method, *catch_method = NULL; | |
| 5698 char *catch_action = NULL; | |
| 5699 if (!Cflag) | |
| 5700 { | |
| 5701 fprintf(fserver,"\n\n"); | |
| 5702 if (!cflag && !namespaceid) | |
| 5703 fprintf(fserver,"extern \"C\" "); | |
| 5704 fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); | |
| 5705 | |
| 5706 fprintf(fserver,"\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = soap->max_keep_alive;\n#endif\n\tdo\n\t{"); | |
| 5707 fprintf(fserver,"\n#ifndef WITH_FASTCGI\n\t\tif (soap->max_keep_alive > 0 && !--k)\n\t\t\tsoap->keep_alive = 0;\n#endif"); | |
| 5708 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}"); | |
| 5709 if (namespaceid) | |
| 5710 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"); | |
| 5711 else | |
| 5712 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"); | |
| 5713 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"); | |
| 5714 | |
| 5715 fprintf(fserver,"\n\treturn SOAP_OK;"); | |
| 5716 fprintf(fserver,"\n}"); | |
| 5717 | |
| 5718 fprintf(fserver,"\n\n#ifndef WITH_NOSERVEREQUEST\n"); | |
| 5719 if (!cflag && !namespaceid) | |
| 5720 fprintf(fserver,"extern \"C\" "); | |
| 5721 fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); | |
| 5722 fprintf(fserver, "\n\tsoap_peek_element(soap);"); | |
| 5723 for (method = table->list; method; method = method->next) | |
| 5724 { char *action = NULL; | |
| 5725 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) | |
| 5726 { if (aflag) | |
| 5727 { Service *sp; | |
| 5728 for (sp = services; sp; sp = sp->next) | |
| 5729 { if (has_ns_eq(sp->ns, method->sym->name)) | |
| 5730 { Method *m; | |
| 5731 for (m = sp->list; m; m = m->next) | |
| 5732 { if (is_eq_nons(m->name, method->sym->name)) | |
| 5733 { if (m->mess == ACTION || m->mess == REQUEST_ACTION) | |
| 5734 action = m->part; | |
| 5735 } | |
| 5736 } | |
| 5737 } | |
| 5738 } | |
| 5739 } | |
| 5740 if (is_invisible(method->sym->name)) | |
| 5741 { Entry *param = entry(classtable, method->sym); | |
| 5742 if (param) | |
| 5743 param = ((Table*)param->info.typ->ref)->list; | |
| 5744 if (action) | |
| 5745 { if (*action == '"') | |
| 5746 { fprintf(fserver, "\n\tif ("); | |
| 5747 if (param && !Aflag) | |
| 5748 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); | |
| 5749 else | |
| 5750 { catch_method = method; | |
| 5751 catch_action = action; | |
| 5752 } | |
| 5753 fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); | |
| 5754 } | |
| 5755 else | |
| 5756 { fprintf(fserver, "\n\tif ("); | |
| 5757 if (param && !Aflag) | |
| 5758 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); | |
| 5759 else | |
| 5760 { catch_method = method; | |
| 5761 catch_action = action; | |
| 5762 } | |
| 5763 fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); | |
| 5764 } | |
| 5765 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); | |
| 5766 } | |
| 5767 else | |
| 5768 { if (Aflag) | |
| 5769 compliancewarn("Option -A requires a SOAPAction where none is defined"); | |
| 5770 if (param) | |
| 5771 { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(param->sym->name)); | |
| 5772 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); | |
| 5773 } | |
| 5774 else | |
| 5775 { catch_method = method; | |
| 5776 catch_action = action; | |
| 5777 } | |
| 5778 } | |
| 5779 } | |
| 5780 else | |
| 5781 { if (action) | |
| 5782 { if (*action == '"') | |
| 5783 { fprintf(fserver, "\n\tif ("); | |
| 5784 if (!Aflag) | |
| 5785 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); | |
| 5786 fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); | |
| 5787 } | |
| 5788 else | |
| 5789 { fprintf(fserver, "\n\tif ("); | |
| 5790 if (!Aflag) | |
| 5791 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); | |
| 5792 fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); | |
| 5793 } | |
| 5794 } | |
| 5795 else | |
| 5796 { if (Aflag) | |
| 5797 compliancewarn("Option -A requires a SOAPAction where none is defined"); | |
| 5798 fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(method->sym->name)); | |
| 5799 } | |
| 5800 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); | |
| 5801 } | |
| 5802 } | |
| 5803 } | |
| 5804 if (catch_method) | |
| 5805 { if (Aflag && catch_action) | |
| 5806 { if (*catch_action == '"') | |
| 5807 { fprintf(fserver, "\n\tif ("); | |
| 5808 fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", catch_action); | |
| 5809 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); | |
| 5810 } | |
| 5811 else | |
| 5812 { fprintf(fserver, "\n\tif ("); | |
| 5813 fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", catch_action); | |
| 5814 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); | |
| 5815 } | |
| 5816 fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;"); | |
| 5817 } | |
| 5818 else | |
| 5819 fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); | |
| 5820 } | |
| 5821 else | |
| 5822 fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;"); | |
| 5823 | |
| 5824 fprintf(fserver,"\n}\n#endif"); | |
| 5825 | |
| 5826 banner(fheader, "Server-Side Operations"); | |
| 5827 for (method = table->list; method; method = method->next) | |
| 5828 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) | |
| 5829 generate_proto(table, method); | |
| 5830 | |
| 5831 banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); | |
| 5832 fprintf(fheader, "\n"); | |
| 5833 if (!cflag && !namespaceid) | |
| 5834 fprintf(fheader,"extern \"C\" "); | |
| 5835 fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); | |
| 5836 fprintf(fheader, "\n\n"); | |
| 5837 if (!cflag && !namespaceid) | |
| 5838 fprintf(fheader,"extern \"C\" "); | |
| 5839 fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); | |
| 5840 for (method = table->list; method; method = method->next) | |
| 5841 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) | |
| 5842 gen_serve_method(fserver, table, method, NULL); | |
| 5843 | |
| 5844 } | |
| 5845 | |
| 5846 if (!Sflag) | |
| 5847 { banner(fheader, "Client-Side Call Stubs"); | |
| 5848 for (method = table->list; method; method = method->next) | |
| 5849 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) | |
| 5850 gen_call_method(fclient, table, method, NULL); | |
| 5851 } | |
| 5852 | |
| 5853 } | |
| 5854 | |
| 5855 void | |
| 5856 generate_proto(Table *table, Entry *param) | |
| 5857 { Entry *q, *pout; | |
| 5858 Table *output; | |
| 5859 q = entry(table, param->sym); | |
| 5860 if (q) | |
| 5861 pout = (Entry*)q->info.typ->ref; | |
| 5862 else | |
| 5863 { fprintf(stderr, "Internal error: no table entry\n"); | |
| 5864 return; | |
| 5865 } | |
| 5866 q = entry(classtable, param->sym); | |
| 5867 output = (Table*)q->info.typ->ref; | |
| 5868 fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); | |
| 5869 gen_params(fheader, output, pout, 1); | |
| 5870 fprintf(fheader, ";"); | |
| 5871 } | |
| 5872 | |
| 5873 int | |
| 5874 tagcmp(const char *s, const char *t) | |
| 5875 { size_t i, n; | |
| 5876 n = strlen(s); | |
| 5877 for (i = 0; i < n; i++) | |
| 5878 { int c = t[i]; | |
| 5879 if (c == '_' && s[i] != '_') | |
| 5880 c = '-'; | |
| 5881 if (s[i] > c) | |
| 5882 return 1; | |
| 5883 if (s[i] < c) | |
| 5884 return -1; | |
| 5885 } | |
| 5886 return -(t[i] != 0); | |
| 5887 } | |
| 5888 | |
| 5889 int | |
| 5890 tagncmp(const char *s, const char *t, size_t n) | |
| 5891 { size_t i; | |
| 5892 for (i = 0; i < n; i++) | |
| 5893 { int c = t[i]; | |
| 5894 if (c == '_' && s[i] != '_') | |
| 5895 c = '-'; | |
| 5896 if (s[i] > c) | |
| 5897 return 1; | |
| 5898 if (s[i] < c) | |
| 5899 return -1; | |
| 5900 } | |
| 5901 return 0; | |
| 5902 } | |
| 5903 | |
| 5904 int | |
| 5905 is_qname(Tnode *p) | |
| 5906 { if (p->sym && is_string(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) | |
| 5907 return 1; | |
| 5908 return p->id && is_string(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); | |
| 5909 } | |
| 5910 | |
| 5911 int | |
| 5912 is_stdqname(Tnode *p) | |
| 5913 { if (p->sym && p->type == Tclass && is_volatile(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) | |
| 5914 return 1; | |
| 5915 return p->id && p->type == Tclass && is_volatile(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); | |
| 5916 } | |
| 5917 | |
| 5918 int | |
| 5919 is_XML(Tnode *p) | |
| 5920 { 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)); | |
| 5921 } | |
| 5922 | |
| 5923 int | |
| 5924 is_stdXML(Tnode *p) | |
| 5925 { return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); | |
| 5926 } | |
| 5927 | |
| 5928 int | |
| 5929 is_response(Tnode *p) | |
| 5930 { return (p->type == Tpointer || p->type == Treference) | |
| 5931 && p->ref | |
| 5932 && has_ns((Tnode*)p->ref) | |
| 5933 && ((((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)); | |
| 5934 } | |
| 5935 | |
| 5936 Entry* | |
| 5937 get_response(Tnode *p) | |
| 5938 { if (p->type == Tfun) | |
| 5939 return p->response; | |
| 5940 return 0; | |
| 5941 } | |
| 5942 | |
| 5943 int | |
| 5944 is_unmatched(Symbol *sym) | |
| 5945 { return sym->name[0] == '_' | |
| 5946 && sym->name[1] != '_' | |
| 5947 && strncmp(sym->name, "_DOT", 4) | |
| 5948 && strncmp(sym->name, "_USCORE", 7) | |
| 5949 && (strncmp(sym->name, "_x", 2) || !isxdigit(sym->name[2]) || !isxdigit(sym->name[3]) || !isxdigit(sym->name[4]) || !isxdigit(sym->name[5])); | |
| 5950 } | |
| 5951 | |
| 5952 int | |
| 5953 is_invisible(const char *name) | |
| 5954 { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); | |
| 5955 } | |
| 5956 | |
| 5957 int | |
| 5958 is_invisible_empty(Tnode *p) | |
| 5959 { if (p->type == Tstruct || p->type == Tclass) | |
| 5960 if (is_invisible(p->id->name)) | |
| 5961 if (!p->ref || !((Table*)p->ref)->list) | |
| 5962 return 1; | |
| 5963 return 0; | |
| 5964 } | |
| 5965 | |
| 5966 int | |
| 5967 is_element(Tnode *typ) | |
| 5968 { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) | |
| 5969 return 0; | |
| 5970 if (typ->sym) | |
| 5971 return is_unmatched(typ->sym); | |
| 5972 if (typ->type == Tstruct || typ->type == Tclass) | |
| 5973 return is_unmatched(typ->id); | |
| 5974 return 0; | |
| 5975 } | |
| 5976 | |
| 5977 int | |
| 5978 is_untyped(Tnode *typ) | |
| 5979 { Tnode *p; | |
| 5980 if (typ->sym) | |
| 5981 return is_unmatched(typ->sym); | |
| 5982 if (typ->type == Tpointer || typ->type == Treference || typ->type == Tarray) | |
| 5983 return is_untyped((Tnode*)typ->ref); | |
| 5984 if (typ->type == Tstruct || typ->type == Tclass) | |
| 5985 { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) | |
| 5986 { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; | |
| 5987 return is_untyped(p); | |
| 5988 } | |
| 5989 else | |
| 5990 return is_unmatched(typ->id); | |
| 5991 } | |
| 5992 return 0; | |
| 5993 } | |
| 5994 | |
| 5995 int | |
| 5996 is_primclass(Tnode *typ) | |
| 5997 { Table *t; | |
| 5998 if (typ->type == Tstruct || typ->type == Tclass) | |
| 5999 { if (!is_dynamic_array(typ)) | |
| 6000 { t = (Table*)typ->ref; | |
| 6001 while (t) | |
| 6002 { if (t->list && is_item(t->list)) | |
| 6003 break; | |
| 6004 t = t->prev; | |
| 6005 } | |
| 6006 if (!t) | |
| 6007 return 0; | |
| 6008 t = (Table*)typ->ref; | |
| 6009 while (t) | |
| 6010 { Entry *p; | |
| 6011 for (p = t->list; p; p = p->next) | |
| 6012 if (!is_item(p)) | |
| 6013 if (p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) | |
| 6014 return 0; | |
| 6015 t = t->prev; | |
| 6016 } | |
| 6017 return 1; | |
| 6018 } | |
| 6019 } | |
| 6020 else if (typ->type == Tpointer || typ->type == Treference) | |
| 6021 return is_primclass((Tnode*)typ->ref); | |
| 6022 return 0; | |
| 6023 } | |
| 6024 | |
| 6025 int | |
| 6026 is_mask(Tnode *typ) | |
| 6027 { return (typ->type == Tenum && typ->width == 8); | |
| 6028 } | |
| 6029 | |
| 6030 int | |
| 6031 is_void(Tnode *typ) | |
| 6032 { if (!typ) | |
| 6033 return 1; | |
| 6034 if (typ->type == Tvoid) | |
| 6035 return 1; | |
| 6036 if (typ->type == Tpointer) | |
| 6037 return is_void((Tnode*)typ->ref); | |
| 6038 if (typ->type == Treference) | |
| 6039 return is_void((Tnode*)typ->ref); | |
| 6040 if (typ->type == Tarray) | |
| 6041 return is_void((Tnode*)typ->ref); | |
| 6042 if (typ->type == Ttemplate) | |
| 6043 return is_void((Tnode*)typ->ref); | |
| 6044 return 0; | |
| 6045 } | |
| 6046 | |
| 6047 int | |
| 6048 is_transient(Tnode *typ) | |
| 6049 { if (!typ) | |
| 6050 return 1; | |
| 6051 if (typ->type == Tstruct && typ->id == lookup("soap")) | |
| 6052 return 1; | |
| 6053 if (is_external(typ) || is_volatile(typ)) | |
| 6054 return 0; | |
| 6055 if (typ->transient > 0) | |
| 6056 return 1; | |
| 6057 switch (typ->type) | |
| 6058 { case Tpointer: | |
| 6059 case Treference: | |
| 6060 case Tarray: | |
| 6061 case Ttemplate: | |
| 6062 return is_transient((Tnode*)typ->ref); | |
| 6063 case Tnone: | |
| 6064 case Tvoid: | |
| 6065 return 1; | |
| 6066 default: | |
| 6067 break; | |
| 6068 } | |
| 6069 return 0; | |
| 6070 } | |
| 6071 | |
| 6072 int | |
| 6073 is_imported(Tnode* typ) | |
| 6074 { return typ->imported != NULL; | |
| 6075 } | |
| 6076 | |
| 6077 int | |
| 6078 is_external(Tnode* typ) | |
| 6079 { return typ->transient == -1; | |
| 6080 } | |
| 6081 | |
| 6082 int | |
| 6083 is_anyType(Tnode* typ) | |
| 6084 { if (typ->type == Tpointer) | |
| 6085 return is_anyType((Tnode*)typ->ref); | |
| 6086 return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element"); | |
| 6087 } | |
| 6088 | |
| 6089 int | |
| 6090 is_anyAttribute(Tnode* typ) | |
| 6091 { if (typ->type == Tpointer) | |
| 6092 return is_anyAttribute((Tnode*)typ->ref); | |
| 6093 return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); | |
| 6094 } | |
| 6095 | |
| 6096 int | |
| 6097 is_volatile(Tnode* typ) | |
| 6098 { return typ->transient == -2; | |
| 6099 } | |
| 6100 | |
| 6101 int | |
| 6102 is_template(Tnode *p) | |
| 6103 { if (p->type == Tpointer) | |
| 6104 return is_template((Tnode*)p->ref); | |
| 6105 return p->type == Ttemplate; | |
| 6106 } | |
| 6107 | |
| 6108 int | |
| 6109 is_repetition(Entry *p) | |
| 6110 { if (p) | |
| 6111 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)); | |
| 6112 return 0; | |
| 6113 } | |
| 6114 | |
| 6115 int | |
| 6116 is_item(Entry *p) | |
| 6117 { if (p) | |
| 6118 return !strcmp(p->sym->name, "__item"); | |
| 6119 return 0; | |
| 6120 } | |
| 6121 | |
| 6122 int | |
| 6123 is_self(Entry *p) | |
| 6124 { if (p) | |
| 6125 return !strcmp(p->sym->name, "__self"); | |
| 6126 return 0; | |
| 6127 } | |
| 6128 | |
| 6129 int | |
| 6130 is_choice(Entry *p) | |
| 6131 { if (p) | |
| 6132 if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) | |
| 6133 return 1; | |
| 6134 return 0; | |
| 6135 } | |
| 6136 | |
| 6137 int | |
| 6138 is_sequence(Entry *p) | |
| 6139 { if (p) | |
| 6140 { Tnode *q = p->info.typ; | |
| 6141 if (q->type == Tpointer) | |
| 6142 q = (Tnode*)q->ref; | |
| 6143 if (q->type == Tstruct && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) | |
| 6144 return 1; | |
| 6145 } | |
| 6146 return 0; | |
| 6147 } | |
| 6148 | |
| 6149 | |
| 6150 int | |
| 6151 is_anytype(Entry *p) | |
| 6152 { if (p) | |
| 6153 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)) | |
| 6154 { is_anytype_flag = 1; | |
| 6155 return 1; | |
| 6156 } | |
| 6157 return 0; | |
| 6158 } | |
| 6159 | |
| 6160 int | |
| 6161 is_keyword(const char *name) | |
| 6162 { Symbol *s = lookup(name); | |
| 6163 if (s) | |
| 6164 return s->token != ID; | |
| 6165 return 0; | |
| 6166 } | |
| 6167 | |
| 6168 | |
| 6169 int | |
| 6170 has_ptr(Tnode *typ) | |
| 6171 { Tnode *p; | |
| 6172 if (typ->type == Tpointer || typ->type == Treference) | |
| 6173 return 0; | |
| 6174 for (p = Tptr[Tpointer]; p; p = p->next) | |
| 6175 if ((Tnode*)p->ref == typ && p->transient != 1) | |
| 6176 return 1; | |
| 6177 return 0; | |
| 6178 } | |
| 6179 | |
| 6180 int | |
| 6181 has_detail_string(void) | |
| 6182 { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); | |
| 6183 if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) | |
| 6184 { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); | |
| 6185 if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) | |
| 6186 { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); | |
| 6187 return e2 && is_string(e2->info.typ); | |
| 6188 } | |
| 6189 } | |
| 6190 return 0; | |
| 6191 } | |
| 6192 | |
| 6193 int | |
| 6194 has_Detail_string(void) | |
| 6195 { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); | |
| 6196 if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) | |
| 6197 { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); | |
| 6198 if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) | |
| 6199 { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); | |
| 6200 return e2 && is_string(e2->info.typ); | |
| 6201 } | |
| 6202 } | |
| 6203 return 0; | |
| 6204 } | |
| 6205 | |
| 6206 int | |
| 6207 has_class(Tnode *typ) | |
| 6208 { Entry *p; | |
| 6209 if (typ->type == Tstruct && typ->ref) | |
| 6210 { for (p = ((Table*)typ->ref)->list; p; p = p->next) | |
| 6211 { if (p->info.sto & Stypedef) | |
| 6212 continue; | |
| 6213 if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) | |
| 6214 return 1; | |
| 6215 if (p->info.typ->type == Tstruct && has_class(p->info.typ)) | |
| 6216 return 1; | |
| 6217 } | |
| 6218 } | |
| 6219 return 0; | |
| 6220 } | |
| 6221 | |
| 6222 int | |
| 6223 has_external(Tnode *typ) | |
| 6224 { Entry *p; | |
| 6225 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) | |
| 6226 { for (p = ((Table*)typ->ref)->list; p; p = p->next) | |
| 6227 { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) | |
| 6228 { if (is_external(p->info.typ) || has_external(p->info.typ)) | |
| 6229 return 1; | |
| 6230 } | |
| 6231 } | |
| 6232 } | |
| 6233 return 0; | |
| 6234 } | |
| 6235 | |
| 6236 int | |
| 6237 has_volatile(Tnode *typ) | |
| 6238 { Entry *p; | |
| 6239 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) | |
| 6240 { for (p = ((Table*)typ->ref)->list; p; p = p->next) | |
| 6241 { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) | |
| 6242 { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) | |
| 6243 if (!is_stdstr(p->info.typ)) | |
| 6244 return 1; | |
| 6245 } | |
| 6246 } | |
| 6247 } | |
| 6248 return 0; | |
| 6249 } | |
| 6250 | |
| 6251 int | |
| 6252 has_ns(Tnode *typ) | |
| 6253 { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum) | |
| 6254 return has_ns_eq(NULL, typ->id->name); | |
| 6255 return 0; | |
| 6256 } | |
| 6257 | |
| 6258 int | |
| 6259 has_ns_t(Tnode *typ) | |
| 6260 { char *s; | |
| 6261 if (typ->sym) | |
| 6262 { s = strstr(typ->sym->name + 1, "__"); | |
| 6263 if (!s) | |
| 6264 { s = strchr(typ->sym->name, ':'); | |
| 6265 if (s && s[1] == ':') | |
| 6266 s = NULL; | |
| 6267 } | |
| 6268 return s && s[1] && s[2] && (s[2] != '_' | |
| 6269 || (s[2] == '_' && s[3] == 'x' && isxdigit(s[4]) && isxdigit(s[5]) && isxdigit(s[6]) && isxdigit(s[7])) | |
| 6270 || !strncmp(s+2, "_DOT", 4) | |
| 6271 || !strncmp(s+2, "_USCORE", 7)); | |
| 6272 } | |
| 6273 return has_ns(typ); | |
| 6274 } | |
| 6275 | |
| 6276 /* needs_lang adds xml:lang attribute to matching struct/class member name | |
| 6277 we should use an annotation for soapcpp2's input this in the future instead | |
| 6278 of a hard-coded member name */ | |
| 6279 void | |
| 6280 needs_lang(Entry *e) | |
| 6281 { if (!strcmp(e->sym->name, "SOAP_ENV__Text")) | |
| 6282 fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); | |
| 6283 } | |
| 6284 | |
| 6285 int | |
| 6286 is_eq_nons(const char *s, const char *t) | |
| 6287 { size_t n, m; | |
| 6288 char *r; | |
| 6289 while (*s == '_' || *s == ':') | |
| 6290 s++; | |
| 6291 while (*t == '_' || *t == ':') | |
| 6292 t++; | |
| 6293 if (!*s || !*t) | |
| 6294 return 0; | |
| 6295 r = strstr(t, "__"); | |
| 6296 if (r) | |
| 6297 t = r + 2; | |
| 6298 n = strlen(s) - 1; | |
| 6299 m = strlen(t) - 1; | |
| 6300 #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING | |
| 6301 while (n > 0 && s[n] == '_') | |
| 6302 n--; | |
| 6303 while (m > 0 && t[m] == '_') | |
| 6304 m--; | |
| 6305 #endif | |
| 6306 if (n != m) | |
| 6307 return 0; | |
| 6308 return !strncmp(s, t, n + 1); | |
| 6309 } | |
| 6310 | |
| 6311 int | |
| 6312 is_eq(const char *s, const char *t) | |
| 6313 { size_t n, m; | |
| 6314 while (*s == '_' || *s == ':') | |
| 6315 s++; | |
| 6316 while (*t == '_' || *t == ':') | |
| 6317 t++; | |
| 6318 if (!*s || !*t) | |
| 6319 return 0; | |
| 6320 for (n = strlen(s) - 1; n && s[n] == '_'; n--) | |
| 6321 ; | |
| 6322 for (m = strlen(t) - 1; m && t[m] == '_'; m--) | |
| 6323 ; | |
| 6324 if (n != m) | |
| 6325 return 0; | |
| 6326 return !strncmp(s, t, n + 1); | |
| 6327 } | |
| 6328 | |
| 6329 int | |
| 6330 has_ns_eq(char *ns, char *s) | |
| 6331 { size_t n; | |
| 6332 while (*s == '_' || *s == ':') | |
| 6333 s++; | |
| 6334 if (!ns) | |
| 6335 { char *t = strstr(s + 1, "__"); | |
| 6336 if (!t | |
| 6337 || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) | |
| 6338 || !strncmp(t+2, "DOT", 3) | |
| 6339 || !strncmp(t+2, "USCORE", 6)) | |
| 6340 { t = strchr(s, ':'); | |
| 6341 if (t && t[1] == ':') | |
| 6342 t = NULL; | |
| 6343 } | |
| 6344 return t && t[1] && t[2] && t[2] != '_'; | |
| 6345 } | |
| 6346 if ((n = strlen(ns)) < strlen(s)) | |
| 6347 return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); | |
| 6348 return 0; | |
| 6349 } | |
| 6350 | |
| 6351 char * | |
| 6352 strict_check(void) | |
| 6353 { if (sflag) | |
| 6354 return ""; | |
| 6355 return "(soap->mode & SOAP_XML_STRICT) && "; | |
| 6356 } | |
| 6357 | |
| 6358 char * | |
| 6359 ns_of(char *name) | |
| 6360 { Service *sp; | |
| 6361 for (sp = services; sp; sp = sp->next) | |
| 6362 if (has_ns_eq(sp->ns, name)) | |
| 6363 break; | |
| 6364 if (sp) | |
| 6365 return sp->URI; | |
| 6366 return NULL; | |
| 6367 } | |
| 6368 | |
| 6369 int | |
| 6370 eq_ns(char *s, char *t) | |
| 6371 { return ns_of(s) == ns_of(t); | |
| 6372 } | |
| 6373 | |
| 6374 char * | |
| 6375 prefix_of(char *s) | |
| 6376 { char *t; | |
| 6377 while (*s == '_' || *s == ':') | |
| 6378 s++; | |
| 6379 t = strstr(s + 1, "__"); | |
| 6380 if (!t) | |
| 6381 { t = strchr(s, ':'); | |
| 6382 if (t && t[1] == ':') | |
| 6383 t = NULL; | |
| 6384 } | |
| 6385 if (t && t[1] && t[2] && t[2] != '_') | |
| 6386 { char *r = (char*)emalloc(t - s + 1); | |
| 6387 strncpy(r, s, t - s); | |
| 6388 r[t - s] = '\0'; | |
| 6389 return r; | |
| 6390 } | |
| 6391 return s; | |
| 6392 } | |
| 6393 | |
| 6394 char * | |
| 6395 ns_add_overridden(Table *t, Entry *p, char *ns) | |
| 6396 { Entry *q; | |
| 6397 Symbol *s = t->sym; | |
| 6398 if (s) | |
| 6399 { do | |
| 6400 { for (q = t->list; q; q = q->next) | |
| 6401 if (!strcmp(q->sym->name, p->sym->name)) | |
| 6402 return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); | |
| 6403 } while ((t = t->prev) != NULL); | |
| 6404 } | |
| 6405 return ns_add(p, ns); | |
| 6406 } | |
| 6407 | |
| 6408 | |
| 6409 char * | |
| 6410 c_ident(Tnode *typ) | |
| 6411 { if (typ->sym && strcmp(typ->sym->name, "/*?*/")) | |
| 6412 return res_remove(typ->sym->name); | |
| 6413 return t_ident(typ); | |
| 6414 } | |
| 6415 | |
| 6416 char * | |
| 6417 soap_type(Tnode *typ) | |
| 6418 { char *s, *t = c_ident(typ); | |
| 6419 if (namespaceid) | |
| 6420 { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); | |
| 6421 strcpy(s, "SOAP_TYPE_"); | |
| 6422 strcat(s, namespaceid); | |
| 6423 strcat(s, "_"); | |
| 6424 } | |
| 6425 else | |
| 6426 { s = (char*)emalloc(strlen(t) + 11); | |
| 6427 strcpy(s, "SOAP_TYPE_"); | |
| 6428 } | |
| 6429 strcat(s, t); | |
| 6430 return s; | |
| 6431 } | |
| 6432 | |
| 6433 char * | |
| 6434 ident(char *name) | |
| 6435 { char *s = strrchr(name, ':'); | |
| 6436 if (s && *(s+1) && *(s-1) != ':') | |
| 6437 return s+1; | |
| 6438 return name; | |
| 6439 } | |
| 6440 | |
| 6441 /*t_ident gives the name of a type in identifier format*/ | |
| 6442 char * | |
| 6443 t_ident(Tnode *typ) | |
| 6444 { char *p, *q; | |
| 6445 switch(typ->type) | |
| 6446 { | |
| 6447 case Tnone: | |
| 6448 return ""; | |
| 6449 case Tvoid: | |
| 6450 return "void"; | |
| 6451 case Tchar: | |
| 6452 return "byte"; | |
| 6453 case Twchar: | |
| 6454 return "wchar"; | |
| 6455 case Tshort: | |
| 6456 return "short"; | |
| 6457 case Tint: | |
| 6458 return "int"; | |
| 6459 case Tlong: | |
| 6460 return "long"; | |
| 6461 case Tllong: | |
| 6462 return "LONG64"; | |
| 6463 case Tfloat: | |
| 6464 return "float"; | |
| 6465 case Tdouble: | |
| 6466 return "double"; | |
| 6467 case Tldouble: | |
| 6468 return "decimal"; | |
| 6469 case Tuchar: | |
| 6470 return "unsignedByte"; | |
| 6471 case Tushort: | |
| 6472 return "unsignedShort"; | |
| 6473 case Tuint: | |
| 6474 return "unsignedInt"; | |
| 6475 case Tulong: | |
| 6476 return "unsignedLong"; | |
| 6477 case Tullong: | |
| 6478 return "unsignedLONG64"; | |
| 6479 case Ttime: | |
| 6480 return "time"; | |
| 6481 case Tstruct: | |
| 6482 case Tclass: | |
| 6483 case Tunion: | |
| 6484 case Tenum: | |
| 6485 if ((Table*)typ->ref == booltable) | |
| 6486 return "bool"; | |
| 6487 return res_remove(typ->id->name); | |
| 6488 case Treference: | |
| 6489 return c_ident((Tnode*)typ->ref); | |
| 6490 case Tpointer: | |
| 6491 if (is_string(typ)) | |
| 6492 return "string"; | |
| 6493 if (is_wstring(typ)) | |
| 6494 return "wstring"; | |
| 6495 p=(char*) emalloc((10+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char)); | |
| 6496 strcpy(p,"PointerTo"); | |
| 6497 strcat(p,q); | |
| 6498 return p; | |
| 6499 case Tarray: | |
| 6500 p=(char*) emalloc((16+strlen(c_ident((Tnode*)typ->ref)))*sizeof(char)); | |
| 6501 if (((Tnode*)typ->ref)->width) | |
| 6502 sprintf(p, "Array%dOf%s",typ->width / ((Tnode*) typ->ref)->width,c_ident(typ->ref)); | |
| 6503 else | |
| 6504 sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); | |
| 6505 return p; | |
| 6506 case Ttemplate: | |
| 6507 if (typ->ref) | |
| 6508 { p=(char*) emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char)); | |
| 6509 strcpy(p, res_remove(typ->id->name)); | |
| 6510 strcat(p, "TemplateOf"); | |
| 6511 strcat(p, q); | |
| 6512 return p; | |
| 6513 } | |
| 6514 case Tfun: | |
| 6515 return "Function"; | |
| 6516 } | |
| 6517 return "anyType"; | |
| 6518 } | |
| 6519 | |
| 6520 void | |
| 6521 utf8(char **t, long c) | |
| 6522 { if (c < 0x0080) | |
| 6523 *(*t)++ = (char)c; | |
| 6524 else | |
| 6525 { if (c < 0x0800) | |
| 6526 *(*t)++ = (char)(0xC0 | ((c >> 6) & 0x1F)); | |
| 6527 else | |
| 6528 { if (c < 0x010000) | |
| 6529 *(*t)++ = (char)(0xE0 | ((c >> 12) & 0x0F)); | |
| 6530 else | |
| 6531 { if (c < 0x200000) | |
| 6532 *(*t)++ = (char)(0xF0 | ((c >> 18) & 0x07)); | |
| 6533 else | |
| 6534 { if (c < 0x04000000) | |
| 6535 *(*t)++ = (char)(0xF8 | ((c >> 24) & 0x03)); | |
| 6536 else | |
| 6537 { *(*t)++ = (char)(0xFC | ((c >> 30) & 0x01)); | |
| 6538 *(*t)++ = (char)(0x80 | ((c >> 24) & 0x3F)); | |
| 6539 } | |
| 6540 *(*t)++ = (char)(0x80 | ((c >> 18) & 0x3F)); | |
| 6541 } | |
| 6542 *(*t)++ = (char)(0x80 | ((c >> 12) & 0x3F)); | |
| 6543 } | |
| 6544 *(*t)++ = (char)(0x80 | ((c >> 6) & 0x3F)); | |
| 6545 } | |
| 6546 *(*t)++ = (char)(0x80 | (c & 0x3F)); | |
| 6547 } | |
| 6548 *(*t) = '\0'; | |
| 6549 } | |
| 6550 | |
| 6551 char * | |
| 6552 ns_convert(char *tag) | |
| 6553 { char *t, *s; | |
| 6554 size_t i, n; | |
| 6555 if (*tag == '_') | |
| 6556 { if (!strncmp(tag, "__ptr", 5)) | |
| 6557 { if (tag[5]) | |
| 6558 tag += 5; | |
| 6559 else | |
| 6560 tag = "item"; | |
| 6561 } | |
| 6562 else if (strncmp(tag, "_DOT", 4) | |
| 6563 && strncmp(tag, "_USCORE", 7) | |
| 6564 && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) | |
| 6565 tag++; /* skip leading _ */ | |
| 6566 } | |
| 6567 for (n = strlen(tag); n > 0; n--) | |
| 6568 { if (tag[n-1] != '_') | |
| 6569 break; | |
| 6570 } | |
| 6571 s = t = (char*)emalloc(n+1); | |
| 6572 for (i = 0; i < n; i++) | |
| 6573 { if (tag[i] == '_') | |
| 6574 { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) | |
| 6575 break; | |
| 6576 else if (!strncmp(tag+i, "_DOT", 4)) | |
| 6577 { *s++ = '.'; | |
| 6578 i += 3; | |
| 6579 } | |
| 6580 else if (!strncmp(tag+i, "_USCORE", 7)) | |
| 6581 { *s++ = '_'; | |
| 6582 i += 6; | |
| 6583 } | |
| 6584 else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) | |
| 6585 { char d[5]; | |
| 6586 strncpy(d, tag+i+2, 4); | |
| 6587 d[4] = '\0'; | |
| 6588 utf8(&s, strtoul(d, NULL, 16)); | |
| 6589 i += 5; | |
| 6590 } | |
| 6591 else | |
| 6592 *s++ = '-'; | |
| 6593 } | |
| 6594 else if (tag[i] == ':' && tag[i+1] == ':') | |
| 6595 break; | |
| 6596 else | |
| 6597 *s++ = tag[i]; | |
| 6598 } | |
| 6599 if (i < n) | |
| 6600 { *s++ = ':'; | |
| 6601 for (i += 2; i < n; i++) | |
| 6602 { if (tag[i] == '_') | |
| 6603 { if (!strncmp(tag+i, "_DOT", 4)) | |
| 6604 { *s++ = '.'; | |
| 6605 i += 3; | |
| 6606 } | |
| 6607 else if (!strncmp(tag+i, "_USCORE", 7)) | |
| 6608 { *s++ = '_'; | |
| 6609 i += 6; | |
| 6610 } | |
| 6611 else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) | |
| 6612 { char d[5]; | |
| 6613 strncpy(d, tag+i+2, 4); | |
| 6614 d[4] = '\0'; | |
| 6615 utf8(&s, strtoul(d, NULL, 16)); | |
| 6616 i += 5; | |
| 6617 } | |
| 6618 else | |
| 6619 *s++ = '-'; | |
| 6620 } | |
| 6621 else | |
| 6622 *s++ = tag[i]; | |
| 6623 } | |
| 6624 } | |
| 6625 *s = '\0'; | |
| 6626 return t; | |
| 6627 } | |
| 6628 | |
| 6629 char * | |
| 6630 res_remove(char *tag) | |
| 6631 { char *s, *t; | |
| 6632 if (!(s = strchr(tag, ':'))) | |
| 6633 return tag; | |
| 6634 if (s[1] != ':') | |
| 6635 tag = s + 1; | |
| 6636 if (!strchr(tag, ':')) | |
| 6637 return tag; | |
| 6638 s = emalloc(strlen(tag) + 1); | |
| 6639 strcpy(s, tag); | |
| 6640 while ((t = strchr(s, ':'))) | |
| 6641 *t = '_'; | |
| 6642 return s; | |
| 6643 } | |
| 6644 | |
| 6645 char * | |
| 6646 ns_qualifiedElement(Tnode *typ) | |
| 6647 { Service *sp; | |
| 6648 char *s = NULL; | |
| 6649 if (typ->sym) | |
| 6650 s = prefix_of(typ->sym->name); | |
| 6651 if (!s && typ->id) | |
| 6652 s = prefix_of(typ->id->name); | |
| 6653 if (!s) | |
| 6654 return NULL; | |
| 6655 for (sp = services; sp; sp = sp->next) | |
| 6656 { if (sp->elementForm && !tagcmp(sp->ns, s)) | |
| 6657 { if (!strcmp(sp->elementForm, "qualified")) | |
| 6658 return s; | |
| 6659 return NULL; | |
| 6660 } | |
| 6661 } | |
| 6662 for (sp = services; sp; sp = sp->next) | |
| 6663 if (!tagcmp(sp->ns, s)) | |
| 6664 if (sp->style && !strcmp(sp->style, "document")) | |
| 6665 return s; | |
| 6666 return NULL; | |
| 6667 } | |
| 6668 | |
| 6669 char * | |
| 6670 ns_qualifiedAttribute(Tnode *typ) | |
| 6671 { Service *sp; | |
| 6672 char *s = NULL; | |
| 6673 if (typ->sym) | |
| 6674 s = prefix_of(typ->sym->name); | |
| 6675 if (!s && typ->id) | |
| 6676 s = prefix_of(typ->id->name); | |
| 6677 if (!s) | |
| 6678 return NULL; | |
| 6679 for (sp = services; sp; sp = sp->next) | |
| 6680 { if (sp->attributeForm && !tagcmp(sp->ns, s)) | |
| 6681 { if (!strcmp(sp->attributeForm, "qualified")) | |
| 6682 return s; | |
| 6683 return NULL; | |
| 6684 } | |
| 6685 } | |
| 6686 return NULL; | |
| 6687 } | |
| 6688 | |
| 6689 char * | |
| 6690 field(Entry *p, char *ns) | |
| 6691 { char *r, *s; | |
| 6692 if (is_self(p)) | |
| 6693 return "tag"; | |
| 6694 r = ns_add(p, ns); | |
| 6695 s = emalloc(strlen(r) + 3); | |
| 6696 strcpy(s, "\""); | |
| 6697 strcat(s, r); | |
| 6698 strcat(s, "\""); | |
| 6699 return s; | |
| 6700 } | |
| 6701 | |
| 6702 char * | |
| 6703 field_overridden(Table *t, Entry *p, char *ns) | |
| 6704 { char *r, *s; | |
| 6705 if (is_self(p)) | |
| 6706 return "tag"; | |
| 6707 r = ns_add_overridden(t, p, ns); | |
| 6708 s = emalloc(strlen(r) + 3); | |
| 6709 strcpy(s, "\""); | |
| 6710 strcat(s, r); | |
| 6711 strcat(s, "\""); | |
| 6712 return s; | |
| 6713 } | |
| 6714 | |
| 6715 char * | |
| 6716 ns_add(Entry *p, char *ns) | |
| 6717 { if (p->tag) | |
| 6718 return ns_addx(p->tag, ns); | |
| 6719 return ns_addx(p->sym->name, ns); | |
| 6720 } | |
| 6721 | |
| 6722 char * | |
| 6723 ns_addx(char *tag, char *ns) | |
| 6724 { char *n, *t, *s = ns_convert(tag); | |
| 6725 if (*s == ':') | |
| 6726 return s+1; | |
| 6727 if (!ns || *s == '-' || (t = strchr(s, ':'))) | |
| 6728 return s; | |
| 6729 n = ns_convert(ns); | |
| 6730 t = emalloc(strlen(n) + strlen(s) + 2); | |
| 6731 strcpy(t, n); | |
| 6732 strcat(t, ":"); | |
| 6733 strcat(t, s); | |
| 6734 return t; | |
| 6735 } | |
| 6736 | |
| 6737 char * | |
| 6738 ns_name(char *tag) | |
| 6739 { char *t, *r, *s = tag; | |
| 6740 if (*s) | |
| 6741 { for (r = s+strlen(s)-1; r > s; r--) | |
| 6742 if (*r != '_') | |
| 6743 break; | |
| 6744 for (t = s + 1; t < r; t++) | |
| 6745 { if (t[0] == '_' && t[1] == '_') | |
| 6746 { s = t + 2; | |
| 6747 t++; | |
| 6748 } | |
| 6749 else if (t[0] == ':' && t[1] != ':') | |
| 6750 { s = t + 1; | |
| 6751 t++; | |
| 6752 } | |
| 6753 } | |
| 6754 } | |
| 6755 return s; | |
| 6756 } | |
| 6757 | |
| 6758 char * | |
| 6759 ns_cname(char *tag, char *suffix) | |
| 6760 { char *s, *t; | |
| 6761 size_t i, n; | |
| 6762 if (!tag) | |
| 6763 return NULL; | |
| 6764 t = ns_name(tag); | |
| 6765 n = strlen(t); | |
| 6766 if (suffix) | |
| 6767 s = emalloc(n + strlen(suffix) + 2); | |
| 6768 else | |
| 6769 s = emalloc(n + 2); | |
| 6770 for (i = 0; i < n; i++) | |
| 6771 { if (!isalnum(t[i])) | |
| 6772 s[i] = '_'; | |
| 6773 else | |
| 6774 s[i] = t[i]; | |
| 6775 } | |
| 6776 s[i] = '\0'; | |
| 6777 if (suffix) | |
| 6778 strcat(s, suffix); | |
| 6779 if (is_keyword(t)) | |
| 6780 strcat(s, "_"); | |
| 6781 return s; | |
| 6782 } | |
| 6783 | |
| 6784 char * | |
| 6785 ns_fname(char *tag) | |
| 6786 { char *s; | |
| 6787 size_t i; | |
| 6788 s = emalloc(strlen(tag) + 1); | |
| 6789 strcpy(s, tag); | |
| 6790 for (i = 0; s[i]; i++) | |
| 6791 if (!isalnum(s[i])) | |
| 6792 s[i] = '_'; | |
| 6793 return s; | |
| 6794 } | |
| 6795 | |
| 6796 char * | |
| 6797 ns_remove(char *tag) | |
| 6798 { return ns_convert(ns_name(tag)); | |
| 6799 } | |
| 6800 | |
| 6801 char * | |
| 6802 ns_remove1(char *tag) | |
| 6803 { char *t, *s = tag; | |
| 6804 int n = 2; | |
| 6805 /* handle 'enum_xx__yy' generated by wsdl2h | |
| 6806 if (!strncmp(s, "enum_", 5)) | |
| 6807 n = 1; | |
| 6808 */ | |
| 6809 if (*s) | |
| 6810 { for (t = s + 1; *t && n; t++) | |
| 6811 if (t[0] == '_' && t[1] == '_') | |
| 6812 { s = t + 2; | |
| 6813 t++; | |
| 6814 n--; | |
| 6815 } | |
| 6816 if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) | |
| 6817 s = tag; | |
| 6818 } | |
| 6819 return s; | |
| 6820 } | |
| 6821 | |
| 6822 char * | |
| 6823 ns_remove2(char *tag) | |
| 6824 { return ns_convert(ns_remove1(tag)); | |
| 6825 } | |
| 6826 | |
| 6827 char * | |
| 6828 xsi_type_cond(Tnode *typ, int flag) | |
| 6829 { if (flag) | |
| 6830 return xsi_type(typ); | |
| 6831 return ""; | |
| 6832 } | |
| 6833 | |
| 6834 char * | |
| 6835 xsi_type_cond_u(Tnode *typ, int flag) | |
| 6836 { if (flag) | |
| 6837 return xsi_type_u(typ); | |
| 6838 return ""; | |
| 6839 } | |
| 6840 | |
| 6841 char * | |
| 6842 xsi_type_u(Tnode *typ) | |
| 6843 { Service *sp; | |
| 6844 char *s = NULL; | |
| 6845 if (tflag) | |
| 6846 return xsi_type(typ); | |
| 6847 if (typ->sym) | |
| 6848 s = prefix_of(typ->sym->name); | |
| 6849 if (!s && typ->id) | |
| 6850 s = prefix_of(typ->id->name); | |
| 6851 if (!s) | |
| 6852 return ""; | |
| 6853 s = xsi_type(typ); | |
| 6854 for (sp = services; sp; sp = sp->next) | |
| 6855 if (sp->xsi_type && has_ns_eq(sp->ns, s)) | |
| 6856 return s; | |
| 6857 return ""; | |
| 6858 } | |
| 6859 | |
| 6860 char * | |
| 6861 xsi_type(Tnode *typ) | |
| 6862 { if (!typ) | |
| 6863 return "NULL"; | |
| 6864 if (is_dynamic_array(typ) && !has_ns(typ)) | |
| 6865 return xsi_type_Darray(typ); | |
| 6866 if (typ->type == Tarray) | |
| 6867 return xsi_type_Tarray(typ); | |
| 6868 if (is_untyped(typ)) | |
| 6869 return ""; | |
| 6870 if (typ->sym) | |
| 6871 { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) | |
| 6872 return ""; | |
| 6873 if (is_XML(typ)) | |
| 6874 return "xsd:anyType"; | |
| 6875 if (typ->type != Ttemplate) | |
| 6876 return ns_convert(typ->sym->name); | |
| 6877 } | |
| 6878 if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) | |
| 6879 return "xsd:string"; | |
| 6880 switch(typ->type){ | |
| 6881 case Tchar: | |
| 6882 return "xsd:byte"; | |
| 6883 case Twchar: | |
| 6884 return "wchar"; | |
| 6885 case Tshort: | |
| 6886 return "xsd:short"; | |
| 6887 case Tint: | |
| 6888 return "xsd:int"; | |
| 6889 case Tlong: | |
| 6890 case Tllong: | |
| 6891 return "xsd:long"; | |
| 6892 case Tfloat: | |
| 6893 return "xsd:float"; | |
| 6894 case Tdouble: | |
| 6895 return "xsd:double"; | |
| 6896 case Tldouble: | |
| 6897 return "xsd:decimal"; | |
| 6898 case Tuchar: | |
| 6899 return "xsd:unsignedByte"; | |
| 6900 case Tushort: | |
| 6901 return "xsd:unsignedShort"; | |
| 6902 case Tuint: | |
| 6903 return "xsd:unsignedInt"; | |
| 6904 case Tulong: | |
| 6905 case Tullong: | |
| 6906 return "xsd:unsignedLong"; | |
| 6907 case Ttime: | |
| 6908 return "xsd:dateTime"; | |
| 6909 case Tpointer: | |
| 6910 case Treference: | |
| 6911 return xsi_type((Tnode*)typ->ref); | |
| 6912 case Tenum: | |
| 6913 if ((Table*)typ->ref == booltable) | |
| 6914 return "xsd:boolean"; | |
| 6915 case Tstruct: | |
| 6916 case Tclass: | |
| 6917 if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) | |
| 6918 return ""; | |
| 6919 return ns_convert(typ->id->name); | |
| 6920 case Ttemplate: | |
| 6921 if ((Tnode*)typ->ref) | |
| 6922 return xsi_type((Tnode*)typ->ref); | |
| 6923 break; | |
| 6924 default: | |
| 6925 break; | |
| 6926 } | |
| 6927 return ""; | |
| 6928 } | |
| 6929 | |
| 6930 char * | |
| 6931 xml_tag(Tnode *typ) | |
| 6932 { if (!typ) | |
| 6933 return "NULL"; | |
| 6934 if (typ->type == Tpointer || typ->type == Treference) | |
| 6935 return xml_tag((Tnode*)typ->ref); | |
| 6936 if (typ->sym) | |
| 6937 return ns_convert(typ->sym->name); | |
| 6938 return the_type(typ); | |
| 6939 } | |
| 6940 | |
| 6941 char * | |
| 6942 wsdl_type(Tnode *typ, char *ns) | |
| 6943 { if (!typ) | |
| 6944 return "NULL"; | |
| 6945 if ((is_qname(typ) || is_stdqname(typ)) && ns) | |
| 6946 return "xsd:QName"; | |
| 6947 if (typ->sym) | |
| 6948 { if (is_XML(typ)) | |
| 6949 return "xsd:anyType"; | |
| 6950 else if (ns) | |
| 6951 return ns_convert(typ->sym->name); | |
| 6952 else | |
| 6953 return ns_remove(typ->sym->name); | |
| 6954 } | |
| 6955 return base_type(typ, ns); | |
| 6956 } | |
| 6957 | |
| 6958 char * | |
| 6959 base_type(Tnode *typ, char *ns) | |
| 6960 { int d; | |
| 6961 char *s, *t; | |
| 6962 if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) | |
| 6963 { if (ns) | |
| 6964 return "xsd:string"; | |
| 6965 return "string"; | |
| 6966 } | |
| 6967 if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) | |
| 6968 { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); | |
| 6969 if (ns && *ns) | |
| 6970 { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); | |
| 6971 strcpy(t, ns_convert(ns)); | |
| 6972 strcat(t, ":"); | |
| 6973 strcat(t, "ArrayOf"); | |
| 6974 } | |
| 6975 else | |
| 6976 { t = (char*)emalloc(strlen(s)+12); | |
| 6977 strcpy(t, "ArrayOf"); | |
| 6978 } | |
| 6979 strcat(t, s); | |
| 6980 d = get_Darraydims(typ); | |
| 6981 if (d) | |
| 6982 sprintf(t+strlen(t), "%dD", d); | |
| 6983 return t; | |
| 6984 } | |
| 6985 switch (typ->type){ | |
| 6986 case Tchar : | |
| 6987 if (ns) | |
| 6988 return "xsd:byte"; | |
| 6989 return "byte"; | |
| 6990 case Twchar : | |
| 6991 if (ns) | |
| 6992 return "xsd:wchar"; | |
| 6993 return "wchar"; | |
| 6994 case Tshort : | |
| 6995 if (ns) | |
| 6996 return "xsd:short"; | |
| 6997 return "short"; | |
| 6998 case Tint : | |
| 6999 if (ns) | |
| 7000 return "xsd:int"; | |
| 7001 return "int"; | |
| 7002 case Tlong : | |
| 7003 case Tllong : | |
| 7004 if (ns) | |
| 7005 return "xsd:long"; | |
| 7006 return "long"; | |
| 7007 case Tfloat: | |
| 7008 if (ns) | |
| 7009 return "xsd:float"; | |
| 7010 return "float"; | |
| 7011 case Tdouble: | |
| 7012 if (ns) | |
| 7013 return "xsd:double"; | |
| 7014 return "double"; | |
| 7015 case Tldouble: | |
| 7016 if (ns) | |
| 7017 return "xsd:decimal"; | |
| 7018 return "decimal"; | |
| 7019 case Tuchar: | |
| 7020 if (ns) | |
| 7021 return "xsd:unsignedByte"; | |
| 7022 return "unsignedByte"; | |
| 7023 case Tushort: | |
| 7024 if (ns) | |
| 7025 return "xsd:unsignedShort"; | |
| 7026 return "unsignedShort"; | |
| 7027 case Tuint: | |
| 7028 if (ns) | |
| 7029 return "xsd:unsignedInt"; | |
| 7030 return "unsignedInt"; | |
| 7031 case Tulong: | |
| 7032 case Tullong: | |
| 7033 if (ns) | |
| 7034 return "xsd:unsignedLong"; | |
| 7035 return "unsignedLong"; | |
| 7036 case Ttime: | |
| 7037 if (ns) | |
| 7038 return "xsd:dateTime"; | |
| 7039 return "dateTime"; | |
| 7040 case Tpointer: | |
| 7041 case Treference: | |
| 7042 return wsdl_type((Tnode*)typ->ref, ns); | |
| 7043 case Tarray: | |
| 7044 if (is_fixedstring(typ)) | |
| 7045 { if (typ->sym) | |
| 7046 { if (ns) | |
| 7047 return ns_convert(typ->sym->name); | |
| 7048 return ns_remove(typ->sym->name); | |
| 7049 } | |
| 7050 if (ns) | |
| 7051 return "xsd:string"; | |
| 7052 return "string"; | |
| 7053 } | |
| 7054 if (ns && *ns) | |
| 7055 { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2)*sizeof(char)); | |
| 7056 strcpy(s, ns_convert(ns)); | |
| 7057 strcat(s, ":"); | |
| 7058 strcat(s, c_ident(typ)); | |
| 7059 return s; | |
| 7060 } | |
| 7061 else | |
| 7062 return c_ident(typ); | |
| 7063 case Tenum: | |
| 7064 if ((Table*)typ->ref == booltable) | |
| 7065 { if (ns) | |
| 7066 return "xsd:boolean"; | |
| 7067 return "boolean"; | |
| 7068 } | |
| 7069 case Tstruct: | |
| 7070 case Tclass: | |
| 7071 if (!has_ns(typ) && ns && *ns) | |
| 7072 { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2)*sizeof(char)); | |
| 7073 strcpy(s, ns_convert(ns)); | |
| 7074 strcat(s, ":"); | |
| 7075 strcat(s, ns_convert(typ->id->name)); | |
| 7076 return s; | |
| 7077 } | |
| 7078 else if (ns) | |
| 7079 return ns_convert(typ->id->name); | |
| 7080 else | |
| 7081 return ns_remove(typ->id->name); | |
| 7082 case Tunion: | |
| 7083 if (ns) | |
| 7084 return "xsd:choice"; | |
| 7085 return "choice"; | |
| 7086 case Ttemplate: | |
| 7087 if ((Tnode*)typ->ref) | |
| 7088 return wsdl_type((Tnode*)typ->ref, ns); | |
| 7089 break; | |
| 7090 default: | |
| 7091 break; | |
| 7092 } | |
| 7093 return ""; | |
| 7094 } | |
| 7095 | |
| 7096 char * | |
| 7097 the_type(Tnode *typ) | |
| 7098 { if (!typ) | |
| 7099 return "NULL"; | |
| 7100 if (typ->type == Tarray || (is_dynamic_array(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) | |
| 7101 return "SOAP-ENC:Array"; | |
| 7102 if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) | |
| 7103 return "string"; | |
| 7104 switch (typ->type) | |
| 7105 { | |
| 7106 case Tchar: | |
| 7107 return "byte"; | |
| 7108 case Twchar: | |
| 7109 return "wchar"; | |
| 7110 case Tshort: | |
| 7111 return "short"; | |
| 7112 case Tint : | |
| 7113 return "int"; | |
| 7114 case Tlong : | |
| 7115 case Tllong : | |
| 7116 return "long"; | |
| 7117 case Tfloat: | |
| 7118 return "float"; | |
| 7119 case Tdouble: | |
| 7120 return "double"; | |
| 7121 case Tldouble: | |
| 7122 return "decimal"; | |
| 7123 case Tuchar: | |
| 7124 return "unsignedByte"; | |
| 7125 case Tushort: | |
| 7126 return "unsignedShort"; | |
| 7127 case Tuint: | |
| 7128 return "unsignedInt"; | |
| 7129 case Tulong: | |
| 7130 case Tullong: | |
| 7131 return "unsignedLong"; | |
| 7132 case Ttime: | |
| 7133 return "dateTime"; | |
| 7134 case Tpointer: | |
| 7135 case Treference: | |
| 7136 return the_type((Tnode*)typ->ref); | |
| 7137 case Tarray: | |
| 7138 return "SOAP-ENC:Array"; | |
| 7139 case Tenum: | |
| 7140 if ((Table*)typ->ref == booltable) | |
| 7141 return "boolean"; | |
| 7142 case Tstruct: | |
| 7143 case Tclass: | |
| 7144 return ns_convert(typ->id->name); | |
| 7145 default: | |
| 7146 break; | |
| 7147 } | |
| 7148 return ""; | |
| 7149 } | |
| 7150 | |
| 7151 /* c_type returns the type to be used in parameter declaration*/ | |
| 7152 char * | |
| 7153 c_type(Tnode *typ) | |
| 7154 { | |
| 7155 char *p, *q, tempBuf[10]; | |
| 7156 Tnode *temp; | |
| 7157 if (typ==0) | |
| 7158 return "NULL"; | |
| 7159 switch(typ->type){ | |
| 7160 case Tnone: | |
| 7161 return ""; | |
| 7162 case Tvoid: | |
| 7163 return "void"; | |
| 7164 case Tchar: | |
| 7165 return "char"; | |
| 7166 case Twchar: | |
| 7167 return "wchar_t"; | |
| 7168 case Tshort: | |
| 7169 return "short"; | |
| 7170 case Tint : | |
| 7171 return "int"; | |
| 7172 case Tlong : | |
| 7173 return "long"; | |
| 7174 case Tllong : | |
| 7175 return "LONG64"; | |
| 7176 case Tfloat: | |
| 7177 return "float"; | |
| 7178 case Tdouble: | |
| 7179 return "double"; | |
| 7180 case Tldouble: | |
| 7181 return "long double"; | |
| 7182 case Tuchar: | |
| 7183 return "unsigned char"; | |
| 7184 case Tushort: | |
| 7185 return "unsigned short"; | |
| 7186 case Tuint: | |
| 7187 return "unsigned int"; | |
| 7188 case Tulong: | |
| 7189 return "unsigned long"; | |
| 7190 case Tullong: | |
| 7191 return "ULONG64"; | |
| 7192 case Ttime: | |
| 7193 return "time_t"; | |
| 7194 case Tstruct: | |
| 7195 p = (char*) emalloc((8+strlen(ident(typ->id->name))) *sizeof(char)); | |
| 7196 strcpy(p, "struct "); | |
| 7197 strcat(p, ident(typ->id->name)); | |
| 7198 break; | |
| 7199 case Tclass: | |
| 7200 p = ident(typ->id->name); | |
| 7201 break; | |
| 7202 case Tunion: p=(char*) emalloc((7+strlen(ident(typ->id->name))) *sizeof(char)); | |
| 7203 strcpy(p, "union "); | |
| 7204 strcat(p, ident(typ->id->name)); | |
| 7205 break; | |
| 7206 case Tenum: | |
| 7207 if ((Table*)typ->ref == booltable) | |
| 7208 return "bool"; | |
| 7209 p=(char*) emalloc((6+strlen(ident(typ->id->name))) *sizeof(char)); | |
| 7210 strcpy(p, "enum "); | |
| 7211 strcat(p, ident(typ->id->name)); | |
| 7212 break; | |
| 7213 case Tpointer: | |
| 7214 p = c_type_id((Tnode*)typ->ref, "*"); | |
| 7215 break; | |
| 7216 case Treference: | |
| 7217 p = c_type_id((Tnode*)typ->ref, "&"); | |
| 7218 break; | |
| 7219 case Tarray: | |
| 7220 temp = typ; | |
| 7221 while(((Tnode*) (typ->ref))->type==Tarray){ | |
| 7222 typ = (Tnode*)typ->ref; | |
| 7223 } | |
| 7224 p=(char*) emalloc((12+strlen(q = c_type((Tnode*)typ->ref))) *sizeof(char)); | |
| 7225 if (((Tnode*)typ->ref)->type == Tpointer) | |
| 7226 sprintf(p,"%s",c_type((Tnode*)typ->ref)); | |
| 7227 else | |
| 7228 strcpy(p, q); | |
| 7229 typ = temp; | |
| 7230 while(typ->type==Tarray){ | |
| 7231 if (((Tnode*) typ->ref)->width) | |
| 7232 { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width)); | |
| 7233 strcat(p,tempBuf); | |
| 7234 } | |
| 7235 typ = (Tnode*)typ->ref; | |
| 7236 } | |
| 7237 break; | |
| 7238 case Ttemplate: | |
| 7239 if (typ->ref) | |
| 7240 { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+4) *sizeof(char)); | |
| 7241 strcpy(p, ident(typ->id->name)); | |
| 7242 strcat(p, "<"); | |
| 7243 strcat(p, q); | |
| 7244 strcat(p, " >"); | |
| 7245 break; | |
| 7246 } | |
| 7247 default: | |
| 7248 return "UnknownType"; | |
| 7249 } | |
| 7250 return p; | |
| 7251 } | |
| 7252 | |
| 7253 char * | |
| 7254 c_storage(Storage sto) | |
| 7255 { char *p; | |
| 7256 static char buf[256]; | |
| 7257 if (sto & Sconst) | |
| 7258 { p = c_storage(sto & ~Sconst); | |
| 7259 strcat(p, "const "); | |
| 7260 return p; | |
| 7261 } | |
| 7262 if (sto & Sconstptr) | |
| 7263 { p = c_storage(sto & ~Sconstptr); | |
| 7264 strcat(p, "const "); | |
| 7265 return p; | |
| 7266 } | |
| 7267 if (sto & Sauto) | |
| 7268 { p = c_storage(sto & ~Sauto); | |
| 7269 strcat(p, "auto "); | |
| 7270 return p; | |
| 7271 } | |
| 7272 if (sto & Sregister) | |
| 7273 { p = c_storage(sto & ~Sregister); | |
| 7274 strcat(p, "register "); | |
| 7275 return p; | |
| 7276 } | |
| 7277 if (sto & Sstatic) | |
| 7278 { p = c_storage(sto & ~Sstatic); | |
| 7279 strcat(p, "static "); | |
| 7280 return p; | |
| 7281 } | |
| 7282 if (sto & Sexplicit) | |
| 7283 { p = c_storage(sto & ~Sexplicit); | |
| 7284 strcat(p, "explicit "); | |
| 7285 return p; | |
| 7286 } | |
| 7287 if (sto & Sextern) | |
| 7288 { p = c_storage(sto & ~Sextern); | |
| 7289 return p; | |
| 7290 } | |
| 7291 if (sto & Stypedef) | |
| 7292 { p = c_storage(sto & ~Stypedef); | |
| 7293 strcat(p, "typedef "); | |
| 7294 return p; | |
| 7295 } | |
| 7296 if (sto & Svirtual) | |
| 7297 { p = c_storage(sto & ~Svirtual); | |
| 7298 strcat(p, "virtual "); | |
| 7299 return p; | |
| 7300 } | |
| 7301 if (sto & Sfriend) | |
| 7302 { p = c_storage(sto & ~Sfriend); | |
| 7303 strcat(p, "friend "); | |
| 7304 return p; | |
| 7305 } | |
| 7306 if (sto & Sinline) | |
| 7307 { p = c_storage(sto & ~Sinline); | |
| 7308 strcat(p, "inline "); | |
| 7309 return p; | |
| 7310 } | |
| 7311 buf[0]= '\0'; | |
| 7312 return buf; | |
| 7313 } | |
| 7314 | |
| 7315 char * | |
| 7316 c_init(Entry *e) | |
| 7317 { static char buf[1024]; | |
| 7318 buf[0] = '\0'; | |
| 7319 if (e && e->info.hasval) | |
| 7320 { switch (e->info.typ->type) | |
| 7321 { case Tchar: | |
| 7322 case Twchar: | |
| 7323 case Tuchar: | |
| 7324 case Tshort: | |
| 7325 case Tushort: | |
| 7326 case Tint: | |
| 7327 case Tuint: | |
| 7328 case Ttime: | |
| 7329 sprintf(buf, " = " SOAP_LONG_FORMAT, e->info.val.i); | |
| 7330 break; | |
| 7331 case Tlong: | |
| 7332 sprintf(buf, " = " SOAP_LONG_FORMAT "L", e->info.val.i); | |
| 7333 break; | |
| 7334 case Tulong: | |
| 7335 sprintf(buf, " = " SOAP_LONG_FORMAT "UL", e->info.val.i); | |
| 7336 break; | |
| 7337 case Tllong: | |
| 7338 sprintf(buf, " = " SOAP_LONG_FORMAT "LL", e->info.val.i); | |
| 7339 break; | |
| 7340 case Tullong: | |
| 7341 sprintf(buf, " = " SOAP_LONG_FORMAT "ULL", e->info.val.i); | |
| 7342 break; | |
| 7343 case Tfloat: | |
| 7344 case Tdouble: | |
| 7345 sprintf(buf, " = %g", e->info.val.r); | |
| 7346 break; | |
| 7347 case Tldouble: | |
| 7348 sprintf(buf, " = %gL", e->info.val.r); | |
| 7349 break; | |
| 7350 case Tenum: | |
| 7351 if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) | |
| 7352 sprintf(buf, " = (%s)" SOAP_LONG_FORMAT, c_type(e->info.typ), e->info.val.i); | |
| 7353 else | |
| 7354 sprintf(buf, " = (%s)" SOAP_LONG_FORMAT "LL", c_type(e->info.typ), e->info.val.i); | |
| 7355 break; | |
| 7356 default: | |
| 7357 if (is_stdstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) | |
| 7358 sprintf(buf, " = \"%s\"", cstring(e->info.val.s)); | |
| 7359 else if (is_stdwstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) | |
| 7360 sprintf(buf, " = L\"%s\"", cstring(e->info.val.s)); | |
| 7361 else if (is_wstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) | |
| 7362 sprintf(buf, " = (wchar_t*)L\"%s\"", cstring(e->info.val.s)); | |
| 7363 else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) | |
| 7364 sprintf(buf, " = (char*)\"%s\"", cstring(e->info.val.s)); | |
| 7365 else if (e->info.typ->type == Tpointer) | |
| 7366 sprintf(buf, " = NULL"); | |
| 7367 break; | |
| 7368 } | |
| 7369 } | |
| 7370 return buf; | |
| 7371 } | |
| 7372 | |
| 7373 /* c_type_id returns the type to be used in parameter declaration */ | |
| 7374 char * | |
| 7375 c_type_id(Tnode *typ, char *name) | |
| 7376 { | |
| 7377 char *id,*p,*q,tempBuf[10]; | |
| 7378 Tnode *temp; | |
| 7379 Entry *e; | |
| 7380 if (!typ) | |
| 7381 return "NULL"; | |
| 7382 id = ident(name); | |
| 7383 switch(typ->type) | |
| 7384 { | |
| 7385 case Tnone: | |
| 7386 p = id; | |
| 7387 break; | |
| 7388 case Tvoid: | |
| 7389 p = (char*)emalloc(6+strlen(id)); | |
| 7390 strcpy(p, "void "); | |
| 7391 strcat(p, id); | |
| 7392 break; | |
| 7393 case Tchar: | |
| 7394 p = (char*)emalloc(6+strlen(id)); | |
| 7395 strcpy(p, "char "); | |
| 7396 strcat(p, id); | |
| 7397 break; | |
| 7398 case Twchar: | |
| 7399 p = (char*)emalloc(9+strlen(id)); | |
| 7400 strcpy(p, "wchar_t "); | |
| 7401 strcat(p, id); | |
| 7402 break; | |
| 7403 case Tshort: | |
| 7404 p = (char*)emalloc(7+strlen(id)); | |
| 7405 strcpy(p, "short "); | |
| 7406 strcat(p, id); | |
| 7407 break; | |
| 7408 case Tint : | |
| 7409 p = (char*)emalloc(5+strlen(id)); | |
| 7410 strcpy(p, "int "); | |
| 7411 strcat(p, id); | |
| 7412 break; | |
| 7413 case Tlong : | |
| 7414 p = (char*)emalloc(6+strlen(id)); | |
| 7415 strcpy(p, "long "); | |
| 7416 strcat(p, id); | |
| 7417 break; | |
| 7418 case Tllong : | |
| 7419 p = (char*)emalloc(8+strlen(id)); | |
| 7420 strcpy(p, "LONG64 "); | |
| 7421 strcat(p, id); | |
| 7422 break; | |
| 7423 case Tfloat: | |
| 7424 p = (char*)emalloc(7+strlen(id)); | |
| 7425 strcpy(p, "float "); | |
| 7426 strcat(p, id); | |
| 7427 break; | |
| 7428 case Tdouble: | |
| 7429 p = (char*)emalloc(8+strlen(id)); | |
| 7430 strcpy(p, "double "); | |
| 7431 strcat(p, id); | |
| 7432 break; | |
| 7433 case Tldouble: | |
| 7434 p = (char*)emalloc(13+strlen(id)); | |
| 7435 strcpy(p, "long double "); | |
| 7436 strcat(p, id); | |
| 7437 break; | |
| 7438 case Tuchar: | |
| 7439 p = (char*)emalloc(15+strlen(id)); | |
| 7440 strcpy(p, "unsigned char "); | |
| 7441 strcat(p, id); | |
| 7442 break; | |
| 7443 case Tushort: | |
| 7444 p = (char*)emalloc(16+strlen(id)); | |
| 7445 strcpy(p, "unsigned short "); | |
| 7446 strcat(p, id); | |
| 7447 break; | |
| 7448 case Tuint: | |
| 7449 p = (char*)emalloc(14+strlen(id)); | |
| 7450 strcpy(p, "unsigned int "); | |
| 7451 strcat(p, id); | |
| 7452 break; | |
| 7453 case Tulong: | |
| 7454 p = (char*)emalloc(15+strlen(id)); | |
| 7455 strcpy(p, "unsigned long "); | |
| 7456 strcat(p, id); | |
| 7457 break; | |
| 7458 case Tullong: | |
| 7459 p = (char*)emalloc(9+strlen(id)); | |
| 7460 strcpy(p, "ULONG64 "); | |
| 7461 strcat(p, id); | |
| 7462 break; | |
| 7463 case Ttime: | |
| 7464 p = (char*)emalloc(8+strlen(id)); | |
| 7465 strcpy(p, "time_t "); | |
| 7466 strcat(p, id); | |
| 7467 break; | |
| 7468 case Tstruct: | |
| 7469 p=(char*) emalloc((9+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); | |
| 7470 strcpy(p, "struct "); | |
| 7471 strcat(p, ident(typ->id->name)); | |
| 7472 strcat(p, " "); | |
| 7473 strcat(p, id); | |
| 7474 break; | |
| 7475 case Tclass: | |
| 7476 if (!typ->classed && !is_imported(typ)) | |
| 7477 { p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); | |
| 7478 strcpy(p, "class "); | |
| 7479 strcat(p, ident(typ->id->name)); | |
| 7480 typ->classed = True; | |
| 7481 } | |
| 7482 else | |
| 7483 { p=(char*) emalloc((2+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); | |
| 7484 strcpy(p, ident(typ->id->name)); | |
| 7485 } | |
| 7486 strcat(p, " "); | |
| 7487 strcat(p, id); | |
| 7488 break; | |
| 7489 case Tunion: | |
| 7490 p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); | |
| 7491 strcpy(p, "union "); | |
| 7492 strcat(p, ident(typ->id->name)); | |
| 7493 strcat(p, " "); | |
| 7494 strcat(p, id); | |
| 7495 break; | |
| 7496 case Tenum: | |
| 7497 if ((Table*)typ->ref == booltable) | |
| 7498 { p = (char*)emalloc((strlen(id)+6)*sizeof(char)); | |
| 7499 strcpy(p, "bool "); | |
| 7500 strcat(p, id); | |
| 7501 return p; | |
| 7502 } | |
| 7503 p=(char*) emalloc((7+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); | |
| 7504 strcpy(p, "enum "); | |
| 7505 strcat(p, ident(typ->id->name)); | |
| 7506 strcat(p, " "); | |
| 7507 strcat(p, id); | |
| 7508 break; | |
| 7509 case Tpointer: | |
| 7510 p = (char*)emalloc(strlen(id)+2); | |
| 7511 strcpy(p+1, id); | |
| 7512 p[0] = '*'; | |
| 7513 p = c_type_id((Tnode*)typ->ref, p); | |
| 7514 break; | |
| 7515 case Treference: | |
| 7516 p = (char*)emalloc(strlen(id)+2); | |
| 7517 strcpy(p+1, id); | |
| 7518 p[0] = '&'; | |
| 7519 p = c_type_id((Tnode*)typ->ref, p); | |
| 7520 break; | |
| 7521 case Tarray: | |
| 7522 temp = typ; | |
| 7523 while(((Tnode*) (typ->ref))->type==Tarray){ | |
| 7524 typ = (Tnode*)typ->ref; | |
| 7525 } | |
| 7526 p=(char*) emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) *sizeof(char)); | |
| 7527 strcpy(p, q); | |
| 7528 typ = temp; | |
| 7529 while(typ->type==Tarray){ | |
| 7530 if (((Tnode*) typ->ref)->width) | |
| 7531 { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width)); | |
| 7532 strcat(p,tempBuf); | |
| 7533 } | |
| 7534 typ = (Tnode*)typ->ref; | |
| 7535 } | |
| 7536 /*if(((Tnode*) (typ->ref))->type==Tarray){ | |
| 7537 sprintf(p,"%s [%d]",c_type((Tnode*)typ->ref),(typ->width / ((Tnode*) typ->ref)->width)); | |
| 7538 }else | |
| 7539 sprintf(p,"%s a[%d]",c_type((Tnode*)typ->ref),(typ->width /((Tnode*) typ->ref)->width));*/ | |
| 7540 break; | |
| 7541 case Tfun: | |
| 7542 if (strncmp(id, "operator ", 9)) | |
| 7543 q = c_type_id(((FNinfo*)typ->ref)->ret, id); | |
| 7544 else | |
| 7545 q = id; | |
| 7546 p = (char*)emalloc(1024); | |
| 7547 strcpy(p, q); | |
| 7548 strcat(p, "("); | |
| 7549 for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) | |
| 7550 { strcat(p, c_storage(e->info.sto)); | |
| 7551 if (e->info.typ->type != Tvoid) | |
| 7552 { strcat(p, c_type_id(e->info.typ, e->sym->name)); | |
| 7553 strcat(p, c_init(e)); | |
| 7554 } | |
| 7555 else | |
| 7556 strcat(p, "void"); | |
| 7557 if (e->next) | |
| 7558 strcat(p, ", "); | |
| 7559 } | |
| 7560 strcat(p, ")"); | |
| 7561 break; | |
| 7562 case Ttemplate: | |
| 7563 if (typ->ref) | |
| 7564 { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) *sizeof(char)); | |
| 7565 strcpy(p, ident(typ->id->name)); | |
| 7566 strcat(p, "<"); | |
| 7567 strcat(p, q); | |
| 7568 strcat(p, " >"); | |
| 7569 strcat(p, id); | |
| 7570 break; | |
| 7571 } | |
| 7572 default: | |
| 7573 return "UnknownType"; | |
| 7574 } | |
| 7575 return p; | |
| 7576 } | |
| 7577 | |
| 7578 char * | |
| 7579 xsi_type_Tarray(Tnode *typ) | |
| 7580 { Tnode *t; | |
| 7581 int cardinality; | |
| 7582 char *p, *s; | |
| 7583 t = (Tnode*)typ->ref; | |
| 7584 if (is_fixedstring(typ)) | |
| 7585 { if (typ->sym) | |
| 7586 return ns_convert(typ->sym->name); | |
| 7587 return "xsd:string"; | |
| 7588 } | |
| 7589 cardinality = 1; | |
| 7590 while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ))) | |
| 7591 { if( t->type == Tarray) | |
| 7592 t = (Tnode*)t->ref; | |
| 7593 else | |
| 7594 t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; | |
| 7595 cardinality++; | |
| 7596 } | |
| 7597 s = xsi_type(t); | |
| 7598 if (!*s) | |
| 7599 s = wsdl_type(t, ""); | |
| 7600 p = (char*)emalloc(strlen(s)+cardinality+3); | |
| 7601 strcpy(p, s); | |
| 7602 if (cardinality > 1) | |
| 7603 { strcat(p, "["); | |
| 7604 for (; cardinality > 2; cardinality--) | |
| 7605 strcat(p, ","); | |
| 7606 strcat(p, "]"); | |
| 7607 } | |
| 7608 return p; | |
| 7609 } | |
| 7610 | |
| 7611 char * | |
| 7612 xsi_type_Darray(Tnode *typ) | |
| 7613 { Tnode *t; | |
| 7614 Entry *q; | |
| 7615 int cardinality; | |
| 7616 char *p, *s; | |
| 7617 if (!typ->ref) | |
| 7618 return ""; | |
| 7619 q = ((Table*)typ->ref)->list; | |
| 7620 while (q && q->info.typ->type == Tfun) | |
| 7621 q = q->next; | |
| 7622 t = (Tnode*)q->info.typ->ref; | |
| 7623 cardinality = 1; | |
| 7624 while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ))) | |
| 7625 { if (t->type == Tarray) | |
| 7626 t = (Tnode*)t->ref; | |
| 7627 else | |
| 7628 { q = ((Table*)t->ref)->list; | |
| 7629 while (q && q->info.typ->type == Tfun) | |
| 7630 q = q->next; | |
| 7631 t = (Tnode*)q->info.typ->ref; | |
| 7632 } | |
| 7633 cardinality++; | |
| 7634 } | |
| 7635 s = xsi_type(t); | |
| 7636 if (!*s) | |
| 7637 s = wsdl_type(t, ""); | |
| 7638 p = (char*)emalloc(strlen(s)+cardinality*2+1); | |
| 7639 strcpy(p, s); | |
| 7640 if (cardinality > 1) | |
| 7641 { strcat(p, "["); | |
| 7642 for (; cardinality > 2; cardinality--) | |
| 7643 strcat(p, ","); | |
| 7644 strcat(p, "]"); | |
| 7645 } | |
| 7646 return p; | |
| 7647 } | |
| 7648 | |
| 7649 void | |
| 7650 generate(Tnode *typ) | |
| 7651 { | |
| 7652 if (kflag && is_XML(typ)) | |
| 7653 { soap_traverse(typ); | |
| 7654 return; | |
| 7655 } | |
| 7656 if (is_transient(typ) || typ->type == Twchar || is_XML(typ) || is_void(typ)) | |
| 7657 return; | |
| 7658 | |
| 7659 if (lflag && typ->type == Tint && !typ->sym) | |
| 7660 { fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); | |
| 7661 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); | |
| 7662 fprintf(fhead,"\n#endif"); | |
| 7663 fprintf(fhead,"\n\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); | |
| 7664 fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); | |
| 7665 fprintf(fhead,"\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); | |
| 7666 return; /* do not generate int serializers in libs */ | |
| 7667 } | |
| 7668 else if (is_imported(typ) && (typ->type != Tint || typ->sym)) | |
| 7669 return; | |
| 7670 if (is_typedef(typ) && is_element(typ)) | |
| 7671 fprintf(fhead,"\n\n/* %s is a typedef element/attribute synonym for %s */", c_ident(typ), t_ident(typ)); | |
| 7672 if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) | |
| 7673 { if (!Qflag && is_external(typ) && namespaceid) | |
| 7674 { char *id = namespaceid; | |
| 7675 fprintf(fhead,"\n\n}"); | |
| 7676 fprintf(fout,"\n\n}"); | |
| 7677 namespaceid = NULL; | |
| 7678 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); | |
| 7679 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); | |
| 7680 fprintf(fhead,"\n#endif"); | |
| 7681 namespaceid = id; | |
| 7682 } | |
| 7683 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); | |
| 7684 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); | |
| 7685 fprintf(fhead,"\n#endif"); | |
| 7686 fflush(fhead); | |
| 7687 soap_default(typ); | |
| 7688 soap_serialize(typ); | |
| 7689 if (kflag) | |
| 7690 soap_traverse(typ); | |
| 7691 soap_out(typ); | |
| 7692 soap_in(typ); | |
| 7693 if (!Qflag && is_external(typ) && namespaceid) | |
| 7694 { fprintf(fhead,"\n\nnamespace %s {", namespaceid); | |
| 7695 fprintf(fout,"\n\nnamespace %s {", namespaceid); | |
| 7696 } | |
| 7697 soap_put(typ); | |
| 7698 soap_get(typ); | |
| 7699 return; | |
| 7700 } | |
| 7701 switch(typ->type) | |
| 7702 { | |
| 7703 case Ttemplate: | |
| 7704 case Tenum: | |
| 7705 case Tpointer: | |
| 7706 case Tarray: | |
| 7707 case Tstruct: | |
| 7708 case Tclass: | |
| 7709 case Tunion: | |
| 7710 if (is_header_or_fault(typ) || is_body(typ)) | |
| 7711 { fprintf(fhead,"\n\n#ifndef WITH_NOGLOBAL"); | |
| 7712 fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL"); | |
| 7713 } | |
| 7714 if (!Qflag && is_external(typ) && namespaceid) | |
| 7715 { char *id = namespaceid; | |
| 7716 fprintf(fhead,"\n\n}"); | |
| 7717 fprintf(fout,"\n\n}"); | |
| 7718 namespaceid = NULL; | |
| 7719 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); | |
| 7720 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); | |
| 7721 fprintf(fhead,"\n#endif"); | |
| 7722 namespaceid = id; | |
| 7723 } | |
| 7724 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); | |
| 7725 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); | |
| 7726 fprintf(fhead,"\n#endif"); | |
| 7727 fflush(fhead); | |
| 7728 soap_default(typ); | |
| 7729 soap_serialize(typ); | |
| 7730 if (kflag) | |
| 7731 soap_traverse(typ); | |
| 7732 soap_out(typ); | |
| 7733 soap_in(typ); | |
| 7734 if (!Qflag && is_external(typ) && namespaceid) | |
| 7735 { fprintf(fhead,"\n\nnamespace %s {", namespaceid); | |
| 7736 fprintf(fout,"\n\nnamespace %s {", namespaceid); | |
| 7737 } | |
| 7738 soap_put(typ); | |
| 7739 soap_get(typ); | |
| 7740 if (typ->type == Tstruct || typ->type == Tclass || typ->type == Ttemplate) | |
| 7741 soap_instantiate_class(typ); | |
| 7742 if (is_header_or_fault(typ) || is_body(typ)) | |
| 7743 { fprintf(fhead,"\n\n#endif"); | |
| 7744 fprintf(fout,"\n\n#endif"); | |
| 7745 } | |
| 7746 break; | |
| 7747 default: | |
| 7748 break; | |
| 7749 } | |
| 7750 } | |
| 7751 | |
| 7752 void | |
| 7753 matlab_gen_sparseStruct(void) | |
| 7754 { | |
| 7755 fprintf(fmheader,"\nstruct soapSparseArray{\n"); | |
| 7756 fprintf(fmheader," int *ir;\n"); | |
| 7757 fprintf(fmheader," int *jc;\n"); | |
| 7758 fprintf(fmheader," double *pr;\n"); | |
| 7759 fprintf(fmheader," int num_columns;\n"); | |
| 7760 fprintf(fmheader," int num_rows;\n"); | |
| 7761 fprintf(fmheader," int nzmax;\n"); | |
| 7762 fprintf(fmheader,"};\n"); | |
| 7763 } | |
| 7764 | |
| 7765 void | |
| 7766 matlab_c_to_mx_sparse(void) | |
| 7767 { | |
| 7768 fprintf(fmheader,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); | |
| 7769 fprintf(fmatlab,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); | |
| 7770 fprintf(fmatlab,"{\n"); | |
| 7771 fprintf(fmatlab," mxArray *b;\n"); | |
| 7772 fprintf(fmatlab," b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); | |
| 7773 fprintf(fmatlab," mxSetIr(b,a.ir);\n"); | |
| 7774 fprintf(fmatlab," mxSetJc(b,a.jc);\n"); | |
| 7775 fprintf(fmatlab," mxSetPr(b,a.pr);\n"); | |
| 7776 fprintf(fmatlab," return b;\n"); | |
| 7777 fprintf(fmatlab,"}\n"); | |
| 7778 } | |
| 7779 | |
| 7780 void | |
| 7781 matlab_mx_to_c_sparse(void) | |
| 7782 { | |
| 7783 fprintf(fmheader,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); | |
| 7784 fprintf(fmatlab,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); | |
| 7785 fprintf(fmatlab,"{\n"); | |
| 7786 fprintf(fmatlab," if(!mxIsSparse(a))\n"); | |
| 7787 fprintf(fmatlab," {\n"); | |
| 7788 fprintf(fmatlab," mexErrMsgTxt(\"Input should be a sparse array.\");\n"); | |
| 7789 fprintf(fmatlab," }\n"); | |
| 7790 | |
| 7791 fprintf(fmatlab," /* Get the starting positions of the data in the sparse array. */ \n"); | |
| 7792 fprintf(fmatlab," b->pr = mxGetPr(a);\n"); | |
| 7793 fprintf(fmatlab," b->ir = mxGetIr(a);\n"); | |
| 7794 fprintf(fmatlab," b->jc = mxGetJc(a);\n"); | |
| 7795 fprintf(fmatlab," b->num_columns = mxGetN(a);\n"); | |
| 7796 fprintf(fmatlab," b->num_rows = mxGetM(a);\n"); | |
| 7797 fprintf(fmatlab," b->nzmax = mxGetNzmax(a);\n"); | |
| 7798 fprintf(fmatlab,"}\n"); | |
| 7799 } | |
| 7800 | |
| 7801 void | |
| 7802 matlab_mx_to_c_dynamicArray(Tnode* typ) | |
| 7803 { | |
| 7804 int d; | |
| 7805 Entry *p; | |
| 7806 | |
| 7807 p = is_dynamic_array(typ); | |
| 7808 | |
| 7809 fprintf(fmatlab,"{\n"); | |
| 7810 fprintf(fmatlab,"\tint i, numdims;\n"); | |
| 7811 fprintf(fmatlab,"\tconst int *dims;\n"); | |
| 7812 fprintf(fmatlab,"\tdouble *temp;\n"); | |
| 7813 fprintf(fmatlab,"\tint size = 1;\n"); | |
| 7814 fprintf(fmatlab,"\tint ret;\n"); | |
| 7815 fprintf(fmatlab,"\tnumdims = mxGetNumberOfDimensions(a);\n"); | |
| 7816 fprintf(fmatlab,"\tdims = mxGetDimensions(a);\n"); | |
| 7817 | |
| 7818 d = get_Darraydims(typ); | |
| 7819 fprintf(fmatlab,"\tif (numdims != %d)\n", d); | |
| 7820 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); | |
| 7821 | |
| 7822 /* | |
| 7823 fprintf(fmatlab,"\tfor(i=0;i<numdims; i++) {\n"); | |
| 7824 fprintf(fmatlab,"\t b->__size[i] = dims[i];\n"); | |
| 7825 fprintf(fmatlab,"\t}\n"); | |
| 7826 */ | |
| 7827 | |
| 7828 if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) | |
| 7829 { | |
| 7830 fprintf(fmatlab,"\ttemp = (double*)mxGetPr(a);\n"); | |
| 7831 fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); | |
| 7832 } | |
| 7833 | |
| 7834 fprintf(fmatlab,"\tfor (i = 0; i < numdims; i++) {\n"); | |
| 7835 fprintf(fmatlab,"\t\tif (b->__size[i] < dims[i])\n"); | |
| 7836 fprintf(fmatlab,"\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); | |
| 7837 fprintf(fmatlab,"\t\tsize *= dims[i];\n"); | |
| 7838 fprintf(fmatlab,"\t}\n"); | |
| 7839 | |
| 7840 if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) | |
| 7841 { | |
| 7842 fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n"); | |
| 7843 fprintf(fmatlab,"\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); | |
| 7844 } | |
| 7845 else | |
| 7846 { | |
| 7847 fprintf(fmatlab,"\tret = mxGetString(a, b->__ptr, size + 1);\n"); | |
| 7848 fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); | |
| 7849 } | |
| 7850 fprintf(fmatlab,"\n}\n"); | |
| 7851 | |
| 7852 fflush(fmatlab); | |
| 7853 } | |
| 7854 | |
| 7855 | |
| 7856 void | |
| 7857 matlab_c_to_mx_dynamicArray(Tnode* typ) | |
| 7858 { | |
| 7859 int d,i; | |
| 7860 Entry *p; | |
| 7861 | |
| 7862 p = is_dynamic_array(typ); | |
| 7863 | |
| 7864 fprintf(fmatlab,"{\n"); | |
| 7865 fprintf(fmatlab,"\tmxArray *out;\n"); | |
| 7866 fprintf(fmatlab,"\t%s;\n",c_type_id((Tnode*)p->info.typ->ref,"*temp")); | |
| 7867 d = get_Darraydims(typ); | |
| 7868 fprintf(fmatlab,"\tint i;\n"); | |
| 7869 | |
| 7870 fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {", d, d); | |
| 7871 for (i = 0; i < d; i++) | |
| 7872 { | |
| 7873 if(i==0) | |
| 7874 fprintf(fmatlab,"a.__size[%d]",i); | |
| 7875 else | |
| 7876 fprintf(fmatlab,", a.__size[%d]",i); | |
| 7877 } | |
| 7878 fprintf(fmatlab,"};\n"); | |
| 7879 | |
| 7880 fprintf(fmatlab,"\tint size = "); | |
| 7881 for (i = 0; i < d; i++) | |
| 7882 { | |
| 7883 if(i==0) | |
| 7884 fprintf(fmatlab,"dims[%d]",i); | |
| 7885 else | |
| 7886 fprintf(fmatlab,"*dims[%d]",i); | |
| 7887 } | |
| 7888 fprintf(fmatlab,";\n"); | |
| 7889 if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) | |
| 7890 { | |
| 7891 fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID((Tnode*)p->info.typ->ref)); | |
| 7892 fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); | |
| 7893 fprintf(fmatlab,"\ttemp = (%s) mxGetPr(out);\n",c_type_id((Tnode*)p->info.typ->ref,"*")); | |
| 7894 fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); | |
| 7895 | |
| 7896 fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n"); | |
| 7897 fprintf(fmatlab,"\t\t*temp++ = a.__ptr[i];\n"); | |
| 7898 } | |
| 7899 else | |
| 7900 { | |
| 7901 fprintf(fmatlab,"\tout = mxCreateString(a.__ptr);\n"); | |
| 7902 fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); | |
| 7903 } | |
| 7904 fprintf(fmatlab,"\treturn out;\n}\n"); | |
| 7905 fflush(fmatlab); | |
| 7906 } | |
| 7907 | |
| 7908 char* | |
| 7909 get_mxClassID(Tnode* typ) | |
| 7910 { | |
| 7911 | |
| 7912 switch(typ->type) | |
| 7913 { | |
| 7914 case Tdouble: | |
| 7915 return "mxDOUBLE_CLASS"; | |
| 7916 case Tfloat: | |
| 7917 return "mxSINGLE_CLASS"; | |
| 7918 case Tshort: | |
| 7919 return "mxINT16_CLASS"; | |
| 7920 case Tushort: | |
| 7921 return "mxUINT16_CLASS"; | |
| 7922 case Tint: | |
| 7923 return "mxINT32_CLASS"; | |
| 7924 case Tuint: | |
| 7925 return "mxUINT32_CLASS"; | |
| 7926 case Tlong: | |
| 7927 return "mxINT32_CLASS"; | |
| 7928 case Tulong: | |
| 7929 return "mxUINT32_CLASS"; | |
| 7930 case Tllong: | |
| 7931 return "mxINT64_CLASS"; | |
| 7932 case Tullong: | |
| 7933 return "mxUINT64_CLASS"; | |
| 7934 case Tchar: | |
| 7935 return "mxCHAR_CLASS"; | |
| 7936 case Tuchar: | |
| 7937 return "mxCHAR_CLASS"; | |
| 7938 default: | |
| 7939 return ""; | |
| 7940 }; | |
| 7941 } | |
| 7942 | |
| 7943 /*Function not in use.*/ | |
| 7944 void | |
| 7945 matlab_array_c_to_mx(Tnode* typ) | |
| 7946 { | |
| 7947 Tnode* temp; | |
| 7948 int d,i; | |
| 7949 | |
| 7950 fprintf(fmatlab,"{\n\tint rows, r, cols, c;\n"); | |
| 7951 fprintf(fmatlab,"\tmxArray* out;\n"); | |
| 7952 fprintf(fmatlab,"\tdouble* temp;\n"); | |
| 7953 d = get_dimension(typ); | |
| 7954 fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {",d,d); | |
| 7955 temp=typ; | |
| 7956 for(i=0;i<d; i++) | |
| 7957 { | |
| 7958 if(i==0) | |
| 7959 fprintf(fmatlab,"%d",temp->width / ((Tnode*) temp->ref)->width); | |
| 7960 else | |
| 7961 fprintf(fmatlab,",%d",temp->width / ((Tnode*) temp->ref)->width); | |
| 7962 temp=(Tnode*)typ->ref; | |
| 7963 } | |
| 7964 fprintf(fmatlab,"};\n"); | |
| 7965 | |
| 7966 fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); | |
| 7967 fprintf(fmatlab,"\ttemp = (double *) mxGetPr(out);\n"); | |
| 7968 fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); | |
| 7969 fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); | |
| 7970 fprintf(fmatlab,"\trows = mxGetM(out);\n"); | |
| 7971 fprintf(fmatlab,"\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); | |
| 7972 fprintf(fmatlab,"\tcols = mxGetN(out);\n"); | |
| 7973 fprintf(fmatlab,"\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); | |
| 7974 fprintf(fmatlab,"\tfor (c = 0; c < cols; c++)\n"); | |
| 7975 fprintf(fmatlab,"\t\tfor (r = 0; r < rows; r++)\n"); | |
| 7976 fprintf(fmatlab,"\t\t\t*temp++ = z->a[r][c];\n"); | |
| 7977 fprintf(fmatlab,"\treturn out;\n}\n"); | |
| 7978 fflush(fmatlab); | |
| 7979 } | |
| 7980 | |
| 7981 | |
| 7982 void matlab_c_to_mx_pointer(Tnode* typ) | |
| 7983 { | |
| 7984 if (!typ->ref) | |
| 7985 return; | |
| 7986 | |
| 7987 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); | |
| 7988 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); | |
| 7989 fprintf(fmatlab,"{\n"); | |
| 7990 fprintf(fmatlab,"\tmxArray *fout;\n"); | |
| 7991 fprintf(fmatlab,"\tfout = c_to_mx_%s(*a);\n",c_ident((Tnode*)typ->ref)); | |
| 7992 fprintf(fmatlab,"\treturn fout;\n"); | |
| 7993 fprintf(fmatlab,"}\n"); | |
| 7994 } | |
| 7995 | |
| 7996 void matlab_mx_to_c_pointer(Tnode* typ) | |
| 7997 { | |
| 7998 if (!typ->ref) | |
| 7999 return; | |
| 8000 fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*,%s);\n",c_ident(typ),c_type_id(typ, "*")); | |
| 8001 fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a,%s)\n",c_ident(typ),c_type_id(typ, "*b")); | |
| 8002 fprintf(fmatlab,"{\n\tmx_to_c_%s(a,*b);\n",c_ident((Tnode*)typ->ref)); | |
| 8003 fprintf(fmatlab,"\n}\n"); | |
| 8004 } | |
| 8005 | |
| 8006 void func2(Tnode* typ) | |
| 8007 { | |
| 8008 Table *table,*t; | |
| 8009 Entry *p; | |
| 8010 | |
| 8011 fprintf(fmatlab,"\tif(!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); | |
| 8012 | |
| 8013 table=(Table*)typ->ref; | |
| 8014 for (t = table; t != (Table *) 0; t = t->prev) { | |
| 8015 for (p = t->list; p != (Entry*) 0; p = p->next) { | |
| 8016 if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) | |
| 8017 { | |
| 8018 fprintf(fmatlab,"\t{mxArray *tmp = mxGetField(a,0,\"%s\");\n",ident(p->sym->name)); | |
| 8019 fprintf(fmatlab,"\tif (!tmp) {\n"); | |
| 8020 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); | |
| 8021 fprintf(fmatlab,"\tmx_to_c_%s(tmp,&(b->%s));}\n",c_ident(p->info.typ),ident(p->sym->name)); | |
| 8022 } | |
| 8023 } | |
| 8024 } | |
| 8025 } | |
| 8026 | |
| 8027 void | |
| 8028 matlab_mx_to_c_struct(Tnode* typ) | |
| 8029 { | |
| 8030 if (!typ->ref) | |
| 8031 return; | |
| 8032 | |
| 8033 | |
| 8034 if (is_dynamic_array(typ)) | |
| 8035 { | |
| 8036 fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*")); | |
| 8037 fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); | |
| 8038 matlab_mx_to_c_dynamicArray(typ); | |
| 8039 return; | |
| 8040 } | |
| 8041 else if(strstr(c_type_id(typ, ""),"soapSparseArray")) | |
| 8042 { | |
| 8043 return; | |
| 8044 } | |
| 8045 | |
| 8046 fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*")); | |
| 8047 fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); | |
| 8048 fprintf(fmatlab,"{\n"); | |
| 8049 | |
| 8050 func2(typ); | |
| 8051 fprintf(fmatlab,"\n}\n"); | |
| 8052 | |
| 8053 return; | |
| 8054 } | |
| 8055 | |
| 8056 | |
| 8057 | |
| 8058 void | |
| 8059 matlab_c_to_mx_struct(Tnode* typ) | |
| 8060 { | |
| 8061 Table *table,*t; | |
| 8062 Entry *p; | |
| 8063 int number_of_fields=0; | |
| 8064 | |
| 8065 if (!typ->ref) | |
| 8066 return; | |
| 8067 | |
| 8068 if (is_dynamic_array(typ)) | |
| 8069 { | |
| 8070 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); | |
| 8071 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); | |
| 8072 matlab_c_to_mx_dynamicArray(typ); | |
| 8073 return; | |
| 8074 } | |
| 8075 else if(strstr(c_type_id(typ, ""),"soapSparseArray")) | |
| 8076 { | |
| 8077 return; | |
| 8078 } | |
| 8079 | |
| 8080 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); | |
| 8081 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); | |
| 8082 table=(Table*)typ->ref; | |
| 8083 fprintf(fmatlab,"{\n\tconst char* fnames[] = {"); | |
| 8084 for (t = table; t != (Table *) 0; t = t->prev) { | |
| 8085 for (p = t->list; p != (Entry*) 0; p = p->next) { | |
| 8086 if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) | |
| 8087 { | |
| 8088 if(number_of_fields) | |
| 8089 fprintf(fmatlab,",\"%s\"",ident(p->sym->name)); | |
| 8090 else | |
| 8091 fprintf(fmatlab,"\"%s\"",ident(p->sym->name)); | |
| 8092 number_of_fields++; | |
| 8093 } | |
| 8094 } | |
| 8095 } | |
| 8096 fprintf(fmatlab,"}; /* pointers to member field names */\n"); | |
| 8097 | |
| 8098 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); | |
| 8099 fprintf(fmatlab,"\t/* Create a 1x1 struct matrix for output */\n"); | |
| 8100 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"); | |
| 8101 | |
| 8102 | |
| 8103 for (t = table; t != (Table *) 0; t = t->prev) { | |
| 8104 for (p = t->list; p != (Entry*) 0; p = p->next) { | |
| 8105 if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) | |
| 8106 { | |
| 8107 fprintf(fmatlab,"\t{mxArray *fout = c_to_mx_%s(a.%s);\n",c_ident(p->info.typ), ident(p->sym->name)); | |
| 8108 fprintf(fmatlab,"\tmxSetField(struct_array_ptr, index,\"%s\" , fout);}\n", ident(p->sym->name)); | |
| 8109 } | |
| 8110 } | |
| 8111 } | |
| 8112 fprintf(fmatlab,"\treturn struct_array_ptr;\n}\n"); | |
| 8113 return; | |
| 8114 } | |
| 8115 | |
| 8116 void | |
| 8117 matlab_c_to_mx_primitive(Tnode *typ) | |
| 8118 { | |
| 8119 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);",c_ident(typ),c_type_id(typ, "")); | |
| 8120 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); | |
| 8121 | |
| 8122 fprintf(fmatlab,"{\n\tmxArray *fout;\n"); | |
| 8123 if((typ->type == Tchar) || (typ->type == Tuchar)) | |
| 8124 { | |
| 8125 fprintf(fmatlab,"\tchar buf[2];\n"); | |
| 8126 fprintf(fmatlab,"\tbuf[0] = a;\n"); | |
| 8127 fprintf(fmatlab,"\tbuf[1] = \'\\0\';\n"); | |
| 8128 fprintf(fmatlab,"\tfout = mxCreateString(buf);\n"); | |
| 8129 fprintf(fmatlab,"\tif (!fout)\n"); | |
| 8130 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); | |
| 8131 } | |
| 8132 else | |
| 8133 { | |
| 8134 fprintf(fmatlab,"\tint ndim = 1, dims[1] = {1};\n"); | |
| 8135 fprintf(fmatlab,"\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID(typ)); | |
| 8136 fprintf(fmatlab,"\t%s = (%s)mxGetPr(fout);\n",c_type_id(typ,"*temp"),c_type_id(typ,"*")); | |
| 8137 fprintf(fmatlab,"\tif (!fout)\n"); | |
| 8138 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); | |
| 8139 fprintf(fmatlab,"\tif (!temp) \n"); | |
| 8140 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); | |
| 8141 fprintf(fmatlab,"\t*temp++= a;\n"); | |
| 8142 } | |
| 8143 fprintf(fmatlab,"\treturn fout;\n}\n"); | |
| 8144 } | |
| 8145 | |
| 8146 void | |
| 8147 matlab_mx_to_c_primitive(Tnode *typ) | |
| 8148 { | |
| 8149 fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n",c_ident(typ),c_type_id(typ, "*")); | |
| 8150 fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); | |
| 8151 if((typ->type == Tchar) || (typ->type == Tuchar)) | |
| 8152 { | |
| 8153 fprintf(fmatlab,"{\n\tint ret;\n"); | |
| 8154 fprintf(fmatlab,"\tchar buf[2];\n"); | |
| 8155 fprintf(fmatlab,"\tret = mxGetString(a, buf, 2);\n"); | |
| 8156 fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); | |
| 8157 fprintf(fmatlab,"\t*b = buf[0];\n"); | |
| 8158 } | |
| 8159 else | |
| 8160 { | |
| 8161 fprintf(fmatlab,"{\n\tdouble* data = (double*)mxGetData(a);\n"); | |
| 8162 fprintf(fmatlab,"\t*b = (%s)*data;\n",c_type(typ)); | |
| 8163 } | |
| 8164 fprintf(fmatlab,"\n}\n"); | |
| 8165 } | |
| 8166 | |
| 8167 void | |
| 8168 matlab_out_generate(Tnode *typ) | |
| 8169 { | |
| 8170 | |
| 8171 if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) | |
| 8172 return; | |
| 8173 | |
| 8174 /* | |
| 8175 typeNO++; | |
| 8176 if (typeNO>=1024) | |
| 8177 execerror("Too many user-defined data types"); | |
| 8178 */ | |
| 8179 | |
| 8180 if(is_primitive(typ)) | |
| 8181 { | |
| 8182 matlab_c_to_mx_primitive(typ); | |
| 8183 matlab_mx_to_c_primitive(typ); | |
| 8184 return; | |
| 8185 } | |
| 8186 | |
| 8187 switch(typ->type) | |
| 8188 { | |
| 8189 case Tstruct: | |
| 8190 matlab_c_to_mx_struct(typ); | |
| 8191 matlab_mx_to_c_struct(typ); | |
| 8192 break; | |
| 8193 case Tpointer: | |
| 8194 matlab_c_to_mx_pointer(typ); | |
| 8195 matlab_mx_to_c_pointer(typ); | |
| 8196 break; | |
| 8197 case Tarray: | |
| 8198 break; | |
| 8199 default:break; | |
| 8200 } | |
| 8201 } | |
| 8202 | |
| 8203 /*his function is called first it first generates all routines | |
| 8204 and then in the second pass calls all routines to generate | |
| 8205 matlab_out for the table*/ | |
| 8206 | |
| 8207 void | |
| 8208 func1(Table *table, Entry *param) | |
| 8209 { Entry *q,*pout,*response=NULL; | |
| 8210 q=entry(table, param->sym); | |
| 8211 if (q) | |
| 8212 pout = (Entry*)q->info.typ->ref; | |
| 8213 else | |
| 8214 { fprintf(stderr, "Internal error: no table entry\n"); | |
| 8215 return; | |
| 8216 } | |
| 8217 q=entry(classtable, param->sym); | |
| 8218 if (!is_response(pout->info.typ)) | |
| 8219 { response = get_response(param->info.typ); | |
| 8220 } | |
| 8221 fprintf(fmheader,"\n\toutside loop struct %s soap_tmp_%s;",param->sym->name,param->sym->name); | |
| 8222 if (!is_response(pout->info.typ) && response) | |
| 8223 { fprintf(fmheader,"\n\tif..inside loop struct %s *soap_tmp_%s;",c_ident(response->info.typ), c_ident(response->info.typ)); | |
| 8224 } | |
| 8225 fflush(fmheader); | |
| 8226 } | |
| 8227 | |
| 8228 void | |
| 8229 matlab_def_table(Table *table) | |
| 8230 { | |
| 8231 Entry *q,*pout,*e,*response=NULL; | |
| 8232 int i; | |
| 8233 Tnode *p; | |
| 8234 | |
| 8235 /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) | |
| 8236 if (q1->info.typ->type==Tfun) | |
| 8237 func1(table, q1); | |
| 8238 */ | |
| 8239 | |
| 8240 /* Sparse matrix code will be present by default */ | |
| 8241 matlab_gen_sparseStruct(); | |
| 8242 matlab_c_to_mx_sparse(); | |
| 8243 matlab_mx_to_c_sparse(); | |
| 8244 | |
| 8245 for(i=0;i<TYPES;i++) | |
| 8246 for(p=Tptr[i];p!=(Tnode*) 0;p=p->next) | |
| 8247 { | |
| 8248 /* This is generated for everything declared in the ".h" file. To make | |
| 8249 sure that it doesnt get generated for functions do a comparison with | |
| 8250 p->sym->name, so that its not generated for functions. | |
| 8251 */ | |
| 8252 if(is_XML(p)) | |
| 8253 continue; | |
| 8254 if(strstr(c_ident(p),"SOAP_ENV_") != NULL) | |
| 8255 continue; | |
| 8256 for(q = table->list; q != (Entry*) 0; q = q->next) | |
| 8257 { | |
| 8258 if(strcmp(c_ident(p),q->sym->name) == 0) | |
| 8259 break; | |
| 8260 e=entry(table, q->sym); | |
| 8261 if (e) | |
| 8262 pout = (Entry*)e->info.typ->ref; | |
| 8263 else | |
| 8264 { fprintf(stderr, "Internal error: no table entry\n"); | |
| 8265 return; | |
| 8266 } | |
| 8267 if (!is_response(pout->info.typ)) | |
| 8268 { response = get_response(q->info.typ); | |
| 8269 } | |
| 8270 if (!is_response(pout->info.typ) && response) | |
| 8271 { | |
| 8272 if(strcmp(c_ident(p),c_ident(response->info.typ)) == 0) | |
| 8273 break; | |
| 8274 } | |
| 8275 } | |
| 8276 if(q == (Entry*) 0) | |
| 8277 matlab_out_generate(p); | |
| 8278 } | |
| 8279 } | |
| 8280 | |
| 8281 void | |
| 8282 def_table(Table *table) | |
| 8283 { int i; | |
| 8284 Tnode *p; | |
| 8285 for (i = 0; i < TYPES; i++) | |
| 8286 { for (p = Tptr[i]; p; p = p->next) | |
| 8287 { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) | |
| 8288 { p->generated = True; | |
| 8289 generate(p); | |
| 8290 if (fflag) | |
| 8291 if (--partnum == 0) | |
| 8292 return; | |
| 8293 } | |
| 8294 } | |
| 8295 } | |
| 8296 } | |
| 8297 | |
| 8298 | |
| 8299 int | |
| 8300 no_of_var(Tnode *typ) | |
| 8301 { | |
| 8302 Entry *p; | |
| 8303 Table *t; | |
| 8304 int i=0; | |
| 8305 if(typ->type==Tstruct || typ->type==Tclass) | |
| 8306 { | |
| 8307 t=(Table*)typ->ref; | |
| 8308 for (p = t->list; p != (Entry*) 0; p = p->next) { | |
| 8309 if(p->info.typ->type==Tpointer) | |
| 8310 i++; | |
| 8311 } | |
| 8312 } | |
| 8313 if((((Tnode *)(typ->ref))->type==Tstruct) || | |
| 8314 (((Tnode *)(typ->ref))->type==Tclass) ) | |
| 8315 { | |
| 8316 t=(Table*)((Tnode*)(typ->ref))->ref; | |
| 8317 for (p = t->list; p != (Entry*) 0; p = p->next) { | |
| 8318 if(p->info.typ->type==Tpointer) | |
| 8319 i++; | |
| 8320 } | |
| 8321 } | |
| 8322 return i; | |
| 8323 } | |
| 8324 | |
| 8325 void | |
| 8326 in_defs(Table *table) | |
| 8327 { int i; | |
| 8328 Tnode *p; | |
| 8329 for (i = 0; i < TYPES; i++) | |
| 8330 { for (p = Tptr[i]; p; p = p->next) | |
| 8331 { 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)) | |
| 8332 { char *s = xsi_type(p); | |
| 8333 if (!*s) | |
| 8334 s = wsdl_type(p, ""); | |
| 8335 if (*s == '-') | |
| 8336 continue; | |
| 8337 if (is_string(p)) | |
| 8338 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); | |
| 8339 else if (is_wstring(p)) | |
| 8340 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); | |
| 8341 else | |
| 8342 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_in_%s(soap, NULL, NULL, \"%s\");", soap_type(p), c_ident(p), s); | |
| 8343 } | |
| 8344 } | |
| 8345 } | |
| 8346 } | |
| 8347 | |
| 8348 void | |
| 8349 in_defs2(Table *table) | |
| 8350 { int i, j; | |
| 8351 Tnode *p; | |
| 8352 char *s; | |
| 8353 for (i = 0; i < TYPES; i++) | |
| 8354 { /* make sure (wrapper) classes are checked first */ | |
| 8355 if (i == 0) | |
| 8356 j = Tclass; | |
| 8357 else if (i == Tclass) | |
| 8358 continue; | |
| 8359 else | |
| 8360 j = i; | |
| 8361 for (p = Tptr[j]; p; p = p->next) | |
| 8362 { 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)) | |
| 8363 { s = xsi_type(p); | |
| 8364 if (!*s) | |
| 8365 s = wsdl_type(p, ""); | |
| 8366 if (*s == '-') | |
| 8367 continue; | |
| 8368 if (*s) | |
| 8369 { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) | |
| 8370 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)); | |
| 8371 else if (is_string(p)) | |
| 8372 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)); | |
| 8373 else if (is_wstring(p)) | |
| 8374 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)); | |
| 8375 else if (p->type != Tpointer) | |
| 8376 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)); | |
| 8377 } | |
| 8378 } | |
| 8379 } | |
| 8380 } | |
| 8381 } | |
| 8382 | |
| 8383 void | |
| 8384 in_defs3(Table *table) | |
| 8385 { int i; | |
| 8386 Tnode *p; | |
| 8387 char *s; | |
| 8388 for (i = 0; i < TYPES; i++) | |
| 8389 { for (p = Tptr[i]; p; p = p->next) | |
| 8390 { 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)) | |
| 8391 { s = xsi_type(p); | |
| 8392 if (!*s) | |
| 8393 s = wsdl_type(p, ""); | |
| 8394 if (*s == '-') | |
| 8395 continue; | |
| 8396 if (*s) | |
| 8397 { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) | |
| 8398 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)); | |
| 8399 else if (is_string(p)) | |
| 8400 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)); | |
| 8401 else if (is_wstring(p)) | |
| 8402 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)); | |
| 8403 else if (p->type != Tpointer) | |
| 8404 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)); | |
| 8405 } | |
| 8406 } | |
| 8407 } | |
| 8408 } | |
| 8409 } | |
| 8410 | |
| 8411 void | |
| 8412 out_defs(Table *table) | |
| 8413 { int i; | |
| 8414 char *s; | |
| 8415 Tnode *p; | |
| 8416 for (i = 0; i < TYPES; i++) | |
| 8417 { for (p = Tptr[i]; p; p = p->next) | |
| 8418 { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) | |
| 8419 continue; | |
| 8420 if (is_element(p)) | |
| 8421 { s = wsdl_type(p, ""); | |
| 8422 if (*s == '-') | |
| 8423 continue; | |
| 8424 if (p->type == Tarray) | |
| 8425 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, "(*)")); | |
| 8426 else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) | |
| 8427 fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, NULL);", soap_type(p), c_type_id(p, "*"),s); | |
| 8428 else if (is_string(p)) | |
| 8429 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)&ptr, NULL);", soap_type(p),s); | |
| 8430 else if (is_wstring(p)) | |
| 8431 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)&ptr, NULL);", soap_type(p),s); | |
| 8432 else if (p->type == Tpointer) | |
| 8433 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*")); | |
| 8434 else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) | |
| 8435 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, "*")); | |
| 8436 } | |
| 8437 else | |
| 8438 { s = xsi_type(p); | |
| 8439 if (!*s) | |
| 8440 s = wsdl_type(p, ""); | |
| 8441 if (*s == '-') | |
| 8442 continue; | |
| 8443 if (p->type == Tarray) | |
| 8444 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); | |
| 8445 else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) | |
| 8446 fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); | |
| 8447 else if (is_string(p)) | |
| 8448 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)&ptr, \"%s\");", soap_type(p), s); | |
| 8449 else if (is_wstring(p)) | |
| 8450 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)&ptr, \"%s\");", soap_type(p), s); | |
| 8451 else if (p->type == Tpointer) | |
| 8452 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); | |
| 8453 else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) | |
| 8454 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); | |
| 8455 } | |
| 8456 } | |
| 8457 } | |
| 8458 } | |
| 8459 | |
| 8460 void | |
| 8461 mark_defs(Table *table) | |
| 8462 { int i; | |
| 8463 Tnode *p; | |
| 8464 for (i = 0; i < TYPES; i++) | |
| 8465 { for (p = Tptr[i]; p; p = p->next) | |
| 8466 { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) | |
| 8467 continue; | |
| 8468 if (p->type == Tarray) | |
| 8469 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, "(*)")); | |
| 8470 else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) | |
| 8471 fprintf(fout,"\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); | |
| 8472 else if (is_string(p)) | |
| 8473 fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)&ptr);\n\t\tbreak;", soap_type(p)); | |
| 8474 else if (is_wstring(p)) | |
| 8475 fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)&ptr);\n\t\tbreak;", soap_type(p)); | |
| 8476 else if (p->type == Tpointer) | |
| 8477 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*")); | |
| 8478 else if(p->type == Ttemplate && p->ref) | |
| 8479 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, "*")); | |
| 8480 else if(!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) | |
| 8481 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, "*")); | |
| 8482 } | |
| 8483 } | |
| 8484 } | |
| 8485 | |
| 8486 void | |
| 8487 in_attach(Table *table) | |
| 8488 { int i; | |
| 8489 Tnode *p; | |
| 8490 for (i = 0; i < TYPES; i++) | |
| 8491 { for (p = Tptr[i]; p; p = p->next) | |
| 8492 { if (is_attachment(p)) | |
| 8493 { if (p->type == Tclass) | |
| 8494 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)); | |
| 8495 else | |
| 8496 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)); | |
| 8497 } | |
| 8498 else if (is_binary(p) && !is_transient(p)) | |
| 8499 { if (p->type == Tclass) | |
| 8500 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)); | |
| 8501 else | |
| 8502 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)); | |
| 8503 } | |
| 8504 } | |
| 8505 } | |
| 8506 } | |
| 8507 | |
| 8508 void | |
| 8509 soap_instantiate_class(Tnode *typ) | |
| 8510 { Table *Tptr; | |
| 8511 Entry *Eptr; | |
| 8512 int derclass = 0, flag = 0; | |
| 8513 char *s; | |
| 8514 | |
| 8515 if (cflag) | |
| 8516 return; | |
| 8517 | |
| 8518 if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) | |
| 8519 if (is_typedef(typ) && !is_external(typ)) | |
| 8520 { fprintf(fhead, "\n\n#define soap_instantiate_%s soap_instantiate_%s\n", c_ident(typ), t_ident(typ)); | |
| 8521 fprintf(fhead, "\n\n#define soap_copy_%s soap_copy_%s", c_ident(typ), t_ident(typ)); | |
| 8522 return; | |
| 8523 } | |
| 8524 | |
| 8525 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)); | |
| 8526 | |
| 8527 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)); | |
| 8528 | |
| 8529 if (typ->type == Tclass || typ->type == Tstruct) | |
| 8530 { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(struct soap *soap", c_type(typ), c_ident(typ)); | |
| 8531 if (!is_dynamic_array(typ)) | |
| 8532 { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) | |
| 8533 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) | |
| 8534 { if (Eptr->info.sto & (Stypedef | Sstatic)) | |
| 8535 continue; | |
| 8536 if (is_repetition(Eptr) || is_anytype(Eptr)) | |
| 8537 flag = 2; | |
| 8538 if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) | |
| 8539 { if (flag) | |
| 8540 flag--; | |
| 8541 if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) | |
| 8542 fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); | |
| 8543 else | |
| 8544 fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); | |
| 8545 if (derclass) | |
| 8546 fprintf(fhead, "%d", derclass); | |
| 8547 } | |
| 8548 } | |
| 8549 } | |
| 8550 } | |
| 8551 fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ)); | |
| 8552 if (!is_external(typ)) | |
| 8553 { if (typ->type == Tclass && !is_volatile(typ)) | |
| 8554 fprintf(fhead, "_p->soap_default(soap); "); | |
| 8555 else | |
| 8556 fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ)); | |
| 8557 } | |
| 8558 flag = 0; | |
| 8559 if (!is_dynamic_array(typ)) | |
| 8560 { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) | |
| 8561 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) | |
| 8562 { if (Eptr->info.sto & (Stypedef | Sstatic)) | |
| 8563 continue; | |
| 8564 if (is_repetition(Eptr) || is_anytype(Eptr)) | |
| 8565 flag = 2; | |
| 8566 if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) | |
| 8567 { if (flag) | |
| 8568 flag--; | |
| 8569 if (typ->type == Tclass) | |
| 8570 fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); | |
| 8571 else | |
| 8572 fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); | |
| 8573 if (derclass) | |
| 8574 fprintf(fhead, "%d; ", derclass); | |
| 8575 else | |
| 8576 fprintf(fhead, "; "); | |
| 8577 } | |
| 8578 } | |
| 8579 } | |
| 8580 } | |
| 8581 fprintf(fhead, "} return _p; }"); | |
| 8582 fprintf(fhead, "\n\ninline %s * soap_new_set_%s(struct soap *soap", c_type(typ), c_ident(typ)); | |
| 8583 for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) | |
| 8584 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) | |
| 8585 { if (Eptr->info.sto & (Stypedef | Sstatic)) | |
| 8586 continue; | |
| 8587 if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) | |
| 8588 { if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) | |
| 8589 fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); | |
| 8590 else | |
| 8591 fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); | |
| 8592 if (derclass) | |
| 8593 fprintf(fhead, "%d", derclass); | |
| 8594 } | |
| 8595 } | |
| 8596 } | |
| 8597 fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ)); | |
| 8598 if (!is_external(typ)) | |
| 8599 { if (typ->type == Tclass && !is_volatile(typ)) | |
| 8600 fprintf(fhead, "_p->soap_default(soap); "); | |
| 8601 else | |
| 8602 fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ)); | |
| 8603 } | |
| 8604 for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) | |
| 8605 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) | |
| 8606 { if (Eptr->info.sto & (Stypedef | Sstatic)) | |
| 8607 continue; | |
| 8608 if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) | |
| 8609 { if (typ->type == Tclass) | |
| 8610 fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); | |
| 8611 else if (Eptr->info.typ->type == Tarray) | |
| 8612 fprintf(fhead, "memcpy(_p->%s, %s, sizeof(%s))", ident(Eptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ)); | |
| 8613 else | |
| 8614 fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); | |
| 8615 if (derclass) | |
| 8616 fprintf(fhead, "%d; ", derclass); | |
| 8617 else | |
| 8618 fprintf(fhead, "; "); | |
| 8619 } | |
| 8620 } | |
| 8621 } | |
| 8622 fprintf(fhead, "} return _p; }"); | |
| 8623 } | |
| 8624 | |
| 8625 fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); | |
| 8626 | |
| 8627 /* extern "C" causes C++ namespace linking issues */ | |
| 8628 /* fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */ | |
| 8629 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)); | |
| 8630 /* fprintf(fhead,"\n#ifdef __cplusplus\n}\n#endif"); */ | |
| 8631 | |
| 8632 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)); | |
| 8633 fprintf(fout,"\n{"); | |
| 8634 fprintf(fout,"\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); | |
| 8635 fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_instantiate_%s(%%d, %%s, %%s)\\n\", n, type?type:\"\", arrayType?arrayType:\"\"));", c_ident(typ)); | |
| 8636 | |
| 8637 fprintf(fout,"\n\tstruct soap_clist *cp = soap_link(soap, NULL, %s, n, %s_fdelete);", soap_type(typ), prefix); | |
| 8638 fprintf(fout,"\n\tif (!cp)\n\t\treturn NULL;"); | |
| 8639 for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) | |
| 8640 { | |
| 8641 Tptr = ((Table *) Eptr->info.typ->ref); | |
| 8642 if(Tptr == ((Table *) typ->ref)){ | |
| 8643 continue; | |
| 8644 } | |
| 8645 | |
| 8646 derclass = 0; | |
| 8647 while(Tptr) | |
| 8648 { | |
| 8649 if(Tptr == (Table*)typ->ref){ | |
| 8650 derclass = 1; | |
| 8651 } | |
| 8652 | |
| 8653 Tptr = Tptr->prev; | |
| 8654 } | |
| 8655 | |
| 8656 if(derclass == 1 && !is_transient(Eptr->info.typ)){ | |
| 8657 if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) | |
| 8658 fprintf(fout,"\n\tif (arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); | |
| 8659 else | |
| 8660 fprintf(fout,"\n\tif (type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); | |
| 8661 fprintf(fout,"\n\t{\tcp->type = %s;", soap_type(Eptr->info.typ)); | |
| 8662 fprintf(fout,"\n\t\tif (n < 0)"); | |
| 8663 fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(Eptr->info.typ)); | |
| 8664 fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = sizeof(%s);", c_type(Eptr->info.typ)); | |
| 8665 if ((s = has_soapref(Eptr->info.typ))) | |
| 8666 fprintf(fout,"\n\t\t\t((%s*)cp->ptr)->%s = soap;", c_type(Eptr->info.typ), s); | |
| 8667 fprintf(fout,"\n\t\t}\n\t\telse"); | |
| 8668 fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(Eptr->info.typ)); | |
| 8669 fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = n * sizeof(%s);", c_type(Eptr->info.typ)); | |
| 8670 if (s) | |
| 8671 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); | |
| 8672 fprintf(fout,"\n\t\t}"); | |
| 8673 fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));"); | |
| 8674 fprintf(fout,"\n\t\tif (!cp->ptr)\n\t\t\tsoap->error = SOAP_EOM;"); | |
| 8675 fprintf(fout,"\n\t\treturn (%s*)cp->ptr;", c_type(Eptr->info.typ)); | |
| 8676 fprintf(fout,"\n\t}"); | |
| 8677 | |
| 8678 derclass = 0; | |
| 8679 } | |
| 8680 } | |
| 8681 | |
| 8682 fprintf(fout,"\n\tif (n < 0)"); | |
| 8683 fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(typ)); | |
| 8684 fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = sizeof(%s);", c_type(typ)); | |
| 8685 if ((s = has_soapref(typ))) | |
| 8686 fprintf(fout,"\n\t\t((%s*)cp->ptr)->%s = soap;", c_type(typ), s); | |
| 8687 fprintf(fout,"\n\t}\n\telse"); | |
| 8688 fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(typ)); | |
| 8689 fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = n * sizeof(%s);", c_type(typ)); | |
| 8690 if (s) | |
| 8691 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); | |
| 8692 fprintf(fout,"\n\t}"); | |
| 8693 fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));"); | |
| 8694 fprintf(fout,"\n\tif (!cp->ptr)\n\t\tsoap->error = SOAP_EOM;"); | |
| 8695 fprintf(fout,"\n\treturn (%s*)cp->ptr;", c_type(typ)); | |
| 8696 | |
| 8697 fprintf(fout,"\n}"); | |
| 8698 | |
| 8699 /* fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */ | |
| 8700 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)); | |
| 8701 fprintf(fout,"\n{\n\t(void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */"); | |
| 8702 fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copying %s %%p -> %%p\\n\", q, p));", c_type(typ)); | |
| 8703 fprintf(fout,"\n\t*(%s*)p = *(%s*)q;\n}", c_type(typ), c_type(typ)); | |
| 8704 /* fprintf(fout,"\n#ifdef __cplusplus\n}\n#endif"); */ | |
| 8705 } | |
| 8706 | |
| 8707 int | |
| 8708 get_dimension(Tnode *typ) | |
| 8709 { if (((Tnode*)typ->ref)->width) | |
| 8710 return typ->width / ((Tnode*) typ->ref)->width; | |
| 8711 return 0; | |
| 8712 } | |
| 8713 | |
| 8714 | |
| 8715 void | |
| 8716 soap_serialize(Tnode *typ) | |
| 8717 { int d; | |
| 8718 Table *table,*t; | |
| 8719 Entry *p; | |
| 8720 Tnode* temp; | |
| 8721 int cardinality; | |
| 8722 const char *self; | |
| 8723 | |
| 8724 if (is_primitive(typ)) | |
| 8725 return; | |
| 8726 | |
| 8727 if (is_typedef(typ) && is_element(typ) && !is_external(typ)) | |
| 8728 { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) | |
| 8729 fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ)); | |
| 8730 else | |
| 8731 fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); | |
| 8732 return; | |
| 8733 } | |
| 8734 | |
| 8735 if (is_typedef(typ) && !is_external(typ)) | |
| 8736 { if (is_imported(typ)) | |
| 8737 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ)); | |
| 8738 return; | |
| 8739 } | |
| 8740 if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) | |
| 8741 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ)); | |
| 8742 return; | |
| 8743 } | |
| 8744 /* enabling this will not allow multi-ref detection of these typedef types | |
| 8745 else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) | |
| 8746 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_std__string(soap, a)\n", c_ident(typ)); | |
| 8747 return; | |
| 8748 } | |
| 8749 else if (typ->type != Tclass) | |
| 8750 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ)); | |
| 8751 return; | |
| 8752 } | |
| 8753 */ | |
| 8754 } | |
| 8755 | |
| 8756 if ((p = is_dynamic_array(typ))) | |
| 8757 { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) | |
| 8758 { if (is_external(typ)) | |
| 8759 return; | |
| 8760 fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF",c_ident(typ)); | |
| 8761 if (is_binary(typ)) | |
| 8762 { if (is_attachment(typ)) | |
| 8763 { fprintf(fout,"\n\tif (this->__ptr && !soap_array_reference(soap, this, (struct soap_array*)&this->__ptr, 1, %s))", soap_type(typ)); | |
| 8764 fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;"); | |
| 8765 } | |
| 8766 else | |
| 8767 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)); | |
| 8768 fprintf(fout,"\n#endif\n}"); | |
| 8769 fflush(fout); | |
| 8770 return; | |
| 8771 } | |
| 8772 else | |
| 8773 { | |
| 8774 d = get_Darraydims(typ); | |
| 8775 if (d) | |
| 8776 { 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)); | |
| 8777 fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d); | |
| 8778 } | |
| 8779 else | |
| 8780 { 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)); | |
| 8781 fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)"); | |
| 8782 } | |
| 8783 fprintf(fout,"\n\t\t{"); | |
| 8784 if (has_ptr((Tnode*)p->info.typ->ref)) | |
| 8785 fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); | |
| 8786 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)) | |
| 8787 fprintf(fout,"\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); | |
| 8788 else if (!is_XML((Tnode*)p->info.typ->ref) &&!is_primitive((Tnode*)p->info.typ->ref)) | |
| 8789 fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); | |
| 8790 fprintf(fout,"\n\t\t}\n#endif\n}"); | |
| 8791 return; | |
| 8792 } | |
| 8793 } | |
| 8794 else | |
| 8795 { if (is_external(typ)) | |
| 8796 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*")); | |
| 8797 return; | |
| 8798 } | |
| 8799 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*")); | |
| 8800 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")); | |
| 8801 if (is_binary(typ)) | |
| 8802 { if (is_attachment(typ)) | |
| 8803 { 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)); | |
| 8804 fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;"); | |
| 8805 } | |
| 8806 else | |
| 8807 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)); | |
| 8808 fprintf(fout,"\n#endif\n}"); | |
| 8809 fflush(fout); | |
| 8810 return; | |
| 8811 } | |
| 8812 else | |
| 8813 { | |
| 8814 fprintf(fout,"\n\tint i;"); | |
| 8815 d = get_Darraydims(typ); | |
| 8816 if (d) | |
| 8817 { 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)); | |
| 8818 fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); | |
| 8819 } | |
| 8820 else | |
| 8821 { 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)); | |
| 8822 fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)"); | |
| 8823 } | |
| 8824 fprintf(fout,"\n\t\t{"); | |
| 8825 if (has_ptr((Tnode*)p->info.typ->ref)) | |
| 8826 fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); | |
| 8827 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)) | |
| 8828 fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); | |
| 8829 else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) | |
| 8830 fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); | |
| 8831 fprintf(fout,"\n\t\t}\n#endif\n}"); | |
| 8832 fflush(fout); | |
| 8833 return; | |
| 8834 } | |
| 8835 } | |
| 8836 } | |
| 8837 if (is_stdstring(typ) || is_stdwstring(typ)) | |
| 8838 { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 8839 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")); | |
| 8840 return; | |
| 8841 } | |
| 8842 switch(typ->type) | |
| 8843 { | |
| 8844 case Tclass: | |
| 8845 if (!is_volatile(typ)) | |
| 8846 { | |
| 8847 if (is_external(typ)) | |
| 8848 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 8849 return; | |
| 8850 } | |
| 8851 table=(Table*)typ->ref; | |
| 8852 if (!table) | |
| 8853 return; | |
| 8854 if (!is_typedef(typ)) | |
| 8855 { self = "this"; | |
| 8856 fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF", ident(typ->id->name)); | |
| 8857 } | |
| 8858 else | |
| 8859 { self = "p"; | |
| 8860 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 8861 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")); | |
| 8862 } | |
| 8863 fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); | |
| 8864 for (p = table->list; p; p = p->next) | |
| 8865 { | |
| 8866 if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 8867 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 8868 else if (is_transient(p->info.typ)) | |
| 8869 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 8870 else if (p->info.sto & Sattribute) | |
| 8871 ; | |
| 8872 else if (is_repetition(p)) | |
| 8873 { | |
| 8874 if (!is_XML(p->next->info.typ)) | |
| 8875 { | |
| 8876 fprintf(fout,"\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); | |
| 8877 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)); | |
| 8878 if (!is_invisible(p->next->sym->name)) | |
| 8879 if (has_ptr((Tnode*)p->next->info.typ->ref)) | |
| 8880 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)); | |
| 8881 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)) | |
| 8882 fprintf(fout,"\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); | |
| 8883 else if (!is_primitive((Tnode*)p->next->info.typ->ref)) | |
| 8884 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)); | |
| 8885 fprintf(fout,"\n\t\t}\n\t}"); | |
| 8886 } | |
| 8887 p = p->next; | |
| 8888 } | |
| 8889 else if (is_anytype(p)) | |
| 8890 { fprintf(fout,"\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); | |
| 8891 p = p->next; | |
| 8892 } | |
| 8893 else if (is_choice(p)) | |
| 8894 { 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)); | |
| 8895 p = p->next; | |
| 8896 } | |
| 8897 else if(p->info.typ->type==Tarray) | |
| 8898 { | |
| 8899 if (has_ptr(p->info.typ)) | |
| 8900 fprintf(fout,"\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); | |
| 8901 fprintf(fout,"\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); | |
| 8902 } | |
| 8903 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 8904 { | |
| 8905 if (has_ptr(p->info.typ)) | |
| 8906 fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); | |
| 8907 fprintf(fout,"\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); | |
| 8908 } | |
| 8909 else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) | |
| 8910 { | |
| 8911 if (!is_template(p->info.typ)) | |
| 8912 if (has_ptr(p->info.typ)) | |
| 8913 fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); | |
| 8914 if (!is_primitive(p->info.typ)) | |
| 8915 fprintf(fout,"\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); | |
| 8916 } | |
| 8917 } | |
| 8918 t = table->prev; | |
| 8919 if (t) | |
| 8920 fprintf(fout,"\n\t%s->%s::soap_serialize(soap);", self, ident(t->sym->name)); | |
| 8921 fprintf(fout,"\n#endif\n}"); | |
| 8922 break; | |
| 8923 } | |
| 8924 case Tstruct: | |
| 8925 | |
| 8926 if (is_external(typ) && !is_volatile(typ)) | |
| 8927 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 8928 return; | |
| 8929 } | |
| 8930 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 8931 if (!typ->ref) | |
| 8932 return; | |
| 8933 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")); | |
| 8934 /* DYNAMIC ARRAY */ | |
| 8935 | |
| 8936 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 8937 table=(Table*)typ->ref; | |
| 8938 for (t = table; t; t = t->prev) | |
| 8939 { for (p = t->list; p; p = p->next) | |
| 8940 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 8941 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 8942 else if (is_transient(p->info.typ)) | |
| 8943 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 8944 else if (p->info.sto & Sattribute) | |
| 8945 ; | |
| 8946 else if (is_repetition(p)) | |
| 8947 { | |
| 8948 if (!is_XML(p->next->info.typ)) { | |
| 8949 fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); | |
| 8950 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name)); | |
| 8951 if (!is_invisible(p->next->sym->name)) | |
| 8952 if (has_ptr((Tnode*)p->next->info.typ->ref)) | |
| 8953 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)); | |
| 8954 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)) | |
| 8955 fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); | |
| 8956 else if (!is_primitive((Tnode*)p->next->info.typ->ref)) | |
| 8957 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)); | |
| 8958 fprintf(fout,"\n\t\t}\n\t}"); | |
| 8959 } | |
| 8960 p = p->next; | |
| 8961 } | |
| 8962 else if (is_anytype(p)) | |
| 8963 { fprintf(fout,"\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); | |
| 8964 p = p->next; | |
| 8965 } | |
| 8966 else if (is_choice(p)) | |
| 8967 { 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)); | |
| 8968 p = p->next; | |
| 8969 } | |
| 8970 else if(p->info.typ->type==Tarray) | |
| 8971 { | |
| 8972 if (has_ptr(p->info.typ)) | |
| 8973 fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 8974 fprintf(fout,"\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); | |
| 8975 } | |
| 8976 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 8977 { | |
| 8978 if (has_ptr(p->info.typ)) | |
| 8979 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 8980 fprintf(fout,"\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); | |
| 8981 } | |
| 8982 else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) | |
| 8983 { | |
| 8984 if (!is_template(p->info.typ)) | |
| 8985 if (has_ptr(p->info.typ)) | |
| 8986 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 8987 if (!is_primitive(p->info.typ)) | |
| 8988 fprintf(fout,"\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); | |
| 8989 } | |
| 8990 } | |
| 8991 } | |
| 8992 fprintf(fout,"\n#endif\n}"); | |
| 8993 break; | |
| 8994 | |
| 8995 case Tunion: | |
| 8996 if (is_external(typ) && !is_volatile(typ)) | |
| 8997 { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); | |
| 8998 return; | |
| 8999 } | |
| 9000 table=(Table*)typ->ref; | |
| 9001 fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); | |
| 9002 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")); | |
| 9003 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 9004 fprintf(fout, "\n\tswitch (choice)\n\t{"); | |
| 9005 for (t = table; t; t = t->prev) | |
| 9006 { for (p = t->list; p; p = p->next) | |
| 9007 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 9008 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 9009 else if (is_transient(p->info.typ)) | |
| 9010 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 9011 else if (p->info.sto & Sattribute) | |
| 9012 ; | |
| 9013 else if (is_repetition(p)) | |
| 9014 ; | |
| 9015 else if (is_anytype(p)) | |
| 9016 ; | |
| 9017 else if (p->info.typ->type==Tarray) | |
| 9018 { | |
| 9019 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 9020 if (has_ptr(p->info.typ)) | |
| 9021 fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9022 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); | |
| 9023 fprintf(fout, "\n\t\tbreak;"); | |
| 9024 } | |
| 9025 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 9026 { | |
| 9027 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 9028 if (has_ptr(p->info.typ)) | |
| 9029 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9030 fprintf(fout,"\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); | |
| 9031 fprintf(fout, "\n\t\tbreak;"); | |
| 9032 } | |
| 9033 else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) | |
| 9034 { | |
| 9035 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 9036 if (has_ptr(p->info.typ)) | |
| 9037 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9038 if (!is_primitive(p->info.typ)) | |
| 9039 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); | |
| 9040 fprintf(fout, "\n\t\tbreak;"); | |
| 9041 } | |
| 9042 } | |
| 9043 } | |
| 9044 fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); | |
| 9045 break; | |
| 9046 case Tpointer: | |
| 9047 if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 9048 { if (is_external(typ)) | |
| 9049 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); | |
| 9050 return; | |
| 9051 } | |
| 9052 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); | |
| 9053 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")); | |
| 9054 p = is_dynamic_array((Tnode*)typ->ref); | |
| 9055 if (p) | |
| 9056 { d = get_Darraydims((Tnode*)typ->ref); | |
| 9057 if (d) | |
| 9058 fprintf(fout,"\n\tif (*a)"); | |
| 9059 else | |
| 9060 fprintf(fout,"\n\tif (*a)"); | |
| 9061 } | |
| 9062 else | |
| 9063 fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); | |
| 9064 fprintf(fout,"\n\t\t(*a)->soap_serialize(soap);\n#endif\n}"); | |
| 9065 break; | |
| 9066 } | |
| 9067 else | |
| 9068 { | |
| 9069 if (is_external(typ)) | |
| 9070 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); | |
| 9071 return; | |
| 9072 } | |
| 9073 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); | |
| 9074 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")); | |
| 9075 if (is_string(typ) || is_wstring(typ)) | |
| 9076 fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type(typ)); | |
| 9077 else if (is_primitive((Tnode*)typ->ref)) | |
| 9078 fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type((Tnode*)typ->ref)); | |
| 9079 else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) | |
| 9080 { d = get_Darraydims((Tnode*)typ->ref); | |
| 9081 if (d) | |
| 9082 fprintf(fout,"\n\tif (*a)"); | |
| 9083 else | |
| 9084 fprintf(fout,"\n\tif (*a)"); | |
| 9085 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref)); | |
| 9086 } | |
| 9087 else | |
| 9088 { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); | |
| 9089 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref)); | |
| 9090 } | |
| 9091 fprintf(fout,"\n#endif\n}"); | |
| 9092 break; | |
| 9093 } | |
| 9094 case Tarray: | |
| 9095 if (is_external(typ)) | |
| 9096 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const")); | |
| 9097 return; | |
| 9098 } | |
| 9099 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const")); | |
| 9100 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")); | |
| 9101 if (is_primitive((Tnode*)typ->ref)) | |
| 9102 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 9103 else | |
| 9104 { fprintf(fout,"\n\tint i;"); | |
| 9105 fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ)); | |
| 9106 | |
| 9107 temp=(Tnode*)typ->ref;; | |
| 9108 cardinality = 1; | |
| 9109 while(temp->type==Tarray) | |
| 9110 { | |
| 9111 temp=(Tnode*)temp->ref; | |
| 9112 cardinality++; | |
| 9113 } | |
| 9114 fprintf(fout,"\n\t{"); | |
| 9115 if (has_ptr((Tnode*)typ->ref)) | |
| 9116 { | |
| 9117 fprintf(fout,"\tsoap_embedded(soap, a"); | |
| 9118 if(cardinality > 1) | |
| 9119 fprintf(fout,"[i]"); | |
| 9120 else | |
| 9121 fprintf(fout,"+i"); | |
| 9122 fprintf(fout,", %s);", soap_type((Tnode*)typ->ref)); | |
| 9123 } | |
| 9124 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 9125 { fprintf(fout,"\n\ta[i].soap_serialize(soap)"); | |
| 9126 } | |
| 9127 else if (!is_primitive((Tnode*)typ->ref)) | |
| 9128 { fprintf(fout,"\n\tsoap_serialize_%s(soap, a",c_ident((Tnode*)typ->ref)); | |
| 9129 if(cardinality > 1){ | |
| 9130 fprintf(fout,"[i])"); | |
| 9131 }else { | |
| 9132 fprintf(fout,"+i)"); | |
| 9133 } | |
| 9134 } | |
| 9135 fprintf(fout,";\n\t}"); | |
| 9136 } | |
| 9137 fprintf(fout,"\n#endif\n}"); | |
| 9138 break; | |
| 9139 case Ttemplate: | |
| 9140 if (is_external(typ)) | |
| 9141 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9142 return; | |
| 9143 } | |
| 9144 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9145 temp = (Tnode*)typ->ref; | |
| 9146 if (!temp) | |
| 9147 return; | |
| 9148 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")); | |
| 9149 if (!is_primitive(temp) && !is_XML(temp) && temp->type != Tfun && !is_void(temp)) | |
| 9150 { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); | |
| 9151 if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) | |
| 9152 fprintf(fout,"\n\t\t(*i).soap_serialize(soap);"); | |
| 9153 else | |
| 9154 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); | |
| 9155 } | |
| 9156 fprintf(fout, "\n#endif\n}"); | |
| 9157 default: break; | |
| 9158 } | |
| 9159 } | |
| 9160 | |
| 9161 void | |
| 9162 soap_default(Tnode* typ) | |
| 9163 { int i, d; | |
| 9164 Table *table,*t; | |
| 9165 Entry *p; | |
| 9166 Tnode *temp; | |
| 9167 char *s; | |
| 9168 int cardinality; | |
| 9169 | |
| 9170 if (typ->type == Tpointer && !is_string(typ)) | |
| 9171 return; | |
| 9172 | |
| 9173 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)) | |
| 9174 { if (is_typedef(typ) && !is_external(typ)) | |
| 9175 { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) | |
| 9176 fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); | |
| 9177 else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) | |
| 9178 fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_std__string(soap, a)\n", c_ident(typ)); | |
| 9179 else | |
| 9180 fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_%s(soap, a)\n", c_ident(typ), t_ident(typ)); | |
| 9181 return; | |
| 9182 } | |
| 9183 } | |
| 9184 p = is_dynamic_array(typ); | |
| 9185 if (p) | |
| 9186 { if (typ->type == Tclass && !is_volatile(typ)) | |
| 9187 { if (is_external(typ)) | |
| 9188 return; | |
| 9189 fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); | |
| 9190 if ((s = has_soapref(typ))) | |
| 9191 fprintf(fout,"\n\tthis->%s = soap;", s); | |
| 9192 else | |
| 9193 fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); | |
| 9194 d = get_Darraydims(typ); | |
| 9195 if (d) | |
| 9196 { fprintf(fout,"\n\tthis->%s = NULL;", ident(p->sym->name)); | |
| 9197 for (i = 0; i < d; i++) | |
| 9198 { fprintf(fout,"\n\tthis->__size[%d] = 0;", i); | |
| 9199 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) | |
| 9200 fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); | |
| 9201 } | |
| 9202 } | |
| 9203 else | |
| 9204 { fprintf(fout,"\n\tthis->__size = 0;\n\tthis->%s = NULL;", ident(p->sym->name)); | |
| 9205 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) | |
| 9206 fprintf(fout, "\n\tthis->__offset = 0;"); | |
| 9207 } | |
| 9208 if (is_attachment(typ)) | |
| 9209 fprintf(fout,"\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); | |
| 9210 fprintf(fout,"\n}"); | |
| 9211 } | |
| 9212 else | |
| 9213 { if (is_external(typ)) | |
| 9214 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9215 return; | |
| 9216 } | |
| 9217 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9218 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")); | |
| 9219 if ((s = has_soapref(typ))) | |
| 9220 fprintf(fout,"\n\ta->%s = soap;", s); | |
| 9221 else | |
| 9222 fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); | |
| 9223 d = get_Darraydims(typ); | |
| 9224 if (d) | |
| 9225 { fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name)); | |
| 9226 for (i = 0; i < d; i++) | |
| 9227 { fprintf(fout,"\n\ta->__size[%d] = 0;", i); | |
| 9228 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) | |
| 9229 fprintf(fout, "\n\ta->__offset[%d] = 0;", i); | |
| 9230 } | |
| 9231 } | |
| 9232 else | |
| 9233 { fprintf(fout,"\n\ta->__size = 0;\n\ta->%s = NULL;", ident(p->sym->name)); | |
| 9234 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) | |
| 9235 fprintf(fout, "\n\ta->__offset = 0;"); | |
| 9236 } | |
| 9237 if (is_attachment(typ)) | |
| 9238 fprintf(fout,"\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); | |
| 9239 fprintf(fout,"\n}"); | |
| 9240 } | |
| 9241 fflush(fout); | |
| 9242 return; | |
| 9243 } | |
| 9244 if (is_primitive(typ) || is_string(typ)) | |
| 9245 { if (is_external(typ)) | |
| 9246 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9247 return; | |
| 9248 } | |
| 9249 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9250 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)); | |
| 9251 return; | |
| 9252 } | |
| 9253 if (is_fixedstring(typ)) | |
| 9254 { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);",c_ident(typ)); | |
| 9255 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)); | |
| 9256 return; | |
| 9257 } | |
| 9258 if (is_stdstring(typ) || is_stdwstring(typ)) | |
| 9259 { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9260 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")); | |
| 9261 return; | |
| 9262 } | |
| 9263 switch(typ->type) | |
| 9264 { | |
| 9265 case Tclass: | |
| 9266 /* CLASS */ | |
| 9267 if (!is_volatile(typ)) | |
| 9268 { | |
| 9269 if (is_external(typ)) | |
| 9270 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9271 return; | |
| 9272 } | |
| 9273 table=(Table*)typ->ref; | |
| 9274 fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); | |
| 9275 if ((s = has_soapref(typ))) | |
| 9276 fprintf(fout,"\n\tthis->%s = soap;", s); | |
| 9277 else | |
| 9278 fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); | |
| 9279 | |
| 9280 fflush(fout); | |
| 9281 if (table) | |
| 9282 { | |
| 9283 t = table->prev; | |
| 9284 if (t) | |
| 9285 fprintf(fout,"\n\tthis->%s::soap_default(soap);", ident(t->sym->name)); | |
| 9286 for (p = table->list; p; p = p->next) | |
| 9287 { if (p->info.typ->type == Tfun) | |
| 9288 continue; | |
| 9289 if (p->info.sto & Sconst) | |
| 9290 fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); | |
| 9291 else if (is_choice(p)) | |
| 9292 { fprintf(fout, "\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name)); | |
| 9293 p = p->next; | |
| 9294 } | |
| 9295 else if (is_repetition(p) || is_anytype(p)) | |
| 9296 { 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)); | |
| 9297 p = p->next; | |
| 9298 } | |
| 9299 else | |
| 9300 { | |
| 9301 if (is_fixedstring(p->info.typ)) | |
| 9302 { if (p->info.hasval) | |
| 9303 fprintf(fout,"\n\tstrcpy(this->%s::%s, \"%s\");", ident(table->sym->name), ident(p->sym->name), cstring(p->info.val.s)); | |
| 9304 else | |
| 9305 fprintf(fout,"\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); | |
| 9306 } | |
| 9307 else if (p->info.typ->type == Tarray){ | |
| 9308 fprintf(fout,"\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); | |
| 9309 } | |
| 9310 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)) | |
| 9311 fprintf(fout,"\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); | |
| 9312 else if (p->info.hasval) | |
| 9313 { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) | |
| 9314 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)); | |
| 9315 else | |
| 9316 fprintf(fout,"\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); | |
| 9317 } | |
| 9318 else if (is_transient(p->info.typ) || is_void(p->info.typ)) | |
| 9319 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 9320 else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ))) | |
| 9321 fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); | |
| 9322 else if (p->info.sto & (Sprivate | Sprotected)) | |
| 9323 { if (p->info.typ->type == Tpointer) | |
| 9324 fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); | |
| 9325 else if (p->info.typ->type >= Tchar && p->info.typ->type < Tenum) | |
| 9326 fprintf(fout,"\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name)); | |
| 9327 else if (p->info.typ->type == Tenum) | |
| 9328 fprintf(fout,"\n\tthis->%s::%s = (%s)0;", ident(table->sym->name), ident(p->sym->name), c_type(p->info.typ)); | |
| 9329 else | |
| 9330 fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); | |
| 9331 } | |
| 9332 else | |
| 9333 fprintf(fout,"\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); | |
| 9334 } | |
| 9335 } | |
| 9336 } | |
| 9337 fprintf(fout,"\n}"); | |
| 9338 fflush(fout); | |
| 9339 break; | |
| 9340 } | |
| 9341 | |
| 9342 case Tstruct: | |
| 9343 table=(Table*)typ->ref; | |
| 9344 | |
| 9345 if (is_external(typ) && !is_volatile(typ)) | |
| 9346 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9347 return; | |
| 9348 } | |
| 9349 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9350 fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "*a")); | |
| 9351 fflush(fout); | |
| 9352 if ((s = has_soapref(typ))) | |
| 9353 fprintf(fout,"\n\ta->%s = soap;", s); | |
| 9354 else | |
| 9355 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 9356 if (table) | |
| 9357 { | |
| 9358 for (t = table; t; t = t->prev) | |
| 9359 { for (p = t->list; p; p = p->next) | |
| 9360 { if (p->info.typ->type == Tfun) | |
| 9361 continue; | |
| 9362 if (p->info.sto & Sconst) | |
| 9363 fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); | |
| 9364 else if (p->info.sto & (Sprivate | Sprotected)) | |
| 9365 fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); | |
| 9366 else if (is_choice(p)) | |
| 9367 { fprintf(fout, "\n\ta->%s = 0;", ident(p->sym->name)); | |
| 9368 p = p->next; | |
| 9369 } | |
| 9370 else if (is_repetition(p) || is_anytype(p)) | |
| 9371 { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); | |
| 9372 p = p->next; | |
| 9373 } | |
| 9374 else | |
| 9375 { | |
| 9376 if (is_fixedstring(p->info.typ)) | |
| 9377 { if (p->info.hasval) | |
| 9378 fprintf(fout,"\n\tstrcpy(a->%s, \"%s\");", ident(p->sym->name), cstring(p->info.val.s)); | |
| 9379 else | |
| 9380 fprintf(fout,"\n\ta->%s[0] = '\\0';", ident(p->sym->name)); | |
| 9381 } | |
| 9382 else if (p->info.typ->type==Tarray) | |
| 9383 fprintf(fout,"\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); | |
| 9384 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)) | |
| 9385 fprintf(fout,"\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); | |
| 9386 else if (p->info.hasval) | |
| 9387 { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) | |
| 9388 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)); | |
| 9389 else | |
| 9390 fprintf(fout,"\n\ta->%s%s;", ident(p->sym->name), c_init(p)); | |
| 9391 } | |
| 9392 else if (is_transient(p->info.typ) || is_void(p->info.typ)) | |
| 9393 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 9394 else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ))) | |
| 9395 fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name)); | |
| 9396 else | |
| 9397 fprintf(fout,"\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); | |
| 9398 } | |
| 9399 } | |
| 9400 } | |
| 9401 } | |
| 9402 fprintf(fout,"\n}"); | |
| 9403 fflush(fout); | |
| 9404 break; | |
| 9405 case Tarray: | |
| 9406 if (is_external(typ)) | |
| 9407 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ)); | |
| 9408 return; | |
| 9409 } | |
| 9410 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ)); | |
| 9411 fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "a")); | |
| 9412 fprintf(fout,"\n\tint i;"); | |
| 9413 fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); | |
| 9414 fprintf(fout,"\n\tfor (i = 0; i < %d; i++)",get_dimension(typ)); | |
| 9415 temp = (Tnode*)typ->ref; | |
| 9416 cardinality = 1; | |
| 9417 while(temp->type==Tarray) | |
| 9418 { | |
| 9419 temp=(Tnode*)temp->ref; | |
| 9420 cardinality++; | |
| 9421 } | |
| 9422 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) | |
| 9423 { | |
| 9424 if (cardinality>1) | |
| 9425 fprintf(fout,"a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); | |
| 9426 else | |
| 9427 fprintf(fout,"(a+i)->soap_default(soap)"); | |
| 9428 } | |
| 9429 else if (((Tnode*)typ->ref)->type == Tpointer) | |
| 9430 fprintf(fout,"\n\ta[i] = NULL"); | |
| 9431 else | |
| 9432 { | |
| 9433 fprintf(fout,"\n\tsoap_default_%s(soap, a",c_ident((Tnode*)typ->ref)); | |
| 9434 if (cardinality>1) | |
| 9435 fprintf(fout,"[i])"); | |
| 9436 else | |
| 9437 fprintf(fout,"+i)"); | |
| 9438 } | |
| 9439 fprintf(fout,";\n}"); | |
| 9440 break; | |
| 9441 | |
| 9442 case Ttemplate: | |
| 9443 if (is_external(typ)) | |
| 9444 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9445 return; | |
| 9446 } | |
| 9447 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 9448 fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{",c_ident(typ),c_type_id(typ, "*p")); | |
| 9449 fprintf(fout,"\n\tp->clear();"); | |
| 9450 fprintf(fout,"\n}"); | |
| 9451 fflush(fout); | |
| 9452 break; | |
| 9453 default :break; | |
| 9454 } | |
| 9455 } | |
| 9456 | |
| 9457 void | |
| 9458 soap_traverse(Tnode* typ) | |
| 9459 { int d; | |
| 9460 Table *table,*t; | |
| 9461 Entry *p; | |
| 9462 Tnode* temp; | |
| 9463 int cardinality; | |
| 9464 if (is_primitive_or_string(typ) || is_fixedstring(typ)) | |
| 9465 { 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, "*")); | |
| 9466 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")); | |
| 9467 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9468 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); | |
| 9469 return; | |
| 9470 } | |
| 9471 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)) | |
| 9472 if (is_typedef(typ) && !is_external(typ)) | |
| 9473 { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) | |
| 9474 fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n",c_ident(typ)); | |
| 9475 else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) | |
| 9476 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)); | |
| 9477 else | |
| 9478 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)); | |
| 9479 return; | |
| 9480 } | |
| 9481 if (is_XML(typ)) | |
| 9482 { 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)); | |
| 9483 return; | |
| 9484 } | |
| 9485 if ((p = is_dynamic_array(typ))) | |
| 9486 { if (typ->type == Tclass && !is_volatile(typ)) | |
| 9487 { if (is_external(typ)) | |
| 9488 return; | |
| 9489 fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ)); | |
| 9490 if (is_binary(typ)) | |
| 9491 { 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)); | |
| 9492 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9493 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); | |
| 9494 if (is_attachment(typ)) | |
| 9495 { fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); | |
| 9496 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); | |
| 9497 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); | |
| 9498 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); | |
| 9499 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); | |
| 9500 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); | |
| 9501 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); | |
| 9502 } | |
| 9503 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); | |
| 9504 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); | |
| 9505 fflush(fout); | |
| 9506 return; | |
| 9507 } | |
| 9508 else | |
| 9509 { | |
| 9510 d = get_Darraydims(typ); | |
| 9511 if (d) | |
| 9512 { 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)); | |
| 9513 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9514 fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d); | |
| 9515 } | |
| 9516 else | |
| 9517 { 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)); | |
| 9518 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9519 fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)"); | |
| 9520 } | |
| 9521 fprintf(fout,"\n\t\t{"); | |
| 9522 if (has_ptr((Tnode*)p->info.typ->ref)) | |
| 9523 fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); | |
| 9524 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)) | |
| 9525 fprintf(fout,"\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); | |
| 9526 else | |
| 9527 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)); | |
| 9528 fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9529 fprintf(fout,"\n\t}\n}"); | |
| 9530 return; | |
| 9531 } | |
| 9532 } | |
| 9533 else | |
| 9534 { if (is_external(typ)) | |
| 9535 { 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, "*")); | |
| 9536 return; | |
| 9537 } | |
| 9538 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, "*")); | |
| 9539 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")); | |
| 9540 if (is_binary(typ)) | |
| 9541 { 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)); | |
| 9542 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9543 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); | |
| 9544 if (is_attachment(typ)) | |
| 9545 { fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); | |
| 9546 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); | |
| 9547 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); | |
| 9548 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); | |
| 9549 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); | |
| 9550 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); | |
| 9551 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); | |
| 9552 } | |
| 9553 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); | |
| 9554 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); | |
| 9555 fflush(fout); | |
| 9556 return; | |
| 9557 } | |
| 9558 else | |
| 9559 { | |
| 9560 fprintf(fout,"\n\tint i;"); | |
| 9561 d = get_Darraydims(typ); | |
| 9562 if (d) | |
| 9563 { 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)); | |
| 9564 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9565 fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); | |
| 9566 } | |
| 9567 else | |
| 9568 { 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)); | |
| 9569 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9570 fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)"); | |
| 9571 } | |
| 9572 fprintf(fout,"\n\t\t{"); | |
| 9573 if (has_ptr((Tnode*)p->info.typ->ref)) | |
| 9574 fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); | |
| 9575 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)) | |
| 9576 fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); | |
| 9577 else | |
| 9578 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); | |
| 9579 fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9580 fprintf(fout,"\n\t}\n}"); | |
| 9581 fflush(fout); | |
| 9582 return; | |
| 9583 } | |
| 9584 } | |
| 9585 } | |
| 9586 switch(typ->type) | |
| 9587 { | |
| 9588 case Tclass: | |
| 9589 if (!is_volatile(typ)) | |
| 9590 { | |
| 9591 if (is_external(typ)) | |
| 9592 { 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, "*")); | |
| 9593 return; | |
| 9594 } | |
| 9595 table=(Table*)typ->ref; | |
| 9596 fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); | |
| 9597 fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); | |
| 9598 fprintf(fout,"\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9599 for (t = table; t; t = t->prev) | |
| 9600 { | |
| 9601 for (p = t->list; p; p = p->next) { | |
| 9602 if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 9603 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 9604 else if (is_transient(p->info.typ)) | |
| 9605 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 9606 else if (p->info.sto & Sattribute) | |
| 9607 ; | |
| 9608 else if (is_repetition(p)) | |
| 9609 { | |
| 9610 fprintf(fout,"\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); | |
| 9611 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)); | |
| 9612 if (!is_invisible(p->next->sym->name)) | |
| 9613 if (has_ptr((Tnode*)p->next->info.typ->ref)) | |
| 9614 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)); | |
| 9615 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)) | |
| 9616 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); | |
| 9617 else | |
| 9618 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); | |
| 9619 fprintf(fout,"\n\t\t}\n\t}"); | |
| 9620 p = p->next; | |
| 9621 } | |
| 9622 else if (is_anytype(p)) | |
| 9623 { p = p->next; | |
| 9624 } | |
| 9625 else if (is_choice(p)) | |
| 9626 { 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); | |
| 9627 p = p->next; | |
| 9628 } | |
| 9629 else if(p->info.typ->type==Tarray) | |
| 9630 { | |
| 9631 if (has_ptr(p->info.typ)) | |
| 9632 fprintf(fout,"\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); | |
| 9633 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); | |
| 9634 } | |
| 9635 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 9636 { | |
| 9637 if (has_ptr(p->info.typ)) | |
| 9638 fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); | |
| 9639 fprintf(fout,"\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); | |
| 9640 } | |
| 9641 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 9642 { | |
| 9643 if (!is_template(p->info.typ)) | |
| 9644 if (has_ptr(p->info.typ)) | |
| 9645 fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); | |
| 9646 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); | |
| 9647 } | |
| 9648 } | |
| 9649 } | |
| 9650 fprintf(fout,"\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9651 fprintf(fout,"\n}"); | |
| 9652 break; | |
| 9653 } | |
| 9654 case Tstruct: | |
| 9655 if (is_external(typ) && !is_volatile(typ)) | |
| 9656 { 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, "*")); | |
| 9657 return; | |
| 9658 } | |
| 9659 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, "*")); | |
| 9660 if (!typ->ref) | |
| 9661 return; | |
| 9662 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")); | |
| 9663 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 9664 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9665 table=(Table*)typ->ref; | |
| 9666 for (t = table; t; t = t->prev) | |
| 9667 { for (p = t->list; p; p = p->next) | |
| 9668 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 9669 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 9670 else if (is_transient(p->info.typ)) | |
| 9671 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 9672 else if (p->info.sto & Sattribute) | |
| 9673 ; | |
| 9674 else if (is_repetition(p)) | |
| 9675 { | |
| 9676 fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); | |
| 9677 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name)); | |
| 9678 if (!is_invisible(p->next->sym->name)) | |
| 9679 if (has_ptr((Tnode*)p->next->info.typ->ref)) | |
| 9680 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)); | |
| 9681 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)) | |
| 9682 fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); | |
| 9683 else | |
| 9684 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); | |
| 9685 fprintf(fout,"\n\t\t}\n\t}"); | |
| 9686 p = p->next; | |
| 9687 } | |
| 9688 else if (is_anytype(p)) | |
| 9689 { p = p->next; | |
| 9690 } | |
| 9691 else if (is_choice(p)) | |
| 9692 { 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); | |
| 9693 p = p->next; | |
| 9694 } | |
| 9695 else if(p->info.typ->type==Tarray) | |
| 9696 { | |
| 9697 if (has_ptr(p->info.typ)) | |
| 9698 fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9699 fprintf(fout,"\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); | |
| 9700 } | |
| 9701 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 9702 { | |
| 9703 if (has_ptr(p->info.typ)) | |
| 9704 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9705 fprintf(fout,"\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); | |
| 9706 } | |
| 9707 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 9708 { | |
| 9709 if (!is_template(p->info.typ)) | |
| 9710 if (has_ptr(p->info.typ)) | |
| 9711 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9712 fprintf(fout,"\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); | |
| 9713 } | |
| 9714 } | |
| 9715 } | |
| 9716 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9717 fprintf(fout,"\n}"); | |
| 9718 break; | |
| 9719 case Tunion: | |
| 9720 if (is_external(typ) && !is_volatile(typ)) | |
| 9721 { 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, "*")); | |
| 9722 return; | |
| 9723 } | |
| 9724 table=(Table*)typ->ref; | |
| 9725 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, "*")); | |
| 9726 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")); | |
| 9727 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 9728 fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9729 fprintf(fout, "\n\tswitch (choice)\n\t{"); | |
| 9730 for (t = table; t; t = t->prev) | |
| 9731 { for (p = t->list; p; p = p->next) | |
| 9732 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 9733 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 9734 else if (is_transient(p->info.typ)) | |
| 9735 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 9736 else if (p->info.sto & Sattribute) | |
| 9737 ; | |
| 9738 else if (is_repetition(p)) | |
| 9739 ; | |
| 9740 else if (is_anytype(p)) | |
| 9741 ; | |
| 9742 else if (p->info.typ->type==Tarray) | |
| 9743 { | |
| 9744 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 9745 if (has_ptr(p->info.typ)) | |
| 9746 fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9747 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); | |
| 9748 fprintf(fout, "\n\t\tbreak;"); | |
| 9749 } | |
| 9750 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 9751 { | |
| 9752 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 9753 if (has_ptr(p->info.typ)) | |
| 9754 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9755 fprintf(fout,"\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); | |
| 9756 fprintf(fout, "\n\t\tbreak;"); | |
| 9757 } | |
| 9758 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 9759 { | |
| 9760 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 9761 if (has_ptr(p->info.typ)) | |
| 9762 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); | |
| 9763 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); | |
| 9764 fprintf(fout, "\n\t\tbreak;"); | |
| 9765 } | |
| 9766 } | |
| 9767 } | |
| 9768 fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}"); | |
| 9769 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9770 fprintf(fout,"\n}"); | |
| 9771 break; | |
| 9772 case Tpointer: | |
| 9773 if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 9774 { if (is_external(typ)) | |
| 9775 { 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, "*")); | |
| 9776 return; | |
| 9777 } | |
| 9778 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, "*")); | |
| 9779 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")); | |
| 9780 p = is_dynamic_array((Tnode*)typ->ref); | |
| 9781 if (p) | |
| 9782 { d = get_Darraydims((Tnode*)typ->ref); | |
| 9783 if (d) | |
| 9784 fprintf(fout,"\n\tif (*a)"); | |
| 9785 else | |
| 9786 fprintf(fout,"\n\tif (*a)"); | |
| 9787 } | |
| 9788 else | |
| 9789 fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); | |
| 9790 fprintf(fout,"\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); | |
| 9791 break; | |
| 9792 } | |
| 9793 else | |
| 9794 { | |
| 9795 if (is_external(typ)) | |
| 9796 { 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, "*")); | |
| 9797 return; | |
| 9798 } | |
| 9799 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, "*")); | |
| 9800 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")); | |
| 9801 if (is_primitive((Tnode*)typ->ref)) | |
| 9802 { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); | |
| 9803 fprintf(fout,"\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type(typ->ref), c_type(typ->ref)); | |
| 9804 fprintf(fout,"\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type(typ->ref), c_type(typ->ref)); | |
| 9805 } | |
| 9806 else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) | |
| 9807 { d = get_Darraydims((Tnode*)typ->ref); | |
| 9808 if (d) | |
| 9809 fprintf(fout,"\n\tif (*a)"); | |
| 9810 else | |
| 9811 fprintf(fout,"\n\tif (*a)"); | |
| 9812 fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); | |
| 9813 } | |
| 9814 else | |
| 9815 { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); | |
| 9816 fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); | |
| 9817 } | |
| 9818 break; | |
| 9819 } | |
| 9820 case Tarray: | |
| 9821 if (is_external(typ)) | |
| 9822 { 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)); | |
| 9823 return; | |
| 9824 } | |
| 9825 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)); | |
| 9826 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")); | |
| 9827 if (is_primitive((Tnode*)typ->ref)) | |
| 9828 { fprintf(fout, "\n{"); | |
| 9829 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); | |
| 9830 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9831 } | |
| 9832 else | |
| 9833 { fprintf(fout,"\n{\tint i;"); | |
| 9834 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9835 fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ)); | |
| 9836 | |
| 9837 temp=(Tnode*)typ->ref;; | |
| 9838 cardinality = 1; | |
| 9839 while(temp->type==Tarray) | |
| 9840 { | |
| 9841 temp=(Tnode*)temp->ref; | |
| 9842 cardinality++; | |
| 9843 } | |
| 9844 fprintf(fout,"\n\t{"); | |
| 9845 if (has_ptr((Tnode*)typ->ref)) | |
| 9846 { | |
| 9847 fprintf(fout,"\tsoap_embedded(soap, a"); | |
| 9848 if(cardinality > 1) | |
| 9849 fprintf(fout,"[i]"); | |
| 9850 else | |
| 9851 fprintf(fout,"+i"); | |
| 9852 fprintf(fout,", %s);", soap_type((Tnode*)typ->ref)); | |
| 9853 } | |
| 9854 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 9855 { fprintf(fout,"\n\ta[i].soap_traverse(soap, s, p, q)"); | |
| 9856 } | |
| 9857 else if (!is_primitive((Tnode*)typ->ref)) | |
| 9858 { fprintf(fout,"\n\tsoap_traverse_%s(soap, a",c_ident((Tnode*)typ->ref)); | |
| 9859 if(cardinality > 1) | |
| 9860 fprintf(fout,"[i], s, p, q)"); | |
| 9861 else | |
| 9862 fprintf(fout,"+i, s, p, q)"); | |
| 9863 } | |
| 9864 fprintf(fout,";\n\t}"); | |
| 9865 } | |
| 9866 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9867 fprintf(fout,"\n}"); | |
| 9868 break; | |
| 9869 case Ttemplate: | |
| 9870 if (is_external(typ)) | |
| 9871 { 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, "*")); | |
| 9872 return; | |
| 9873 } | |
| 9874 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, "*")); | |
| 9875 temp = (Tnode*)typ->ref; | |
| 9876 if (!temp) | |
| 9877 return; | |
| 9878 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")); | |
| 9879 if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) | |
| 9880 { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9881 fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); | |
| 9882 if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) | |
| 9883 fprintf(fout,"\n\t\t(*i).soap_traverse(soap, s, p, q);"); | |
| 9884 else | |
| 9885 fprintf(fout,"\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); | |
| 9886 fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); | |
| 9887 } | |
| 9888 fprintf(fout, "\n}"); | |
| 9889 default: break; | |
| 9890 } | |
| 9891 } | |
| 9892 | |
| 9893 void | |
| 9894 soap_put(Tnode *typ) | |
| 9895 { int d; | |
| 9896 Entry *p; | |
| 9897 char *ci = c_ident(typ); | |
| 9898 char *ct = c_type(typ); | |
| 9899 char *ctp = c_type_id(typ, "*"); | |
| 9900 char *ctpa = c_type_id(typ, "*a"); | |
| 9901 char *ctc = c_type_id(typ, "const"); | |
| 9902 char *ctca = c_type_id(typ, "const a"); | |
| 9903 char *ctcp = c_type_id(typ, "const*"); | |
| 9904 char *ctcpa = c_type_id(typ, "const*a"); | |
| 9905 | |
| 9906 if (typ->type == Ttemplate || typ->type == Tunion) | |
| 9907 return; | |
| 9908 | |
| 9909 if (is_typedef(typ) && is_element(typ)) | |
| 9910 { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); | |
| 9911 return; | |
| 9912 } | |
| 9913 | |
| 9914 if (typ->type == Tarray) | |
| 9915 { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctc); | |
| 9916 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctca); | |
| 9917 } | |
| 9918 else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) | |
| 9919 fprintf(fout,"\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); | |
| 9920 else if (typ->type == Tpointer) | |
| 9921 { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctcp); | |
| 9922 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctcpa); | |
| 9923 } | |
| 9924 else | |
| 9925 { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci,ctp); | |
| 9926 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); | |
| 9927 } | |
| 9928 fflush(fout); | |
| 9929 fprintf(fout,"\n\tregister int id = "); | |
| 9930 if (is_invisible(typ->id->name)) | |
| 9931 fprintf(fout,"0;"); | |
| 9932 else if ((p = is_dynamic_array(typ)) != NULL) | |
| 9933 { d = get_Darraydims(typ); | |
| 9934 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) | |
| 9935 { if (d) | |
| 9936 fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ)); | |
| 9937 else | |
| 9938 fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ)); | |
| 9939 } | |
| 9940 else if (d) | |
| 9941 fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ)); | |
| 9942 else | |
| 9943 fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ)); | |
| 9944 } | |
| 9945 else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) | |
| 9946 fprintf(fout,"soap_embed(soap, (void*)this, NULL, 0, tag, %s);", soap_type(typ)); | |
| 9947 else | |
| 9948 fprintf(fout,"soap_embed(soap, (void*)a, NULL, 0, tag, %s);", soap_type(typ)); | |
| 9949 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) | |
| 9950 fprintf(fout,"\n\tif (this->soap_out(soap, tag?tag:\"%s\", id, type))\n\t\treturn soap->error;", xml_tag(typ)); | |
| 9951 else | |
| 9952 fprintf(fout,"\n\tif (soap_out_%s(soap, tag?tag:\"%s\", id, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); | |
| 9953 if (!is_invisible(typ->id->name)) | |
| 9954 fprintf(fout,"\n\treturn soap_putindependent(soap);\n}"); | |
| 9955 else | |
| 9956 fprintf(fout,"\n\treturn SOAP_OK;\n}"); | |
| 9957 #if 0 | |
| 9958 /* some compilers cannot handle this inlined function */ | |
| 9959 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) | |
| 9960 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)); | |
| 9961 else if (typ->type != Treference) | |
| 9962 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)); | |
| 9963 #endif | |
| 9964 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) | |
| 9965 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)); | |
| 9966 else if (is_primitive(typ)) | |
| 9967 { if ((!is_external(typ) || Qflag) && namespaceid) | |
| 9968 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)); | |
| 9969 else | |
| 9970 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)); | |
| 9971 } | |
| 9972 else if (typ->type != Treference) | |
| 9973 { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid) | |
| 9974 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)); | |
| 9975 else | |
| 9976 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)); | |
| 9977 } | |
| 9978 fflush(fout); | |
| 9979 } | |
| 9980 | |
| 9981 Entry * | |
| 9982 is_dynamic_array(Tnode *typ) | |
| 9983 { Entry *p; | |
| 9984 Table *t; | |
| 9985 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) | |
| 9986 { for (t = (Table*)typ->ref; t; t = t->prev) | |
| 9987 { p = t->list; | |
| 9988 while (p && p->info.typ->type == Tfun) | |
| 9989 p = p->next; | |
| 9990 if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5)) | |
| 9991 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")) | |
| 9992 return p; | |
| 9993 } | |
| 9994 } | |
| 9995 return 0; | |
| 9996 } | |
| 9997 | |
| 9998 Entry * | |
| 9999 is_discriminant(Tnode *typ) | |
| 10000 { Entry *p; | |
| 10001 Table *t; | |
| 10002 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) | |
| 10003 { t = (Table*)typ->ref; | |
| 10004 /* only if this struct/class has a union and is not derived */ | |
| 10005 if (t && !t->prev) | |
| 10006 { p = t->list; | |
| 10007 if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) | |
| 10008 if (p->next && p->next->info.typ->type == Tunion) | |
| 10009 { Entry *q; | |
| 10010 for (q = p->next->next; q; q = q->next) | |
| 10011 { if (q->info.typ->type != Tfun | |
| 10012 && !is_void(q->info.typ) | |
| 10013 && !is_transient(q->info.typ)) | |
| 10014 return NULL; | |
| 10015 } | |
| 10016 return p; | |
| 10017 } | |
| 10018 } | |
| 10019 } | |
| 10020 return NULL; | |
| 10021 } | |
| 10022 | |
| 10023 int | |
| 10024 get_Darraydims(Tnode *typ) | |
| 10025 { Entry *p; | |
| 10026 Table *t; | |
| 10027 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) | |
| 10028 { for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10029 { p = t->list; | |
| 10030 while (p && p->info.typ->type == Tfun) | |
| 10031 p = p->next; | |
| 10032 if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5)) | |
| 10033 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")) | |
| 10034 return get_dimension(p->next->info.typ); | |
| 10035 } | |
| 10036 } | |
| 10037 return 0; | |
| 10038 } | |
| 10039 | |
| 10040 int | |
| 10041 has_offset(Tnode *typ) | |
| 10042 { Entry *p; | |
| 10043 Table *t; | |
| 10044 if (typ->type == Tstruct || typ->type == Tclass) | |
| 10045 { for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10046 { for (p = t->list; p; p = p->next) | |
| 10047 { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) | |
| 10048 return 1; | |
| 10049 } | |
| 10050 } | |
| 10051 } | |
| 10052 return 0; | |
| 10053 } | |
| 10054 | |
| 10055 int | |
| 10056 is_boolean(Tnode *typ) | |
| 10057 { if (typ->type == Tenum) | |
| 10058 { if ((Table*)typ->ref == booltable) | |
| 10059 return 1; | |
| 10060 else | |
| 10061 { size_t n = strlen(ident(typ->id->name)); | |
| 10062 return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); | |
| 10063 } | |
| 10064 } | |
| 10065 return 0; | |
| 10066 } | |
| 10067 | |
| 10068 int | |
| 10069 is_hexBinary(Tnode *typ) | |
| 10070 { Entry *p; | |
| 10071 Table *t; | |
| 10072 size_t n = strlen(ident(typ->id->name)); | |
| 10073 if ((typ->type == Tstruct || typ->type == Tclass) && n >= 9 && is_eq(ident(typ->id->name) + n - 9, "hexBinary")) | |
| 10074 { for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10075 { p = t->list; | |
| 10076 while (p && p->info.typ->type == Tfun) | |
| 10077 p = p->next; | |
| 10078 if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) | |
| 10079 { p = p->next; | |
| 10080 return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size"); | |
| 10081 } | |
| 10082 } | |
| 10083 } | |
| 10084 return 0; | |
| 10085 } | |
| 10086 | |
| 10087 int | |
| 10088 is_binary(Tnode *typ) | |
| 10089 { Entry *p; | |
| 10090 Table *t; | |
| 10091 if (!has_ns(typ) && !is_element(typ)) | |
| 10092 return 0; | |
| 10093 if (typ->type == Tstruct || typ->type == Tclass) | |
| 10094 { for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10095 { p = t->list; | |
| 10096 while (p && p->info.typ->type == Tfun) | |
| 10097 p = p->next; | |
| 10098 if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) | |
| 10099 { p = p->next; | |
| 10100 return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size"); | |
| 10101 } | |
| 10102 } | |
| 10103 } | |
| 10104 return 0; | |
| 10105 } | |
| 10106 | |
| 10107 int | |
| 10108 is_attachment(Tnode *typ) | |
| 10109 { Entry *p; | |
| 10110 Table *t; | |
| 10111 if (!is_binary(typ) || is_transient(typ)) | |
| 10112 return 0; | |
| 10113 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10114 { for (p = t->list; p; p = p->next) | |
| 10115 { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) | |
| 10116 { p = p->next; | |
| 10117 if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) | |
| 10118 break; | |
| 10119 p = p->next; | |
| 10120 if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) | |
| 10121 break; | |
| 10122 return 1; | |
| 10123 } | |
| 10124 } | |
| 10125 } | |
| 10126 return 0; | |
| 10127 } | |
| 10128 | |
| 10129 int | |
| 10130 has_attachment(Tnode *typ) | |
| 10131 { if (is_attachment(typ)) | |
| 10132 return 1; | |
| 10133 if (typ->type == Tstruct || typ->type == Tclass) | |
| 10134 { Entry *p; | |
| 10135 Table *t; | |
| 10136 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10137 { for (p = t->list; p; p = p->next) | |
| 10138 if (has_attachment(p->info.typ)) | |
| 10139 return 1; | |
| 10140 } | |
| 10141 } | |
| 10142 return 0; | |
| 10143 } | |
| 10144 | |
| 10145 int | |
| 10146 is_mutable(Tnode *typ) | |
| 10147 { return is_header_or_fault(typ); | |
| 10148 } | |
| 10149 | |
| 10150 int | |
| 10151 is_header_or_fault(Tnode *typ) | |
| 10152 { if (typ->type == Tpointer || typ->type == Treference) | |
| 10153 return is_header_or_fault((Tnode*)typ->ref); | |
| 10154 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")); | |
| 10155 } | |
| 10156 | |
| 10157 int | |
| 10158 is_body(Tnode *typ) | |
| 10159 { if (typ->type == Tpointer || typ->type == Treference) | |
| 10160 return is_body((Tnode*)typ->ref); | |
| 10161 return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); | |
| 10162 } | |
| 10163 | |
| 10164 long | |
| 10165 minlen(Tnode *typ) | |
| 10166 { if (typ->minLength < 0 || (typ->maxLength >> 31) != 0) | |
| 10167 return 0; | |
| 10168 return (long)typ->minLength; | |
| 10169 } | |
| 10170 | |
| 10171 long | |
| 10172 maxlen(Tnode *typ) | |
| 10173 { if (typ->maxLength < 0 || (typ->maxLength >> 31) != 0) | |
| 10174 return -1; | |
| 10175 return (long)typ->maxLength; | |
| 10176 } | |
| 10177 | |
| 10178 int | |
| 10179 is_soap12(const char *enc) | |
| 10180 { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); | |
| 10181 } | |
| 10182 | |
| 10183 int | |
| 10184 is_document(const char *style) | |
| 10185 { return vflag < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); | |
| 10186 } | |
| 10187 | |
| 10188 int | |
| 10189 is_literal(const char *encoding) | |
| 10190 { return vflag < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); | |
| 10191 } | |
| 10192 | |
| 10193 char * | |
| 10194 has_soapref(Tnode *typ) | |
| 10195 { Entry *p; | |
| 10196 Table *t; | |
| 10197 if (typ->type == Tstruct || typ->type == Tclass) | |
| 10198 { for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10199 { for (p = t->list; p; p = p->next) | |
| 10200 if (p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tstruct && ((Tnode*)p->info.typ->ref)->id == lookup("soap")) | |
| 10201 return ident(p->sym->name); | |
| 10202 } | |
| 10203 } | |
| 10204 return NULL; | |
| 10205 } | |
| 10206 | |
| 10207 int | |
| 10208 has_constructor(Tnode *typ) | |
| 10209 { Entry *p, *q; | |
| 10210 Table *t; | |
| 10211 if (typ->type == Tclass || typ->type == Tstruct) | |
| 10212 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10213 for (p = t->list; p; p = p->next) | |
| 10214 if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) | |
| 10215 { q = ((FNinfo*)p->info.typ->ref)->args->list; | |
| 10216 if (!q) | |
| 10217 return 1; | |
| 10218 } | |
| 10219 return 0; | |
| 10220 } | |
| 10221 | |
| 10222 int | |
| 10223 has_destructor(Tnode *typ) | |
| 10224 { Entry *p; | |
| 10225 Table *t; | |
| 10226 if (typ->type == Tclass || typ->type == Tstruct) | |
| 10227 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10228 for (p = t->list; p; p = p->next) | |
| 10229 if (p->info.typ->type == Tfun && *p->sym->name == '~') | |
| 10230 return 1; | |
| 10231 return 0; | |
| 10232 } | |
| 10233 | |
| 10234 int | |
| 10235 has_getter(Tnode *typ) | |
| 10236 { Entry *p, *q; | |
| 10237 Table *t; | |
| 10238 if (typ->type == Tclass) | |
| 10239 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10240 for (p = t->list; p; p = p->next) | |
| 10241 if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) | |
| 10242 { q = ((FNinfo*)p->info.typ->ref)->args->list; | |
| 10243 if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) | |
| 10244 return 1; | |
| 10245 } | |
| 10246 return 0; | |
| 10247 } | |
| 10248 | |
| 10249 int | |
| 10250 has_setter(Tnode *typ) | |
| 10251 { Entry *p, *q; | |
| 10252 Table *t; | |
| 10253 if (typ->type == Tclass) | |
| 10254 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 10255 for (p = t->list; p; p = p->next) | |
| 10256 if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) | |
| 10257 { q = ((FNinfo*)p->info.typ->ref)->args->list; | |
| 10258 if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) | |
| 10259 return 1; | |
| 10260 } | |
| 10261 return 0; | |
| 10262 } | |
| 10263 | |
| 10264 int | |
| 10265 is_primitive_or_string(Tnode *typ) | |
| 10266 { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); | |
| 10267 } | |
| 10268 | |
| 10269 int | |
| 10270 is_primitive(Tnode *typ) | |
| 10271 { return typ->type <= Tenum; | |
| 10272 } | |
| 10273 | |
| 10274 int | |
| 10275 is_string(Tnode *typ) | |
| 10276 { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; | |
| 10277 } | |
| 10278 | |
| 10279 int | |
| 10280 is_fixedstring(Tnode *typ) | |
| 10281 { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; | |
| 10282 } | |
| 10283 | |
| 10284 int | |
| 10285 is_wstring(Tnode *typ) | |
| 10286 { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar && !((Tnode*)typ->ref)->sym; | |
| 10287 } | |
| 10288 | |
| 10289 int | |
| 10290 is_stdstring(Tnode *typ) | |
| 10291 { return typ->type == Tclass && typ->id == lookup("std::string"); | |
| 10292 } | |
| 10293 | |
| 10294 int | |
| 10295 is_stdwstring(Tnode *typ) | |
| 10296 { return typ->type == Tclass && typ->id == lookup("std::wstring"); | |
| 10297 } | |
| 10298 | |
| 10299 int | |
| 10300 is_stdstr(Tnode *typ) | |
| 10301 { if (typ->type == Tpointer) | |
| 10302 return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); | |
| 10303 return is_stdstring(typ) || is_stdwstring(typ); | |
| 10304 } | |
| 10305 | |
| 10306 int | |
| 10307 is_typedef(Tnode *typ) | |
| 10308 { return typ->sym && !is_transient(typ); | |
| 10309 } | |
| 10310 | |
| 10311 int | |
| 10312 reflevel(Tnode *typ) | |
| 10313 { int level; | |
| 10314 for (level = 0; typ->type == Tpointer; level++) | |
| 10315 typ = (Tnode*)typ->ref; | |
| 10316 return level; | |
| 10317 } | |
| 10318 | |
| 10319 Tnode * | |
| 10320 reftype(Tnode *typ) | |
| 10321 { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference) | |
| 10322 typ = (Tnode*)typ->ref; | |
| 10323 return typ; | |
| 10324 } | |
| 10325 | |
| 10326 void | |
| 10327 soap_set_attr(Entry *p, char *obj, char *name, char *tag) | |
| 10328 { Tnode *typ = p->info.typ; | |
| 10329 int flag = (p->info.minOccurs == 0); | |
| 10330 if (is_external(typ) && !is_anyAttribute(typ)) | |
| 10331 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); | |
| 10332 else if (is_qname(typ)) | |
| 10333 fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s), 1);", obj, name, tag, obj, name); | |
| 10334 else if (is_string(typ)) | |
| 10335 fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", %s->%s, 1);", obj, name, tag, obj, name); | |
| 10336 else if (is_wstring(typ)) | |
| 10337 fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s), 2);", obj, name, tag, obj, name); | |
| 10338 else if (is_stdqname(typ)) | |
| 10339 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); | |
| 10340 else if (is_stdstring(typ)) | |
| 10341 { if (flag) | |
| 10342 fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); | |
| 10343 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", %s->%s.c_str(), 1);", tag, obj, name); | |
| 10344 } | |
| 10345 else if (is_stdwstring(typ)) | |
| 10346 { if (flag) | |
| 10347 fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); | |
| 10348 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s.c_str()), 2);", tag, obj, name); | |
| 10349 } | |
| 10350 else if (typ->type == Tllong || typ->type == Tullong) | |
| 10351 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_type(typ), obj, name); | |
| 10352 else if (typ->type == Tenum) | |
| 10353 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); | |
| 10354 else if (typ->type == Tpointer) | |
| 10355 { Tnode *ptr = (Tnode*)typ->ref; | |
| 10356 fprintf(fout, "\n\tif (%s->%s)", obj, name); | |
| 10357 if (is_external(ptr) && !is_anyAttribute(ptr)) | |
| 10358 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); | |
| 10359 else if (is_qname(ptr)) | |
| 10360 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); | |
| 10361 else if (is_string(ptr)) | |
| 10362 fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", *%s->%s, 1);", obj, name, tag, obj, name); | |
| 10363 else if (ptr->type == Tllong || ptr->type == Tullong) | |
| 10364 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_type(ptr), obj, name); | |
| 10365 else if (ptr->type == Tenum) | |
| 10366 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); | |
| 10367 else if (is_stdqname(ptr)) | |
| 10368 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s->c_str()), 1);", tag, obj, name); | |
| 10369 else if (is_stdstring(ptr)) | |
| 10370 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", %s->%s->c_str(), 1);", tag, obj, name); | |
| 10371 else if (is_stdwstring(ptr)) | |
| 10372 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s->c_str()), 2);", tag, obj, name); | |
| 10373 else if (is_primitive(ptr)) | |
| 10374 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, the_type(ptr), obj, name); | |
| 10375 else if (is_hexBinary(ptr)) | |
| 10376 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); | |
| 10377 else if (is_binary(ptr)) | |
| 10378 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); | |
| 10379 else if (is_anyAttribute(ptr)) | |
| 10380 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)); | |
| 10381 else | |
| 10382 { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name); | |
| 10383 semwarn(errbuf); | |
| 10384 } | |
| 10385 } | |
| 10386 else if (is_primitive(typ)) | |
| 10387 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, the_type(typ), obj, name); | |
| 10388 else if (is_hexBinary(typ)) | |
| 10389 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); | |
| 10390 else if (is_binary(typ)) | |
| 10391 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); | |
| 10392 else if (is_anyAttribute(typ)) | |
| 10393 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)); | |
| 10394 else | |
| 10395 { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name); | |
| 10396 semwarn(errbuf); | |
| 10397 } | |
| 10398 } | |
| 10399 | |
| 10400 void | |
| 10401 soap_attr_value(Entry *p, char *obj, char *name, char *tag) | |
| 10402 { int flag = 0; | |
| 10403 Tnode *typ = p->info.typ; | |
| 10404 if (p->info.maxOccurs == 0) | |
| 10405 flag = 2; /* prohibited */ | |
| 10406 else if (p->info.minOccurs >= 1 && !p->info.hasval) | |
| 10407 flag = 1; /* required */ | |
| 10408 if (is_external(typ) && !is_anyAttribute(typ)) | |
| 10409 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); | |
| 10410 else if (typ->type == Tllong || typ->type == Tullong) | |
| 10411 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); | |
| 10412 else if (typ->type == Tenum) | |
| 10413 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); | |
| 10414 else if (is_qname(typ)) | |
| 10415 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)); | |
| 10416 else if (is_string(typ)) | |
| 10417 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)); | |
| 10418 else if (is_wstring(typ)) | |
| 10419 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)); | |
| 10420 else if (is_stdqname(typ)) | |
| 10421 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); | |
| 10422 else if (is_stdstring(typ)) | |
| 10423 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); | |
| 10424 else if (is_stdwstring(typ)) | |
| 10425 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); | |
| 10426 else if (typ->type == Tpointer) | |
| 10427 { Tnode *ptr = (Tnode*)typ->ref; | |
| 10428 if (!is_anyAttribute(ptr)) | |
| 10429 fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{", tag, flag); | |
| 10430 if (!is_stdstring(ptr)) | |
| 10431 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)); | |
| 10432 if (is_external(ptr) && !is_anyAttribute(ptr)) | |
| 10433 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name); | |
| 10434 else if (ptr->type == Tllong || ptr->type == Tullong) | |
| 10435 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_type(ptr), obj, name); | |
| 10436 else if (ptr->type == Tenum) | |
| 10437 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_ident(ptr), obj, name); | |
| 10438 else if (is_qname(ptr)) | |
| 10439 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)); | |
| 10440 else if (is_string(ptr)) | |
| 10441 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)); | |
| 10442 else if (is_stdqname(ptr)) | |
| 10443 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); | |
| 10444 else if (is_stdstring(ptr)) | |
| 10445 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); | |
| 10446 else if (is_stdwstring(ptr)) | |
| 10447 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); | |
| 10448 else if (is_hexBinary(ptr)) | |
| 10449 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); | |
| 10450 else if (is_binary(ptr)) | |
| 10451 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); | |
| 10452 else if (is_anyAttribute(ptr)) | |
| 10453 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)); | |
| 10454 else | |
| 10455 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", the_type(ptr), obj, name); | |
| 10456 if (!is_anyAttribute(ptr)) | |
| 10457 fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); | |
| 10458 } | |
| 10459 else if (is_hexBinary(typ)) | |
| 10460 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); | |
| 10461 else if (is_binary(typ)) | |
| 10462 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); | |
| 10463 else if (is_anyAttribute(typ)) | |
| 10464 fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); | |
| 10465 else if (is_primitive(typ)) | |
| 10466 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); | |
| 10467 if (typ->type == Tpointer) | |
| 10468 { if (!is_string(typ) && !is_wstring(typ) && !is_stdstr(typ->ref)) | |
| 10469 { Tnode *ptr = (Tnode*)typ->ref; | |
| 10470 if (ptr->type <= Tenum) | |
| 10471 { if (ptr->minLength != MINLONG64 && (ptr->minLength > 0 || ptr->type < Tuchar || ptr->type > Tullong)) | |
| 10472 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); | |
| 10473 if (ptr->maxLength != MAXLONG64) | |
| 10474 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); | |
| 10475 } | |
| 10476 } | |
| 10477 } | |
| 10478 else if (typ->type <= Tenum) | |
| 10479 { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong)) | |
| 10480 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); | |
| 10481 if (typ->maxLength != MAXLONG64) | |
| 10482 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); | |
| 10483 } | |
| 10484 } | |
| 10485 | |
| 10486 char * | |
| 10487 ptr_cast(Table *t, char *name) | |
| 10488 { char *s = emalloc(strlen(t->sym->name) + strlen(name) + 6); | |
| 10489 sprintf(s, "((%s*)%s)", t->sym->name, name); | |
| 10490 return s; | |
| 10491 } | |
| 10492 | |
| 10493 void | |
| 10494 soap_out(Tnode *typ) | |
| 10495 { Table *table,*t; | |
| 10496 Entry *p = NULL; | |
| 10497 int cardinality,i,j,d; | |
| 10498 Tnode *n; | |
| 10499 char *nse = ns_qualifiedElement(typ); | |
| 10500 char *nsa = ns_qualifiedAttribute(typ); | |
| 10501 | |
| 10502 if (is_dynamic_array(typ)) | |
| 10503 { soap_out_Darray(typ); | |
| 10504 return; | |
| 10505 } | |
| 10506 | |
| 10507 if (is_external(typ)) | |
| 10508 fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); | |
| 10509 | |
| 10510 if (is_typedef(typ) && is_element(typ) && !is_external(typ)) | |
| 10511 { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); | |
| 10512 return; | |
| 10513 } | |
| 10514 | |
| 10515 if (is_primitive(typ) && typ->type != Tenum) | |
| 10516 { if (is_external(typ)) | |
| 10517 { 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, "*")); | |
| 10518 return; | |
| 10519 } | |
| 10520 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, "*")); | |
| 10521 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")); | |
| 10522 if (typ->type == Tllong || typ->type == Tullong) | |
| 10523 fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); | |
| 10524 else | |
| 10525 fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); | |
| 10526 return; | |
| 10527 } | |
| 10528 if (is_fixedstring(typ)) | |
| 10529 { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); | |
| 10530 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)); | |
| 10531 fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, (char*const*)&a, type, %s);\n}", soap_type(typ)); | |
| 10532 return; | |
| 10533 } | |
| 10534 if (is_string(typ)) | |
| 10535 { if (is_external(typ)) | |
| 10536 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); | |
| 10537 return; | |
| 10538 } | |
| 10539 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); | |
| 10540 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)); | |
| 10541 fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); | |
| 10542 return; | |
| 10543 } | |
| 10544 if (is_wstring(typ)) | |
| 10545 { if (is_external(typ)) | |
| 10546 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); | |
| 10547 return; | |
| 10548 } | |
| 10549 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); | |
| 10550 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)); | |
| 10551 fprintf(fout,"\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); | |
| 10552 return; | |
| 10553 } | |
| 10554 if (is_stdstring(typ)) | |
| 10555 { if (is_external(typ)) | |
| 10556 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); | |
| 10557 return; | |
| 10558 } | |
| 10559 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); | |
| 10560 if (is_stdXML(typ)) | |
| 10561 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)); | |
| 10562 else | |
| 10563 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)); | |
| 10564 return; | |
| 10565 } | |
| 10566 if (is_stdwstring(typ)) | |
| 10567 { if (is_external(typ)) | |
| 10568 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); | |
| 10569 return; | |
| 10570 } | |
| 10571 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); | |
| 10572 if (is_stdXML(typ)) | |
| 10573 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)); | |
| 10574 else | |
| 10575 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)); | |
| 10576 return; | |
| 10577 } | |
| 10578 switch(typ->type) | |
| 10579 { case Tstruct: | |
| 10580 if (is_external(typ)) | |
| 10581 { 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, "*")); | |
| 10582 return; | |
| 10583 } | |
| 10584 table=(Table*)typ->ref; | |
| 10585 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, "*")); | |
| 10586 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")); | |
| 10587 for (t = table; t; t = t->prev) | |
| 10588 { for (p = t->list; p; p = p->next) | |
| 10589 { if (is_repetition(p)) | |
| 10590 p = p->next; | |
| 10591 else if (p->info.sto & Sattribute) | |
| 10592 soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); | |
| 10593 else if (is_qname(p->info.typ)) | |
| 10594 fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); | |
| 10595 else if (is_stdqname(p->info.typ)) | |
| 10596 fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); | |
| 10597 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10598 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)); | |
| 10599 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10600 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)); | |
| 10601 } | |
| 10602 } | |
| 10603 fprintf(fout,"\n\t(void)soap; (void)tag; (void)id; (void)type;"); | |
| 10604 if (is_primclass(typ)) | |
| 10605 { | |
| 10606 for (table = (Table*)typ->ref; table; table = table->prev) | |
| 10607 { p = table->list; | |
| 10608 if (p && is_item(p)) | |
| 10609 break; | |
| 10610 } | |
| 10611 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) | |
| 10612 fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); | |
| 10613 if(p->info.typ->type==Tarray) | |
| 10614 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)); | |
| 10615 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 10616 fprintf(fout,"\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); | |
| 10617 else if (is_qname(p->info.typ)) | |
| 10618 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)); | |
| 10619 else if (is_stdqname(p->info.typ)) | |
| 10620 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)); | |
| 10621 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10622 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)); | |
| 10623 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10624 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)); | |
| 10625 else if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 10626 fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name)); | |
| 10627 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 10628 fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name)); | |
| 10629 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 10630 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)); | |
| 10631 else | |
| 10632 fprintf(fout,"\n\treturn SOAP_OK;"); | |
| 10633 fprintf(fout,"\n}"); | |
| 10634 } | |
| 10635 else | |
| 10636 { if (!is_invisible(typ->id->name)) | |
| 10637 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)); | |
| 10638 fflush(fout); | |
| 10639 for (t = table; t; t = t->prev) | |
| 10640 { for (p = t->list; p; p = p->next) | |
| 10641 { if (p->info.sto & Sreturn) | |
| 10642 { if (nse || has_ns_eq(NULL, p->sym->name)) | |
| 10643 { if (p->info.typ->type == Tpointer) | |
| 10644 fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); | |
| 10645 else | |
| 10646 fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); | |
| 10647 } | |
| 10648 } | |
| 10649 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) | |
| 10650 fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); | |
| 10651 needs_lang(p); | |
| 10652 if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 10653 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 10654 else if (is_transient(p->info.typ)) | |
| 10655 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 10656 else if (p->info.sto & Sattribute) | |
| 10657 ; | |
| 10658 else if (is_repetition(p)) | |
| 10659 { fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); | |
| 10660 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)", ident(p->sym->name)); | |
| 10661 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)) | |
| 10662 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))); | |
| 10663 else if (is_qname((Tnode*)p->next->info.typ->ref)) | |
| 10664 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))); | |
| 10665 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 10666 fprintf(fout,"\n\t\t\tsoap_outliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); | |
| 10667 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 10668 fprintf(fout,"\n\t\t\tsoap_outwliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); | |
| 10669 else | |
| 10670 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))); | |
| 10671 fprintf(fout,"\n\t}"); | |
| 10672 p = p->next; | |
| 10673 } | |
| 10674 else if (is_anytype(p) && is_invisible(p->next->sym->name)) | |
| 10675 { 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)); | |
| 10676 p = p->next; | |
| 10677 } | |
| 10678 else if (is_anytype(p)) | |
| 10679 { 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)); | |
| 10680 p = p->next; | |
| 10681 } | |
| 10682 else if (is_choice(p)) | |
| 10683 { 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)); | |
| 10684 p = p->next; | |
| 10685 } | |
| 10686 else if (p->info.typ->type==Tarray) | |
| 10687 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))); | |
| 10688 else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 10689 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))); | |
| 10690 else if (is_qname(p->info.typ)) | |
| 10691 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))); | |
| 10692 else if (is_stdqname(p->info.typ)) | |
| 10693 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))); | |
| 10694 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10695 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))); | |
| 10696 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10697 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))); | |
| 10698 else if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 10699 fprintf(fout,"\n\tsoap_outliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name)); | |
| 10700 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 10701 fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name)); | |
| 10702 else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) | |
| 10703 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)); | |
| 10704 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 10705 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))); | |
| 10706 } | |
| 10707 } | |
| 10708 if (!is_invisible(typ->id->name)) | |
| 10709 fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 10710 else | |
| 10711 fprintf(fout,"\n\treturn SOAP_OK;\n}"); | |
| 10712 } | |
| 10713 fflush(fout); | |
| 10714 break; | |
| 10715 | |
| 10716 case Tclass: | |
| 10717 if (is_external(typ)) | |
| 10718 { 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, "*")); | |
| 10719 return; | |
| 10720 } | |
| 10721 table=(Table*)typ->ref; | |
| 10722 if (!is_volatile(typ) && !is_typedef(typ)) | |
| 10723 { | |
| 10724 if (is_external(typ)) | |
| 10725 { 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, "*")); | |
| 10726 return; | |
| 10727 } | |
| 10728 fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); | |
| 10729 fprintf(fout,"\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); | |
| 10730 } | |
| 10731 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, "*")); | |
| 10732 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")); | |
| 10733 fflush(fout); | |
| 10734 if (has_setter(typ)) | |
| 10735 fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); | |
| 10736 for (t = table; t; t = t->prev) | |
| 10737 { Entry *e = entry(classtable, t->sym); | |
| 10738 char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; | |
| 10739 for (p = t->list; p; p = p->next) | |
| 10740 { if (is_repetition(p)) | |
| 10741 p = p->next; | |
| 10742 else if (p->info.sto & Sattribute) | |
| 10743 soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); | |
| 10744 else if (is_qname(p->info.typ)) | |
| 10745 fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); | |
| 10746 else if (is_stdqname(p->info.typ)) | |
| 10747 fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); | |
| 10748 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10749 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)); | |
| 10750 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10751 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)); | |
| 10752 } | |
| 10753 } | |
| 10754 if (is_primclass(typ)) | |
| 10755 { | |
| 10756 for (t = table; t; t = t->prev) | |
| 10757 { p = t->list; | |
| 10758 if (p && is_item(p)) | |
| 10759 break; | |
| 10760 } | |
| 10761 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) | |
| 10762 fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); | |
| 10763 if (table->prev) | |
| 10764 { | |
| 10765 if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 10766 fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); | |
| 10767 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 10768 fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); | |
| 10769 else if(p->info.typ->type==Tarray) | |
| 10770 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)); | |
| 10771 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 10772 fprintf(fout,"\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); | |
| 10773 else if (is_qname(p->info.typ)) | |
| 10774 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)); | |
| 10775 else if (is_stdqname(p->info.typ)) | |
| 10776 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)); | |
| 10777 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10778 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)); | |
| 10779 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10780 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)); | |
| 10781 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 10782 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)); | |
| 10783 else | |
| 10784 fprintf(fout,"\n\treturn SOAP_OK;"); | |
| 10785 } | |
| 10786 else | |
| 10787 { if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 10788 fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name)); | |
| 10789 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 10790 fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name)); | |
| 10791 else if(p->info.typ->type==Tarray) | |
| 10792 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)); | |
| 10793 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 10794 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)); | |
| 10795 else if (is_qname(p->info.typ)) | |
| 10796 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)); | |
| 10797 else if (is_stdqname(p->info.typ)) | |
| 10798 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)); | |
| 10799 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10800 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)); | |
| 10801 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10802 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)); | |
| 10803 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 10804 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)); | |
| 10805 else | |
| 10806 fprintf(fout,"\n\treturn SOAP_OK;"); | |
| 10807 } | |
| 10808 fprintf(fout,"\n}"); | |
| 10809 } | |
| 10810 else | |
| 10811 { if (!is_invisible(typ->id->name)) | |
| 10812 { if (table && table->prev) | |
| 10813 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)); | |
| 10814 else | |
| 10815 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)); | |
| 10816 } | |
| 10817 fflush(fout); | |
| 10818 | |
| 10819 i=0; | |
| 10820 /* Get the depth of the inheritance hierarchy */ | |
| 10821 for (t = table; t; t = t->prev) | |
| 10822 i++; | |
| 10823 | |
| 10824 /* Call routines to output the member data of the class */ | |
| 10825 /* Data members of the Base Classes are outputed first | |
| 10826 followed by the data members of the Derived classes. | |
| 10827 Overridden data members are output twice once for the base class | |
| 10828 they are defined in and once for the derived class that overwrites | |
| 10829 them */ | |
| 10830 | |
| 10831 for (; i > 0; i--) | |
| 10832 { Entry *e; | |
| 10833 char *nse1; | |
| 10834 t = table; | |
| 10835 for (j = 0; j< i-1; j++) | |
| 10836 t = t->prev; | |
| 10837 e = entry(classtable, t->sym); | |
| 10838 nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; | |
| 10839 for (p = t->list; p != (Entry*) 0; p = p->next) | |
| 10840 { if (p->info.sto & Sreturn) | |
| 10841 { if (nse1 || has_ns_eq(NULL, p->sym->name)) | |
| 10842 { if (p->info.typ->type == Tpointer) | |
| 10843 fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); | |
| 10844 else | |
| 10845 fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); | |
| 10846 } | |
| 10847 } | |
| 10848 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) | |
| 10849 fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); | |
| 10850 needs_lang(p); | |
| 10851 if (is_item(p)) | |
| 10852 ; | |
| 10853 else if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 10854 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 10855 else if (is_transient(p->info.typ)) | |
| 10856 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 10857 else if (p->info.sto & Sattribute) | |
| 10858 ; | |
| 10859 else if (is_repetition(p)) | |
| 10860 { fprintf(fout,"\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); | |
| 10861 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); | |
| 10862 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)) | |
| 10863 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))); | |
| 10864 else if (is_qname((Tnode*)p->next->info.typ->ref)) | |
| 10865 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))); | |
| 10866 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 10867 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)); | |
| 10868 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 10869 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)); | |
| 10870 else | |
| 10871 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))); | |
| 10872 fprintf(fout,"\n\t}"); | |
| 10873 p = p->next; | |
| 10874 } | |
| 10875 else if (is_anytype(p) && is_invisible(p->next->sym->name)) | |
| 10876 { 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)); | |
| 10877 p = p->next; | |
| 10878 } | |
| 10879 else if (is_anytype(p)) | |
| 10880 { 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)); | |
| 10881 p = p->next; | |
| 10882 } | |
| 10883 else if (is_choice(p)) | |
| 10884 { 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)); | |
| 10885 p = p->next; | |
| 10886 } | |
| 10887 else if (p->info.typ->type==Tarray) | |
| 10888 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))); | |
| 10889 else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 10890 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))); | |
| 10891 else if (is_qname(p->info.typ)) | |
| 10892 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))); | |
| 10893 else if (is_stdqname(p->info.typ)) | |
| 10894 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))); | |
| 10895 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) | |
| 10896 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))); | |
| 10897 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) | |
| 10898 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))); | |
| 10899 else if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 10900 fprintf(fout,"\n\tsoap_outliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); | |
| 10901 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 10902 fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); | |
| 10903 else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) | |
| 10904 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)); | |
| 10905 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 10906 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))); | |
| 10907 fflush(fout); | |
| 10908 } | |
| 10909 } | |
| 10910 if (!is_invisible(typ->id->name)) | |
| 10911 fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 10912 else | |
| 10913 fprintf(fout,"\n\treturn SOAP_OK;\n}"); | |
| 10914 } | |
| 10915 fflush(fout); | |
| 10916 break; | |
| 10917 | |
| 10918 case Tunion: | |
| 10919 if (is_external(typ)) | |
| 10920 { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); | |
| 10921 return; | |
| 10922 } | |
| 10923 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); | |
| 10924 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")); | |
| 10925 table = (Table*)typ->ref; | |
| 10926 fprintf(fout, "\n\tswitch (choice)\n\t{"); | |
| 10927 for (p = table->list; p; p = p->next) | |
| 10928 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 10929 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 10930 else if (is_transient(p->info.typ)) | |
| 10931 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 10932 else if (p->info.sto & Sattribute) | |
| 10933 ; | |
| 10934 else if (is_repetition(p)) | |
| 10935 ; | |
| 10936 else if (is_anytype(p)) | |
| 10937 ; | |
| 10938 else if (p->info.typ->type == Tarray) | |
| 10939 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 10940 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))); | |
| 10941 } | |
| 10942 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 10943 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 10944 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))); | |
| 10945 } | |
| 10946 else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) | |
| 10947 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 10948 fprintf(fout,"\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); | |
| 10949 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))); | |
| 10950 } | |
| 10951 else if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 10952 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 10953 fprintf(fout,"\n\t\treturn soap_outliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); | |
| 10954 } | |
| 10955 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 10956 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 10957 fprintf(fout,"\n\t\treturn soap_outwliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); | |
| 10958 } | |
| 10959 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 10960 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); | |
| 10961 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))); | |
| 10962 } | |
| 10963 } | |
| 10964 fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); | |
| 10965 fflush(fout); | |
| 10966 break; | |
| 10967 | |
| 10968 case Tpointer: | |
| 10969 if (is_external(typ)) | |
| 10970 { 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*")); | |
| 10971 return; | |
| 10972 } | |
| 10973 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*")); | |
| 10974 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")); | |
| 10975 if (is_template(typ)) | |
| 10976 { fprintf(fout,"\n\tif (!*a)"); | |
| 10977 fprintf(fout,"\n\t\treturn soap_element_null(soap, tag, id, type);"); | |
| 10978 fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); | |
| 10979 } | |
| 10980 else | |
| 10981 { p = is_dynamic_array((Tnode*)typ->ref); | |
| 10982 if (p) | |
| 10983 { d = get_Darraydims((Tnode*)typ->ref); | |
| 10984 if (d) | |
| 10985 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)); | |
| 10986 else | |
| 10987 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)); | |
| 10988 } | |
| 10989 else | |
| 10990 fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s);", soap_type((Tnode*)typ->ref)); | |
| 10991 fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;"); | |
| 10992 if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 10993 fprintf(fout,"\n\treturn (*a)->soap_out(soap, tag, id, type);"); | |
| 10994 else | |
| 10995 fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);",c_ident((Tnode*)typ->ref)); | |
| 10996 } | |
| 10997 fprintf(fout,"\n}"); | |
| 10998 break; | |
| 10999 | |
| 11000 case Tarray: | |
| 11001 if (is_external(typ)) | |
| 11002 { 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")); | |
| 11003 return; | |
| 11004 } | |
| 11005 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")); | |
| 11006 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")); | |
| 11007 fprintf(fout,"\n\tint i;"); | |
| 11008 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)); | |
| 11009 n=(Tnode*)typ->ref; | |
| 11010 cardinality = 1; | |
| 11011 while(n->type==Tarray) | |
| 11012 { | |
| 11013 n=(Tnode*)n->ref; | |
| 11014 cardinality++; | |
| 11015 } | |
| 11016 | |
| 11017 fprintf(fout,"\n\tfor (i = 0; i < %d; i++)\n\t{",get_dimension(typ)); | |
| 11018 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 11019 { if(cardinality>1) | |
| 11020 fprintf(fout,"\n\t\ta[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); | |
| 11021 else fprintf(fout,"\n\t\t(a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); | |
| 11022 } | |
| 11023 else | |
| 11024 { if(((Tnode *)typ->ref)->type != Tarray) | |
| 11025 { if(((Tnode *)typ->ref)->type == Tpointer) | |
| 11026 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)); | |
| 11027 else | |
| 11028 fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref)); | |
| 11029 } | |
| 11030 else | |
| 11031 fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref)); | |
| 11032 if(cardinality>1) | |
| 11033 fprintf(fout,"[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); | |
| 11034 else | |
| 11035 fprintf(fout,"+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); | |
| 11036 } | |
| 11037 if(((Tnode *)typ->ref)->type == Tpointer) | |
| 11038 fprintf(fout,";\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 11039 else | |
| 11040 fprintf(fout,";\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 11041 break; | |
| 11042 | |
| 11043 case Tenum: | |
| 11044 if (is_external(typ)) | |
| 11045 { 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, "*")); | |
| 11046 return; | |
| 11047 } | |
| 11048 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, "*")); | |
| 11049 if (!is_typedef(typ)) | |
| 11050 { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); | |
| 11051 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 11052 { for (p = t->list; p; p = p->next) | |
| 11053 fprintf(fout, "\t{ (long)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name)); | |
| 11054 } | |
| 11055 fprintf(fout, "\t{ 0, NULL }\n"); | |
| 11056 fprintf(fout, "};"); | |
| 11057 } | |
| 11058 fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); | |
| 11059 fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); | |
| 11060 if (is_typedef(typ)) | |
| 11061 fprintf(fout, "\n{\treturn soap_%s2s(soap, n);\n}", t_ident(typ)); | |
| 11062 else if (is_boolean(typ)) | |
| 11063 fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\nreturn soap_code_str(soap_codes_%s, n!=0);\n}", c_ident(typ)); | |
| 11064 else if (!is_mask(typ)) | |
| 11065 { fprintf(fout, "\n{\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); | |
| 11066 fprintf(fout, "\n\tif (s)\n\t\treturn s;"); | |
| 11067 fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); | |
| 11068 fprintf(fout, "\n}"); | |
| 11069 } | |
| 11070 else | |
| 11071 fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); | |
| 11072 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")); | |
| 11073 fprintf(fout, "\n{\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); | |
| 11074 fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); | |
| 11075 fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 11076 break; | |
| 11077 case Ttemplate: | |
| 11078 if (is_external(typ)) | |
| 11079 { 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, "*")); | |
| 11080 return; | |
| 11081 } | |
| 11082 if (is_typedef(typ)) | |
| 11083 { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); | |
| 11084 return; | |
| 11085 } | |
| 11086 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, "*")); | |
| 11087 n = typ->ref; | |
| 11088 if (!n) | |
| 11089 return; | |
| 11090 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")); | |
| 11091 | |
| 11092 fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); | |
| 11093 if (n->type==Tarray) | |
| 11094 fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(n), xsi_type_u(typ)); | |
| 11095 else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) | |
| 11096 fprintf(fout,"\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); | |
| 11097 else if (is_qname(n)) | |
| 11098 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)); | |
| 11099 else if (is_stdqname(n)) | |
| 11100 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)); | |
| 11101 else if (is_XML(n) && is_string(n)) | |
| 11102 fprintf(fout,"\n\t\tif (soap_outliteral(soap, tag, &(*i), NULL))"); | |
| 11103 else if (is_XML(n) && is_wstring(n)) | |
| 11104 fprintf(fout,"\n\t\tif (soap_outwliteral(soap, tag, &(*i), NULL))"); | |
| 11105 else if (n->type == Tenum && (Table*)n->ref == booltable) | |
| 11106 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)); | |
| 11107 else | |
| 11108 fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); | |
| 11109 fprintf(fout, "\n\t\t\treturn soap->error;"); | |
| 11110 fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); | |
| 11111 break; | |
| 11112 default: break; | |
| 11113 } | |
| 11114 } | |
| 11115 | |
| 11116 void | |
| 11117 soap_out_Darray(Tnode *typ) | |
| 11118 { int i, j, d = 0; | |
| 11119 Table *t, *table; | |
| 11120 Entry *p; | |
| 11121 char *nse = ns_qualifiedElement(typ); | |
| 11122 char *nsa = ns_qualifiedAttribute(typ); | |
| 11123 char *item; | |
| 11124 | |
| 11125 table=(Table*)typ->ref; | |
| 11126 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, "*")); | |
| 11127 if (is_external(typ)) | |
| 11128 return; | |
| 11129 if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) | |
| 11130 { fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); | |
| 11131 fprintf(fout,"\n{\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); | |
| 11132 } | |
| 11133 fflush(fout); | |
| 11134 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")); | |
| 11135 if (has_setter(typ)) | |
| 11136 fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); | |
| 11137 if (!is_binary(typ)) | |
| 11138 { d = get_Darraydims(typ); | |
| 11139 if (d) | |
| 11140 fprintf(fout,"\n\tint i, n = soap_size(a->__size, %d);", d); | |
| 11141 else | |
| 11142 fprintf(fout,"\n\tint i, n = a->__size;"); | |
| 11143 } | |
| 11144 if (typ->type == Tclass) | |
| 11145 { for (t = table; t; t = t->prev) | |
| 11146 { for (p = t->list; p; p = p->next) | |
| 11147 { if (p->info.sto & Sattribute) | |
| 11148 soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); | |
| 11149 } | |
| 11150 } | |
| 11151 } | |
| 11152 else | |
| 11153 { for (t = table; t; t = t->prev) | |
| 11154 { for (p = t->list; p; p = p->next) | |
| 11155 { if (p->info.sto & Sattribute) | |
| 11156 soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); | |
| 11157 } | |
| 11158 } | |
| 11159 } | |
| 11160 p = is_dynamic_array(typ); | |
| 11161 if (p->sym->name[5]) | |
| 11162 item = ns_addx(p->sym->name + 5, nse); | |
| 11163 else | |
| 11164 item = ns_addx("item", nse); | |
| 11165 if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) | |
| 11166 { if (is_untyped(p->info.typ)) | |
| 11167 { if (has_offset(typ)) | |
| 11168 if (d) | |
| 11169 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); | |
| 11170 else | |
| 11171 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")); | |
| 11172 else if (d) | |
| 11173 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); | |
| 11174 else | |
| 11175 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd")); | |
| 11176 } | |
| 11177 else | |
| 11178 { if (has_offset(typ)) | |
| 11179 if (d) | |
| 11180 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); | |
| 11181 else | |
| 11182 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n + a->__offset) : NULL;", ident(p->sym->name), xsi_type(typ)); | |
| 11183 else if (d) | |
| 11184 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizes(soap, \"%s\", a->__size, %d) : NULL;", ident(p->sym->name), xsi_type(typ),d); | |
| 11185 else | |
| 11186 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", a->__size) : NULL;", ident(p->sym->name), xsi_type(typ)); | |
| 11187 } | |
| 11188 } | |
| 11189 if (d) | |
| 11190 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)); | |
| 11191 else if (is_attachment(typ)) | |
| 11192 { 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)); | |
| 11193 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)); | |
| 11194 } | |
| 11195 else | |
| 11196 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)); | |
| 11197 fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;"); | |
| 11198 fprintf(fout,"\n\tif ("); | |
| 11199 if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) | |
| 11200 { if (table->prev) | |
| 11201 fprintf(fout,"soap_element_begin_out(soap, tag, id, \"%s\")", xsi_type(typ)); | |
| 11202 else | |
| 11203 fprintf(fout,"soap_element_begin_out(soap, tag, id, type)"); | |
| 11204 } | |
| 11205 else if (has_offset(typ)) | |
| 11206 { if (d) | |
| 11207 fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); | |
| 11208 else | |
| 11209 fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffset(soap, a->__offset))"); | |
| 11210 } | |
| 11211 else | |
| 11212 fprintf(fout,"soap_array_begin_out(soap, tag, id, t, NULL)"); | |
| 11213 fprintf(fout, ")\n\t\treturn soap->error;"); | |
| 11214 if (is_binary(typ) && !is_hexBinary(typ)) | |
| 11215 fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); | |
| 11216 else if (is_hexBinary(typ)) | |
| 11217 fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); | |
| 11218 else | |
| 11219 { fprintf(fout,"\n\tfor (i = 0; i < n; i++)\n\t{"); | |
| 11220 if (!has_ns(typ) && !is_untyped(typ)) | |
| 11221 { if (d) | |
| 11222 { fprintf(fout,"\n\t\tsoap->position = %d;", d); | |
| 11223 for (i = 0; i < d; i++) | |
| 11224 { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); | |
| 11225 for (j = i+1; j < d; j++) | |
| 11226 fprintf(fout, "/a->__size[%d]", j); | |
| 11227 fprintf(fout, "%%a->__size[%d];", i); | |
| 11228 } | |
| 11229 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) | |
| 11230 fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); | |
| 11231 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) | |
| 11232 fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); | |
| 11233 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)) | |
| 11234 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))); | |
| 11235 else | |
| 11236 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))); | |
| 11237 } | |
| 11238 else | |
| 11239 { fprintf(fout,"\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); | |
| 11240 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) | |
| 11241 fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); | |
| 11242 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) | |
| 11243 fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); | |
| 11244 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)) | |
| 11245 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))); | |
| 11246 else | |
| 11247 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))); | |
| 11248 } | |
| 11249 } | |
| 11250 else | |
| 11251 { if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) | |
| 11252 fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); | |
| 11253 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) | |
| 11254 fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); | |
| 11255 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)) | |
| 11256 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))); | |
| 11257 else | |
| 11258 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))); | |
| 11259 } | |
| 11260 } | |
| 11261 if (is_binary(typ)) | |
| 11262 fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 11263 else if (!has_ns(typ) && !is_untyped(typ)) | |
| 11264 fprintf(fout,"\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 11265 else | |
| 11266 fprintf(fout,"\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); | |
| 11267 } | |
| 11268 | |
| 11269 void | |
| 11270 soap_get(Tnode *typ) | |
| 11271 { | |
| 11272 Tnode *temp; | |
| 11273 | |
| 11274 if (typ->type == Ttemplate || typ->type == Tunion) | |
| 11275 return; | |
| 11276 | |
| 11277 if (is_typedef(typ) && is_element(typ)) | |
| 11278 { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); | |
| 11279 return; | |
| 11280 } | |
| 11281 | |
| 11282 if(typ->type==Tarray) | |
| 11283 { | |
| 11284 /* ARRAY */ | |
| 11285 temp = typ; | |
| 11286 while(temp->type == Tarray){ | |
| 11287 temp = (Tnode*)temp->ref; | |
| 11288 } | |
| 11289 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)); | |
| 11290 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")); | |
| 11291 fprintf(fout,"\n{\t%s;",c_type_id(temp, "(*p)")); | |
| 11292 fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); | |
| 11293 } | |
| 11294 else if (typ->type==Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) | |
| 11295 { | |
| 11296 /* CLASS */ | |
| 11297 fprintf(fout,"\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); | |
| 11298 fprintf(fout,"\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); | |
| 11299 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, "*")); | |
| 11300 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")); | |
| 11301 fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); | |
| 11302 } | |
| 11303 else | |
| 11304 { | |
| 11305 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, "*")); | |
| 11306 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")); | |
| 11307 fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); | |
| 11308 } | |
| 11309 fprintf(fout,"\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); | |
| 11310 fprintf(fout,"\n\treturn p;\n}"); | |
| 11311 #if 0 | |
| 11312 /* some compilers cannot handle this inlined function */ | |
| 11313 if (typ->type != Treference) | |
| 11314 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)); | |
| 11315 #endif | |
| 11316 if (typ->type != Treference) | |
| 11317 { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid) | |
| 11318 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)); | |
| 11319 else | |
| 11320 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)); | |
| 11321 } | |
| 11322 fflush(fout); | |
| 11323 } | |
| 11324 | |
| 11325 void | |
| 11326 soap_in(Tnode *typ) | |
| 11327 { Entry *p = NULL; | |
| 11328 Table *table, *t; | |
| 11329 int total, a, f, cardinality, i, j; | |
| 11330 long min, max; | |
| 11331 Tnode *n, *temp; | |
| 11332 char *nse = ns_qualifiedElement(typ); | |
| 11333 char *nsa = ns_qualifiedAttribute(typ); | |
| 11334 | |
| 11335 if (is_dynamic_array(typ)) | |
| 11336 { soap_in_Darray(typ); | |
| 11337 return; | |
| 11338 } | |
| 11339 | |
| 11340 if (is_external(typ)) | |
| 11341 fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 11342 | |
| 11343 if (is_typedef(typ) && is_element(typ) && !is_external(typ)) | |
| 11344 { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); | |
| 11345 return; | |
| 11346 } | |
| 11347 | |
| 11348 if (is_primitive_or_string(typ) && typ->type != Tenum) | |
| 11349 { | |
| 11350 if (is_stdqname(typ)) | |
| 11351 { fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); | |
| 11352 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)); | |
| 11353 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)); | |
| 11354 return; | |
| 11355 } | |
| 11356 if (is_stdstring(typ)) | |
| 11357 { if (is_external(typ)) | |
| 11358 { fprintf(fhead,"\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); | |
| 11359 return; | |
| 11360 } | |
| 11361 fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); | |
| 11362 if (is_stdXML(typ)) | |
| 11363 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)); | |
| 11364 else | |
| 11365 { 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)); | |
| 11366 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)); | |
| 11367 } | |
| 11368 return; | |
| 11369 } | |
| 11370 if (is_stdwstring(typ)) | |
| 11371 { if (is_external(typ)) | |
| 11372 { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); | |
| 11373 return; | |
| 11374 } | |
| 11375 if (is_stdXML(typ)) | |
| 11376 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)); | |
| 11377 else | |
| 11378 { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); | |
| 11379 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)); | |
| 11380 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)); | |
| 11381 } | |
| 11382 return; | |
| 11383 } | |
| 11384 if (is_external(typ)) | |
| 11385 { 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, "*")); | |
| 11386 return; | |
| 11387 } | |
| 11388 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, "*")); | |
| 11389 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")); | |
| 11390 if (is_wstring(typ)) | |
| 11391 fprintf(fout,"\n\tp = soap_inwstring(soap, tag, a, type, %s, %ld, %ld);", soap_type(typ), minlen(typ), maxlen(typ)); | |
| 11392 else if (is_string(typ)) | |
| 11393 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)); | |
| 11394 else | |
| 11395 { if (typ->type == Tllong || typ->type == Tullong) | |
| 11396 fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); | |
| 11397 else | |
| 11398 fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); | |
| 11399 if (typ->type <= Tenum) | |
| 11400 { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong)) | |
| 11401 fprintf(fout,"\n\tif (p && *p < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->minLength); | |
| 11402 if (typ->maxLength != MAXLONG64) | |
| 11403 fprintf(fout,"\n\tif (p && *p > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->maxLength); | |
| 11404 } | |
| 11405 } | |
| 11406 fprintf(fout,"\n\treturn p;\n}"); | |
| 11407 fflush(fout); | |
| 11408 return; | |
| 11409 } | |
| 11410 if (is_fixedstring(typ)) | |
| 11411 { fprintf(fhead,"\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); | |
| 11412 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); | |
| 11413 return; | |
| 11414 } | |
| 11415 switch(typ->type) | |
| 11416 { case Tstruct: | |
| 11417 if (is_external(typ)) | |
| 11418 { 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, "*")); | |
| 11419 return; | |
| 11420 } | |
| 11421 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, "*")); | |
| 11422 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")); | |
| 11423 table = (Table *)typ->ref; | |
| 11424 if (is_primclass(typ)) | |
| 11425 { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); | |
| 11426 if (!cflag || has_class(typ)) | |
| 11427 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)); | |
| 11428 else | |
| 11429 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)); | |
| 11430 fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); | |
| 11431 /* fprintf(fout,"\n\tif (soap->alloced)"); */ | |
| 11432 fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); | |
| 11433 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 11434 { for (p = t->list; p; p = p->next) | |
| 11435 if (p->info.sto & Sattribute) | |
| 11436 soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); | |
| 11437 } | |
| 11438 fflush(fout); | |
| 11439 for (table = (Table*)typ->ref; table; table = table->prev) | |
| 11440 { p = table->list; | |
| 11441 if (p && is_item(p)) | |
| 11442 break; | |
| 11443 } | |
| 11444 if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 11445 { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &a->%s))", ident(p->sym->name)); | |
| 11446 } | |
| 11447 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 11448 { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &a->%s))", ident(p->sym->name)); | |
| 11449 } | |
| 11450 else if(p->info.typ->type==Tarray) { | |
| 11451 fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); | |
| 11452 } | |
| 11453 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 11454 fprintf(fout,"\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); | |
| 11455 } | |
| 11456 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 11457 fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); | |
| 11458 } | |
| 11459 fprintf(fout,"\n\t\treturn NULL;"); | |
| 11460 fprintf(fout, "\n\treturn a;\n}"); | |
| 11461 } | |
| 11462 else | |
| 11463 { table = (Table*)typ->ref; | |
| 11464 if (!is_discriminant(typ)) | |
| 11465 { for (t = table; t; t = t->prev) | |
| 11466 { for (p = t->list; p; p = p->next) | |
| 11467 { 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)) | |
| 11468 { if (is_anytype(p) || is_choice(p)) | |
| 11469 p = p->next; | |
| 11470 if (is_repetition(p)) | |
| 11471 { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); | |
| 11472 p = p->next; | |
| 11473 } | |
| 11474 else | |
| 11475 fprintf(fout,"\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); | |
| 11476 } | |
| 11477 } | |
| 11478 } | |
| 11479 } | |
| 11480 if (!is_invisible(typ->id->name)) | |
| 11481 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))\n\t\treturn NULL;"); | |
| 11482 } | |
| 11483 else if (!is_discriminant(typ)) | |
| 11484 { if (table && (table->prev || table->list)) | |
| 11485 fprintf(fout,"\n\tshort soap_flag;"); | |
| 11486 } | |
| 11487 if (has_class(typ)) | |
| 11488 { if (is_invisible(typ->id->name)) | |
| 11489 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)); | |
| 11490 else | |
| 11491 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)); | |
| 11492 } | |
| 11493 else if (is_invisible(typ->id->name)) | |
| 11494 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)); | |
| 11495 else | |
| 11496 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)); | |
| 11497 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); | |
| 11498 /* fprintf(fout,"\n\tif (soap->alloced)"); */ | |
| 11499 fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); | |
| 11500 for (t = table; t; t = t->prev) | |
| 11501 { for (p = t->list; p; p = p->next) | |
| 11502 if (p->info.sto & Sattribute) | |
| 11503 soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); | |
| 11504 } | |
| 11505 if (!is_invisible(typ->id->name)) | |
| 11506 { if (!is_discriminant(typ)) | |
| 11507 { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); | |
| 11508 fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); | |
| 11509 } | |
| 11510 else | |
| 11511 fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); | |
| 11512 } | |
| 11513 else if (!is_discriminant(typ)) | |
| 11514 { if (table->prev || table->list) | |
| 11515 fprintf(fout,"\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); | |
| 11516 } | |
| 11517 a=0; | |
| 11518 f=0; | |
| 11519 for (t = table; t; t = t->prev) | |
| 11520 { for (p = t->list; p; p = p->next) | |
| 11521 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 11522 fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 11523 else if (is_transient(p->info.typ)) | |
| 11524 fprintf(fout, "\n\t\t/* transient %s skipped */", ident(p->sym->name)); | |
| 11525 else if (p->info.sto & Sattribute) | |
| 11526 ; | |
| 11527 else if (is_repetition(p)) | |
| 11528 { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) | |
| 11529 { p = p->next; | |
| 11530 continue; | |
| 11531 } | |
| 11532 f=1; | |
| 11533 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); | |
| 11534 fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); | |
| 11535 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)); | |
| 11536 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)) | |
| 11537 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)); | |
| 11538 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)) | |
| 11539 fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); | |
| 11540 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) | |
| 11541 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)); | |
| 11542 else | |
| 11543 fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); | |
| 11544 fprintf(fout,"\n\t\t\t\t}"); | |
| 11545 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); | |
| 11546 if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 11547 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); | |
| 11548 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 11549 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); | |
| 11550 else | |
| 11551 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)); | |
| 11552 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)); | |
| 11553 p = p->next; | |
| 11554 } | |
| 11555 else if (is_anytype(p)) | |
| 11556 { f=1; | |
| 11557 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); | |
| 11558 fprintf(fout,"\n\t\t\t\tif ((a->%s = soap_getelement(soap, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); | |
| 11559 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); | |
| 11560 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 11561 fprintf(fout,"\n\t\t\t\t}"); | |
| 11562 p = p->next; | |
| 11563 } | |
| 11564 else if (is_discriminant(typ) && p->next) | |
| 11565 { f=1; | |
| 11566 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)); | |
| 11567 fprintf(fout,"\n\t\t\treturn NULL;"); | |
| 11568 break; | |
| 11569 } | |
| 11570 else if (is_choice(p)) | |
| 11571 { f=1; | |
| 11572 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); | |
| 11573 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)); | |
| 11574 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); | |
| 11575 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 11576 fprintf(fout,"\n\t\t\t\t}"); | |
| 11577 p = p->next; | |
| 11578 } | |
| 11579 else | |
| 11580 { f=1; | |
| 11581 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 11582 { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) | |
| 11583 fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); | |
| 11584 else if (is_template(p->info.typ)) | |
| 11585 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); | |
| 11586 else | |
| 11587 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); | |
| 11588 } | |
| 11589 if (is_unmatched(p->sym)) | |
| 11590 { | |
| 11591 if (is_XML(p->info.typ) && is_string(p->info.typ)) { | |
| 11592 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name)); | |
| 11593 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { | |
| 11594 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name)); | |
| 11595 } else if(p->info.typ->type==Tarray) { | |
| 11596 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)); | |
| 11597 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 11598 fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); | |
| 11599 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 11600 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)); | |
| 11601 } | |
| 11602 } | |
| 11603 else if (!is_invisible(p->sym->name)) | |
| 11604 { | |
| 11605 if (is_XML(p->info.typ) && is_string(p->info.typ)) { | |
| 11606 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); | |
| 11607 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { | |
| 11608 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); | |
| 11609 } else if(p->info.typ->type==Tarray) { | |
| 11610 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)); | |
| 11611 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 11612 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)); | |
| 11613 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 11614 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)); | |
| 11615 } | |
| 11616 } | |
| 11617 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 11618 { if (is_template(p->info.typ)) | |
| 11619 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 11620 else | |
| 11621 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); | |
| 11622 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 11623 fprintf(fout,"\n\t\t\t\t}"); | |
| 11624 } | |
| 11625 } | |
| 11626 } | |
| 11627 fflush(fout); | |
| 11628 } | |
| 11629 } | |
| 11630 if (!is_discriminant(typ)) | |
| 11631 { for (t = table; t; t = t->prev) | |
| 11632 { for (p = t->list; p; p = p->next) | |
| 11633 { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) | |
| 11634 { f=1; | |
| 11635 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); | |
| 11636 if (is_unmatched(p->next->sym)) | |
| 11637 fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))"); | |
| 11638 else if (is_invisible(p->next->sym->name)) | |
| 11639 fprintf(fout,"!soap_peek_element(soap))"); | |
| 11640 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)); | |
| 11641 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)) | |
| 11642 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)); | |
| 11643 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)) | |
| 11644 fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); | |
| 11645 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) | |
| 11646 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)); | |
| 11647 else | |
| 11648 fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); | |
| 11649 fprintf(fout,"\n\t\t\t\t}"); | |
| 11650 if (!is_invisible(p->next->sym->name)) | |
| 11651 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); | |
| 11652 if (is_unmatched(p->next->sym)) | |
| 11653 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 11654 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s))", ident(p->next->sym->name)); | |
| 11655 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 11656 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s))", ident(p->next->sym->name)); | |
| 11657 else | |
| 11658 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)); | |
| 11659 } | |
| 11660 else | |
| 11661 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 11662 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); | |
| 11663 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 11664 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); | |
| 11665 else | |
| 11666 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)); | |
| 11667 } | |
| 11668 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)); | |
| 11669 p = p->next; | |
| 11670 } | |
| 11671 else if (is_repetition(p) || is_anytype(p) || is_choice(p)) | |
| 11672 { p = p->next; | |
| 11673 continue; | |
| 11674 } | |
| 11675 else if (is_invisible(p->sym->name) | |
| 11676 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) | |
| 11677 { f=1; | |
| 11678 if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) | |
| 11679 fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); | |
| 11680 else if (is_template(p->info.typ)) | |
| 11681 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); | |
| 11682 else | |
| 11683 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); | |
| 11684 if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 11685 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); | |
| 11686 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 11687 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); | |
| 11688 else if(p->info.typ->type==Tarray) | |
| 11689 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)); | |
| 11690 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 11691 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)); | |
| 11692 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 11693 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)); | |
| 11694 if (is_template(p->info.typ)) | |
| 11695 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 11696 else | |
| 11697 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); | |
| 11698 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 11699 fprintf(fout,"\n\t\t\t\t}"); | |
| 11700 } | |
| 11701 } | |
| 11702 } | |
| 11703 } | |
| 11704 for (t = table; t; t = t->prev) | |
| 11705 for (p = t->list; p; p = p->next) | |
| 11706 if (p->info.sto & Sreturn) | |
| 11707 if (nse || has_ns_eq(NULL, p->sym->name)) | |
| 11708 fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); | |
| 11709 if (!f && is_invisible(typ->id->name)) | |
| 11710 fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); | |
| 11711 if (!is_invisible(typ->id->name) || table->prev || table->list) | |
| 11712 { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); | |
| 11713 if (!is_invisible(typ->id->name) || is_discriminant(typ)) | |
| 11714 fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); | |
| 11715 else | |
| 11716 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}"); | |
| 11717 if (!is_invisible(typ->id->name)) | |
| 11718 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)"); | |
| 11719 else | |
| 11720 fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); | |
| 11721 fprintf(fout,"\n\t\t\t\tbreak;"); | |
| 11722 fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); | |
| 11723 fprintf(fout,"\n\t\t}"); | |
| 11724 } | |
| 11725 } | |
| 11726 if (table && !is_discriminant(typ)) | |
| 11727 { for (p = table->list; p; p = p->next) | |
| 11728 if (is_repetition(p)) | |
| 11729 { 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)); | |
| 11730 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)); | |
| 11731 p = p->next; | |
| 11732 } | |
| 11733 } | |
| 11734 if (!is_invisible(typ->id->name)) | |
| 11735 { fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 11736 fprintf(fout,"\n\t}\n\telse\n\t{\t"); | |
| 11737 if (has_class(typ)) | |
| 11738 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)); | |
| 11739 else | |
| 11740 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)); | |
| 11741 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 11742 fprintf(fout, "\n\t}"); | |
| 11743 } | |
| 11744 a = 0; | |
| 11745 if (table && !is_discriminant(typ)) | |
| 11746 { for (p = table->list; p; p = p->next) | |
| 11747 { 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) | |
| 11748 { if (is_item(p)) | |
| 11749 continue; | |
| 11750 if (is_anytype(p)) | |
| 11751 p = p->next; | |
| 11752 if (a==0) | |
| 11753 { fprintf(fout,"\n\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT "", strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); | |
| 11754 a=1; | |
| 11755 } | |
| 11756 else | |
| 11757 fprintf(fout," || soap_flag_%s > " SOAP_LONG_FORMAT "", ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); | |
| 11758 } | |
| 11759 else if (is_template(p->info.typ)) | |
| 11760 { if (p->info.minOccurs > 0) | |
| 11761 { if (p->info.typ->type == Tpointer) | |
| 11762 { if (a==0) | |
| 11763 { 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); | |
| 11764 a=1; | |
| 11765 } | |
| 11766 else | |
| 11767 fprintf(fout," || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); | |
| 11768 } | |
| 11769 else | |
| 11770 { if (a==0) | |
| 11771 { fprintf(fout,"\n\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); | |
| 11772 a=1; | |
| 11773 } | |
| 11774 else | |
| 11775 fprintf(fout," || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); | |
| 11776 } | |
| 11777 } | |
| 11778 if ( p->info.maxOccurs > 1) | |
| 11779 { if (p->info.typ->type == Tpointer) | |
| 11780 { if (a==0) | |
| 11781 { 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); | |
| 11782 a=1; | |
| 11783 } | |
| 11784 else | |
| 11785 fprintf(fout," || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); | |
| 11786 } | |
| 11787 else | |
| 11788 { if (a==0) | |
| 11789 { fprintf(fout,"\n\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); | |
| 11790 a=1; | |
| 11791 } | |
| 11792 else | |
| 11793 fprintf(fout," || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); | |
| 11794 } | |
| 11795 } | |
| 11796 } | |
| 11797 else if (is_repetition(p)) | |
| 11798 { if (p->info.minOccurs > 0) | |
| 11799 { if (a==0) | |
| 11800 { fprintf(fout,"\n\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); | |
| 11801 a=1; | |
| 11802 } | |
| 11803 else | |
| 11804 fprintf(fout," || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); | |
| 11805 } | |
| 11806 if (p->info.maxOccurs > 1) | |
| 11807 { if (a==0) | |
| 11808 { fprintf(fout,"\n\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); | |
| 11809 a=1; | |
| 11810 } | |
| 11811 else | |
| 11812 fprintf(fout," || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); | |
| 11813 } | |
| 11814 p = p->next; | |
| 11815 } | |
| 11816 else if (is_choice(p)) | |
| 11817 { if (p->info.minOccurs != 0) | |
| 11818 { if (a==0) | |
| 11819 { fprintf(fout,"\n\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); | |
| 11820 a=1; | |
| 11821 } | |
| 11822 else | |
| 11823 fprintf(fout," || soap_flag_%s", ident(p->next->sym->name)); | |
| 11824 } | |
| 11825 p = p->next; | |
| 11826 } | |
| 11827 } | |
| 11828 if (a) | |
| 11829 fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}"); | |
| 11830 } | |
| 11831 fprintf(fout, "\n\treturn a;\n}"); | |
| 11832 } | |
| 11833 break; | |
| 11834 | |
| 11835 case Tclass: | |
| 11836 if (is_external(typ)) | |
| 11837 { 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, "*")); | |
| 11838 return; | |
| 11839 } | |
| 11840 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, "*")); | |
| 11841 if (!is_volatile(typ) && !is_typedef(typ)) | |
| 11842 { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); | |
| 11843 fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}",c_ident(typ)); | |
| 11844 fflush(fout); | |
| 11845 } | |
| 11846 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")); | |
| 11847 if (is_primclass(typ)) | |
| 11848 { | |
| 11849 fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); | |
| 11850 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)); | |
| 11851 fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); | |
| 11852 fprintf(fout,"\n\tif (soap->alloced)"); | |
| 11853 fprintf(fout,"\n\t{\ta->soap_default(soap);"); | |
| 11854 fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ)); | |
| 11855 fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); | |
| 11856 fprintf(fout,"\n\t}"); | |
| 11857 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 11858 { Entry *e = entry(classtable, t->sym); | |
| 11859 char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; | |
| 11860 for (p = t->list; p; p = p->next) | |
| 11861 if (p->info.sto & Sattribute) | |
| 11862 soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); | |
| 11863 } | |
| 11864 fflush(fout); | |
| 11865 for (table = (Table*)typ->ref; table; table = table->prev) | |
| 11866 { p = table->list; | |
| 11867 if (p && is_item(p)) | |
| 11868 break; | |
| 11869 } | |
| 11870 if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 11871 { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name)); | |
| 11872 } | |
| 11873 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 11874 { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name)); | |
| 11875 } | |
| 11876 else if(p->info.typ->type==Tarray) { | |
| 11877 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)); | |
| 11878 } | |
| 11879 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 11880 fprintf(fout,"\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); | |
| 11881 } | |
| 11882 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 11883 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)); | |
| 11884 } | |
| 11885 fprintf(fout,"\n\t\treturn NULL;"); | |
| 11886 if (has_getter(typ)) | |
| 11887 fprintf(fout,"\n\tif (a->get(soap))\n\t\treturn NULL;"); | |
| 11888 fprintf(fout,"\n\treturn a;\n}"); | |
| 11889 } | |
| 11890 else | |
| 11891 { | |
| 11892 if (!is_invisible(typ->id->name)) | |
| 11893 { fprintf(fout,"\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); | |
| 11894 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)); | |
| 11895 } | |
| 11896 else | |
| 11897 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)); | |
| 11898 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); | |
| 11899 if (!is_discriminant(typ)) | |
| 11900 { fprintf(fout,"\n\tif (soap->alloced)"); | |
| 11901 if (is_volatile(typ) || is_typedef(typ)) | |
| 11902 fprintf(fout,"\n\t{\tsoap_default_%s(soap, a);",c_ident(typ)); | |
| 11903 else | |
| 11904 fprintf(fout,"\n\t{\ta->soap_default(soap);"); | |
| 11905 if (!is_invisible(typ->id->name)) | |
| 11906 { fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ)); | |
| 11907 fprintf(fout,"\n\t\t{\tsoap_revert(soap);"); | |
| 11908 fprintf(fout,"\n\t\t\t*soap->id = '\\0';"); | |
| 11909 if (is_volatile(typ) || is_typedef(typ)) | |
| 11910 fprintf(fout,"\n\t\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); | |
| 11911 else | |
| 11912 fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); | |
| 11913 fprintf(fout,"\n\t\t}"); | |
| 11914 } | |
| 11915 fprintf(fout,"\n\t}"); | |
| 11916 } | |
| 11917 else | |
| 11918 fprintf(fout,"\n\ta->soap_default(soap);"); | |
| 11919 table=(Table *)typ->ref; | |
| 11920 for (t = table; t; t = t->prev) | |
| 11921 { Entry *e = entry(classtable, t->sym); | |
| 11922 char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; | |
| 11923 for (p = t->list; p; p = p->next) | |
| 11924 if (p->info.sto & Sattribute) | |
| 11925 soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); | |
| 11926 } | |
| 11927 fflush(fout); | |
| 11928 | |
| 11929 i=0; | |
| 11930 if (!is_discriminant(typ)) | |
| 11931 { for (t = table; t; t = t->prev) | |
| 11932 i++; | |
| 11933 a=0; | |
| 11934 for (; i > 0; i--) | |
| 11935 { t = table; | |
| 11936 for (j = 0; j < i-1; j++) | |
| 11937 t = t->prev; | |
| 11938 for (p = t->list; p; p = p->next) | |
| 11939 { 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)) | |
| 11940 { if (is_anytype(p) || is_choice(p)) | |
| 11941 p = p->next; | |
| 11942 if (is_repetition(p)) | |
| 11943 { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); | |
| 11944 p = p->next; | |
| 11945 } | |
| 11946 else | |
| 11947 fprintf(fout,"\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); | |
| 11948 } | |
| 11949 } | |
| 11950 } | |
| 11951 if (a) | |
| 11952 fprintf(fout,";"); | |
| 11953 } | |
| 11954 fflush(fout); | |
| 11955 if (!is_invisible(typ->id->name)) | |
| 11956 { if (!is_discriminant(typ)) | |
| 11957 { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); | |
| 11958 fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); | |
| 11959 } | |
| 11960 else | |
| 11961 fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); | |
| 11962 } | |
| 11963 else if (!is_discriminant(typ)) | |
| 11964 { if (table->prev || table->list) | |
| 11965 fprintf(fout,"\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); | |
| 11966 } | |
| 11967 table=(Table *)typ->ref; | |
| 11968 a=0; | |
| 11969 i=0; | |
| 11970 f=0; | |
| 11971 for (t = table; t; t = t->prev) | |
| 11972 i++; | |
| 11973 for (; i > 0; i--) | |
| 11974 { Entry *e; | |
| 11975 char *nse1; | |
| 11976 t = table; | |
| 11977 for (j = 0; j < i-1; j++) | |
| 11978 t = t->prev; | |
| 11979 e = entry(classtable, t->sym); | |
| 11980 nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; | |
| 11981 for (p = t->list; p; p = p->next) | |
| 11982 { if (is_item(p)) | |
| 11983 ; | |
| 11984 else if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 11985 fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 11986 else if (is_transient(p->info.typ)) | |
| 11987 fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); | |
| 11988 else if (p->info.sto & Sattribute) | |
| 11989 ; | |
| 11990 else if (is_repetition(p)) | |
| 11991 { | |
| 11992 if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) | |
| 11993 { p = p->next; | |
| 11994 continue; | |
| 11995 } | |
| 11996 f=1; | |
| 11997 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); | |
| 11998 fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); | |
| 11999 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)); | |
| 12000 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)) | |
| 12001 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)); | |
| 12002 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)) | |
| 12003 fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); | |
| 12004 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) | |
| 12005 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)); | |
| 12006 else | |
| 12007 fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); | |
| 12008 fprintf(fout,"\n\t\t\t\t}"); | |
| 12009 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); | |
| 12010 if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 12011 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)); | |
| 12012 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 12013 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)); | |
| 12014 else | |
| 12015 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)); | |
| 12016 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)); | |
| 12017 p = p->next; | |
| 12018 } | |
| 12019 else if (is_anytype(p)) | |
| 12020 { f=1; | |
| 12021 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); | |
| 12022 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)); | |
| 12023 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); | |
| 12024 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 12025 fprintf(fout,"\n\t\t\t\t}"); | |
| 12026 p = p->next; | |
| 12027 } | |
| 12028 else if (is_discriminant(typ) && p->next) | |
| 12029 { f=1; | |
| 12030 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)); | |
| 12031 fprintf(fout,"\n\t\t\treturn NULL;"); | |
| 12032 i = 0; | |
| 12033 break; | |
| 12034 } | |
| 12035 else if (is_choice(p)) | |
| 12036 { f=1; | |
| 12037 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->next->sym->name),i); | |
| 12038 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)); | |
| 12039 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); | |
| 12040 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 12041 fprintf(fout,"\n\t\t\t\t}"); | |
| 12042 p = p->next; | |
| 12043 } | |
| 12044 else | |
| 12045 { f=1; | |
| 12046 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 12047 { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) | |
| 12048 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); | |
| 12049 else if (is_template(p->info.typ)) | |
| 12050 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); | |
| 12051 else | |
| 12052 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i); | |
| 12053 } | |
| 12054 if (is_unmatched(p->sym)) | |
| 12055 { | |
| 12056 if (is_XML(p->info.typ) && is_string(p->info.typ)) { | |
| 12057 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name)); | |
| 12058 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { | |
| 12059 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name)); | |
| 12060 } | |
| 12061 else if(p->info.typ->type==Tarray) { | |
| 12062 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)); | |
| 12063 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 12064 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)); | |
| 12065 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 12066 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)); | |
| 12067 } | |
| 12068 } | |
| 12069 else if (!is_invisible(p->sym->name)) | |
| 12070 { | |
| 12071 if (is_XML(p->info.typ) && is_string(p->info.typ)) { | |
| 12072 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)); | |
| 12073 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { | |
| 12074 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)); | |
| 12075 } | |
| 12076 else if(p->info.typ->type==Tarray) { | |
| 12077 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)); | |
| 12078 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 12079 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)); | |
| 12080 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 12081 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)); | |
| 12082 } | |
| 12083 } | |
| 12084 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 12085 { if (is_template(p->info.typ)) | |
| 12086 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 12087 else | |
| 12088 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); | |
| 12089 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 12090 fprintf(fout,"\n\t\t\t\t}"); | |
| 12091 } | |
| 12092 } | |
| 12093 fflush(fout); | |
| 12094 } | |
| 12095 } | |
| 12096 } | |
| 12097 if (!is_discriminant(typ)) | |
| 12098 { | |
| 12099 Entry *e; | |
| 12100 char *nse1; | |
| 12101 i=0; | |
| 12102 for (t = table; t; t = t->prev) | |
| 12103 { i++; | |
| 12104 e = entry(classtable, t->sym); | |
| 12105 nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; | |
| 12106 for (p = t->list; p; p = p->next) | |
| 12107 { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) | |
| 12108 { f=1; | |
| 12109 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); | |
| 12110 if (is_unmatched(p->next->sym)) | |
| 12111 fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))"); | |
| 12112 else if (is_invisible(p->next->sym->name)) | |
| 12113 fprintf(fout,"!soap_peek_element(soap))"); | |
| 12114 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)); | |
| 12115 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)) | |
| 12116 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)); | |
| 12117 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)) | |
| 12118 fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); | |
| 12119 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) | |
| 12120 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)); | |
| 12121 else | |
| 12122 fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); | |
| 12123 fprintf(fout,"\n\t\t\t\t}"); | |
| 12124 if (!is_invisible(p->next->sym->name)) | |
| 12125 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); | |
| 12126 if (is_unmatched(p->next->sym)) | |
| 12127 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 12128 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); | |
| 12129 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 12130 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); | |
| 12131 else | |
| 12132 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)); | |
| 12133 } | |
| 12134 else | |
| 12135 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) | |
| 12136 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)); | |
| 12137 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) | |
| 12138 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)); | |
| 12139 else | |
| 12140 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)); | |
| 12141 } | |
| 12142 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)); | |
| 12143 p = p->next; | |
| 12144 } | |
| 12145 else if (is_repetition(p) || is_anytype(p) || is_choice(p)) | |
| 12146 { p = p->next; | |
| 12147 continue; | |
| 12148 } | |
| 12149 else if (is_invisible(p->sym->name) | |
| 12150 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) | |
| 12151 { f=1; | |
| 12152 if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) | |
| 12153 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); | |
| 12154 else if (is_template(p->info.typ)) | |
| 12155 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); | |
| 12156 else | |
| 12157 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i); | |
| 12158 if (is_XML(p->info.typ) && is_string(p->info.typ)) { | |
| 12159 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)); | |
| 12160 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { | |
| 12161 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)); | |
| 12162 } | |
| 12163 else if(p->info.typ->type==Tarray) { | |
| 12164 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)); | |
| 12165 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { | |
| 12166 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)); | |
| 12167 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { | |
| 12168 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)); | |
| 12169 } | |
| 12170 if (is_template(p->info.typ)) | |
| 12171 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 12172 else | |
| 12173 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); | |
| 12174 fprintf(fout,"\n\t\t\t\t\tcontinue;"); | |
| 12175 fprintf(fout,"\n\t\t\t\t}"); | |
| 12176 } | |
| 12177 } | |
| 12178 } | |
| 12179 } | |
| 12180 for (t = table; t; t = t->prev) | |
| 12181 for (p = t->list; p; p = p->next) | |
| 12182 if (p->info.sto & Sreturn) | |
| 12183 if (nse || has_ns_eq(NULL, p->sym->name)) | |
| 12184 fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); | |
| 12185 if (!f && is_invisible(typ->id->name)) | |
| 12186 fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); | |
| 12187 if (!is_invisible(typ->id->name) || table->prev || table->list) | |
| 12188 { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); | |
| 12189 if (!is_invisible(typ->id->name) || is_discriminant(typ)) | |
| 12190 fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); | |
| 12191 else | |
| 12192 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}"); | |
| 12193 if (!is_invisible(typ->id->name)) | |
| 12194 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)"); | |
| 12195 else | |
| 12196 fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); | |
| 12197 fprintf(fout,"\n\t\t\t\tbreak;"); | |
| 12198 fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); | |
| 12199 fprintf(fout,"\n\t\t}"); | |
| 12200 } | |
| 12201 } | |
| 12202 if (!is_discriminant(typ)) | |
| 12203 { i=0; | |
| 12204 for (t = table; t; t = t->prev) | |
| 12205 i++; | |
| 12206 for (; i > 0; i--) | |
| 12207 { t = table; | |
| 12208 for (j = 0; j < i-1; j++) | |
| 12209 t = t->prev; | |
| 12210 for (p = t->list; p; p = p->next) | |
| 12211 { if (is_repetition(p)) | |
| 12212 { 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); | |
| 12213 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); | |
| 12214 p = p->next; | |
| 12215 } | |
| 12216 } | |
| 12217 } | |
| 12218 } | |
| 12219 if (has_getter(typ)) | |
| 12220 fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); | |
| 12221 if (!is_invisible(typ->id->name)) | |
| 12222 { fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12223 fprintf(fout,"\n\t}\n\telse\n\t{"); | |
| 12224 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)); | |
| 12225 fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12226 fprintf(fout, "\n\t}"); | |
| 12227 } | |
| 12228 if (!is_discriminant(typ)) | |
| 12229 { a=0; | |
| 12230 i = 0; | |
| 12231 for (t = table; t; t = t->prev) | |
| 12232 i++; | |
| 12233 for (; i > 0; i--) | |
| 12234 { t = table; | |
| 12235 for (j = 0; j < i-1; j++) | |
| 12236 t = t->prev; | |
| 12237 for (p = t->list; p; p = p->next) | |
| 12238 { 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) | |
| 12239 { if (is_item(p)) | |
| 12240 continue; | |
| 12241 if (is_anytype(p)) | |
| 12242 p = p->next; | |
| 12243 if (a==0) | |
| 12244 { 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); | |
| 12245 a=1; | |
| 12246 } | |
| 12247 else | |
| 12248 fprintf(fout," || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); | |
| 12249 } | |
| 12250 else if (is_template(p->info.typ)) | |
| 12251 { if (p->info.minOccurs > 0) | |
| 12252 { if (p->info.typ->type == Tpointer) | |
| 12253 { if (a==0) | |
| 12254 { 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); | |
| 12255 a=1; | |
| 12256 } | |
| 12257 else | |
| 12258 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); | |
| 12259 } | |
| 12260 else | |
| 12261 { if (a==0) | |
| 12262 { 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); | |
| 12263 a=1; | |
| 12264 } | |
| 12265 else | |
| 12266 fprintf(fout," || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); | |
| 12267 } | |
| 12268 } | |
| 12269 if ( p->info.maxOccurs > 1) | |
| 12270 { if (p->info.typ->type == Tpointer) | |
| 12271 { if (a==0) | |
| 12272 { 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); | |
| 12273 a=1; | |
| 12274 } | |
| 12275 else | |
| 12276 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); | |
| 12277 } | |
| 12278 else | |
| 12279 { if (a==0) | |
| 12280 { 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); | |
| 12281 a=1; | |
| 12282 } | |
| 12283 else | |
| 12284 fprintf(fout," || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); | |
| 12285 } | |
| 12286 } | |
| 12287 } | |
| 12288 else if (is_repetition(p)) | |
| 12289 { if (p->info.minOccurs > 0) | |
| 12290 { if (a==0) | |
| 12291 { fprintf(fout,"\n\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); | |
| 12292 a=1; | |
| 12293 } | |
| 12294 else | |
| 12295 fprintf(fout," || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); | |
| 12296 } | |
| 12297 if (p->info.maxOccurs > 1) | |
| 12298 { if (a==0) | |
| 12299 { fprintf(fout,"\n\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); | |
| 12300 a=1; | |
| 12301 } | |
| 12302 else | |
| 12303 fprintf(fout," || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); | |
| 12304 } | |
| 12305 p = p->next; | |
| 12306 } | |
| 12307 else if (is_choice(p)) | |
| 12308 { if (p->info.minOccurs != 0) | |
| 12309 { if (a==0) | |
| 12310 { fprintf(fout,"\n\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); | |
| 12311 a=1; | |
| 12312 } | |
| 12313 else | |
| 12314 fprintf(fout," || soap_flag_%s%d", ident(p->next->sym->name), i); | |
| 12315 } | |
| 12316 p = p->next; | |
| 12317 } | |
| 12318 } | |
| 12319 } | |
| 12320 if (a) | |
| 12321 fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}"); | |
| 12322 } | |
| 12323 fprintf(fout,"\n\treturn a;\n}"); | |
| 12324 } | |
| 12325 | |
| 12326 break; | |
| 12327 | |
| 12328 case Tunion: | |
| 12329 if (is_external(typ)) | |
| 12330 { 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, "*")); | |
| 12331 return; | |
| 12332 } | |
| 12333 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, "*")); | |
| 12334 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")); | |
| 12335 fprintf(fout, "\tsoap->error = SOAP_TAG_MISMATCH;"); | |
| 12336 table = (Table *)typ->ref; | |
| 12337 for (p = table->list; p; p = p->next) | |
| 12338 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 12339 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); | |
| 12340 else if (is_transient(p->info.typ)) | |
| 12341 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); | |
| 12342 else if (p->info.sto & Sattribute) | |
| 12343 ; | |
| 12344 else if (is_repetition(p)) | |
| 12345 ; | |
| 12346 else if (is_anytype(p)) | |
| 12347 ; | |
| 12348 else if (!is_invisible(p->sym->name)) | |
| 12349 { if (is_unmatched(p->sym)) | |
| 12350 { if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 12351 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name)); | |
| 12352 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 12353 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name)); | |
| 12354 else if (p->info.typ->type == Tarray) | |
| 12355 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)); | |
| 12356 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 12357 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)); | |
| 12358 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 12359 { if (p->info.typ->type == Tpointer) | |
| 12360 fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); | |
| 12361 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)); | |
| 12362 } | |
| 12363 } | |
| 12364 else | |
| 12365 { if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 12366 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); | |
| 12367 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 12368 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); | |
| 12369 else if (p->info.typ->type == Tarray) | |
| 12370 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)); | |
| 12371 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 12372 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)); | |
| 12373 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 12374 { if (p->info.typ->type == Tpointer) | |
| 12375 fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); | |
| 12376 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)); | |
| 12377 } | |
| 12378 } | |
| 12379 fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name)); | |
| 12380 fprintf(fout, "\n\t\treturn a;"); | |
| 12381 fprintf(fout, "\n\t}"); | |
| 12382 fflush(fout); | |
| 12383 } | |
| 12384 } | |
| 12385 table = (Table *)typ->ref; | |
| 12386 for (p = table->list; p; p = p->next) | |
| 12387 { if (p->info.sto & (Sconst | Sprivate | Sprotected)) | |
| 12388 ; | |
| 12389 else if (is_transient(p->info.typ)) | |
| 12390 ; | |
| 12391 else if (p->info.sto & Sattribute) | |
| 12392 ; | |
| 12393 else if (is_repetition(p)) | |
| 12394 ; | |
| 12395 else if (is_anytype(p)) | |
| 12396 ; | |
| 12397 else if (is_invisible(p->sym->name)) | |
| 12398 { if (is_XML(p->info.typ) && is_string(p->info.typ)) | |
| 12399 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); | |
| 12400 else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) | |
| 12401 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); | |
| 12402 else if (p->info.typ->type == Tarray) | |
| 12403 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)); | |
| 12404 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) | |
| 12405 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name),ns_add(p, nse)); | |
| 12406 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) | |
| 12407 { if (p->info.typ->type == Tpointer) | |
| 12408 fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); | |
| 12409 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)); | |
| 12410 } | |
| 12411 fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name)); | |
| 12412 fprintf(fout, "\n\t\treturn a;"); | |
| 12413 fprintf(fout, "\n\t}"); | |
| 12414 fflush(fout); | |
| 12415 } | |
| 12416 } | |
| 12417 fprintf(fout, "\n\t*choice = -1;\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); | |
| 12418 break; | |
| 12419 | |
| 12420 case Tpointer: | |
| 12421 | |
| 12422 if (is_external(typ)) | |
| 12423 { 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, "*")); | |
| 12424 return; | |
| 12425 } | |
| 12426 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, "*")); | |
| 12427 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")); | |
| 12428 fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); | |
| 12429 fprintf(fout,"\n\t\treturn NULL;"); | |
| 12430 | |
| 12431 if (is_template(typ)) | |
| 12432 { fprintf(fout,"\n\tsoap_revert(soap);"); | |
| 12433 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)); | |
| 12434 fprintf(fout,"\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); | |
| 12435 fprintf(fout,"\n\treturn a;\n}"); | |
| 12436 } | |
| 12437 else if(((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) | |
| 12438 { | |
| 12439 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)); | |
| 12440 fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); | |
| 12441 fprintf(fout,"\n\t{\tsoap_revert(soap);"); | |
| 12442 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)); | |
| 12443 fprintf(fout, "\n\t\t\treturn NULL;"); | |
| 12444 fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); | |
| 12445 fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); | |
| 12446 fprintf(fout, "\n\t\t\treturn NULL;"); | |
| 12447 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) ); | |
| 12448 if (((Tnode*)typ->ref)->type == Tclass) | |
| 12449 { table = (Table*)((Tnode*)typ->ref)->ref; | |
| 12450 for (p = classtable->list; p; p = p->next) | |
| 12451 { if (p->info.typ->type == Tclass) | |
| 12452 { Table *q = (Table*)p->info.typ->ref; | |
| 12453 if (q) | |
| 12454 for (q = q->prev; q; q = q->prev) | |
| 12455 if (q == table) | |
| 12456 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)); | |
| 12457 } | |
| 12458 } | |
| 12459 } | |
| 12460 fprintf(fout,"\n\t\ta = p;"); | |
| 12461 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12462 fprintf(fout,"\n\t}\n\treturn a;\n}"); | |
| 12463 } | |
| 12464 else | |
| 12465 { | |
| 12466 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)); | |
| 12467 fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); | |
| 12468 fprintf(fout,"\n\t{\tsoap_revert(soap);"); | |
| 12469 fprintf(fout,"\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); | |
| 12470 fprintf(fout,"\n\t\t\treturn NULL;"); | |
| 12471 | |
| 12472 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) ); | |
| 12473 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12474 fprintf(fout,"\n\t}\n\treturn a;\n}"); | |
| 12475 } | |
| 12476 | |
| 12477 break; | |
| 12478 | |
| 12479 case Tarray: | |
| 12480 temp = typ; | |
| 12481 while(temp->type == Tarray){ | |
| 12482 temp = (Tnode*)temp->ref; | |
| 12483 } | |
| 12484 if (is_external(typ)) | |
| 12485 { 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)); | |
| 12486 return; | |
| 12487 } | |
| 12488 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)); | |
| 12489 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")); | |
| 12490 fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); | |
| 12491 fprintf(fout,"\n\t\treturn NULL;"); | |
| 12492 fprintf(fout,"\n\tif (soap_match_array(soap, type))"); | |
| 12493 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); | |
| 12494 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)); | |
| 12495 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); | |
| 12496 fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); | |
| 12497 fprintf(fout,"\n\tif (soap->body && !*soap->href)"); | |
| 12498 total=get_dimension(typ); | |
| 12499 n=(Tnode*)typ->ref; | |
| 12500 cardinality = 1; | |
| 12501 while(n->type==Tarray) | |
| 12502 { | |
| 12503 total=total*get_dimension(n); | |
| 12504 n = (Tnode*)n->ref; | |
| 12505 cardinality++; | |
| 12506 } | |
| 12507 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)",get_dimension(typ)); | |
| 12508 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)); | |
| 12509 fprintf(fout,"\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); | |
| 12510 | |
| 12511 if(cardinality > 1){ | |
| 12512 fprintf(fout,"[i]"); | |
| 12513 }else { | |
| 12514 fprintf(fout,"+i"); | |
| 12515 } | |
| 12516 fprintf(fout,", \"%s\"))", xsi_type((Tnode*)typ->ref)); | |
| 12517 fprintf(fout,"\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); | |
| 12518 fprintf(fout,"\n\t\t\t\tsoap->error = SOAP_OK;"); | |
| 12519 fprintf(fout,"\n\t\t\t\tbreak;"); | |
| 12520 fprintf(fout,"\n\t\t\t}"); | |
| 12521 fprintf(fout,"\n\t\t}"); | |
| 12522 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}"); | |
| 12523 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}"); | |
| 12524 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)); | |
| 12525 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12526 fprintf(fout,"\n\t}\n\treturn (%s)a;\n}", c_type_id(temp, "*")); | |
| 12527 break; | |
| 12528 | |
| 12529 case Tenum: | |
| 12530 if (is_external(typ)) | |
| 12531 { 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, "*")); | |
| 12532 return; | |
| 12533 } | |
| 12534 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, "*")); | |
| 12535 fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*")); | |
| 12536 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")); | |
| 12537 if (is_typedef(typ)) | |
| 12538 fprintf(fout, "\n\treturn soap_s2%s(soap, s, a);\n}", t_ident(typ)); | |
| 12539 else if (!is_mask(typ)) | |
| 12540 { fprintf(fout, "\n\tconst struct soap_code_map *map;"); | |
| 12541 t = (Table*)typ->ref; | |
| 12542 if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) | |
| 12543 { fprintf(fout, "\n\tchar *t;"); | |
| 12544 fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); | |
| 12545 fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); | |
| 12546 fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); | |
| 12547 } | |
| 12548 else | |
| 12549 { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); | |
| 12550 fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); | |
| 12551 } | |
| 12552 min = 0; | |
| 12553 max = 0; | |
| 12554 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 12555 { for (p = t->list; p; p = p->next) | |
| 12556 { if (p->info.val.i < min) | |
| 12557 min = (unsigned long)p->info.val.i; | |
| 12558 if (p->info.val.i > max) | |
| 12559 max = (unsigned long)p->info.val.i; | |
| 12560 } | |
| 12561 } | |
| 12562 if (is_boolean(typ)) | |
| 12563 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)); | |
| 12564 else if (sflag) | |
| 12565 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)); | |
| 12566 else | |
| 12567 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)); | |
| 12568 } | |
| 12569 else | |
| 12570 { t = (Table*)typ->ref; | |
| 12571 if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) | |
| 12572 { fprintf(fout, "\n\tchar *t;"); | |
| 12573 fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); | |
| 12574 fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); | |
| 12575 } | |
| 12576 else | |
| 12577 fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); | |
| 12578 fprintf(fout, "\n\treturn SOAP_OK;\n}"); | |
| 12579 } | |
| 12580 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")); | |
| 12581 if (is_boolean(typ)) | |
| 12582 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); | |
| 12583 fprintf(fout,"\n\t\treturn NULL;"); | |
| 12584 fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); | |
| 12585 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); | |
| 12586 } | |
| 12587 else if (typ->sym) | |
| 12588 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); | |
| 12589 fprintf(fout,"\n\t\treturn NULL;"); | |
| 12590 fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); | |
| 12591 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); | |
| 12592 } | |
| 12593 else | |
| 12594 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))"); | |
| 12595 fprintf(fout,"\n\t\treturn NULL;"); | |
| 12596 } | |
| 12597 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)); | |
| 12598 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); | |
| 12599 fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); | |
| 12600 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)); | |
| 12601 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)); | |
| 12602 fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12603 fprintf(fout,"\n\t}\n\treturn a;\n}"); | |
| 12604 break; | |
| 12605 | |
| 12606 case Ttemplate: | |
| 12607 if (is_external(typ)) | |
| 12608 { 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, "*")); | |
| 12609 return; | |
| 12610 } | |
| 12611 if (is_typedef(typ)) | |
| 12612 { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); | |
| 12613 return; | |
| 12614 } | |
| 12615 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, "*")); | |
| 12616 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")); | |
| 12617 n = (Tnode*)typ->ref; | |
| 12618 fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); | |
| 12619 fprintf(fout, "\n\tshort soap_flag;"); | |
| 12620 fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{\t%s;", c_type_id(n, "n")); | |
| 12621 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"); | |
| 12622 if (n->type == Tpointer) | |
| 12623 fprintf(fout,"n = NULL;"); | |
| 12624 else if (n->type == Tarray) | |
| 12625 fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n)); | |
| 12626 else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) | |
| 12627 fprintf(fout,"n.soap_default(soap);"); | |
| 12628 else if (n->type != Tfun && !is_void(n) && !is_XML(n)) | |
| 12629 fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n)); | |
| 12630 fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))"); | |
| 12631 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)); | |
| 12632 if (is_XML(n) && is_string(n)) | |
| 12633 fprintf(fout, "if (!soap_inliteral(soap, tag, NULL))"); | |
| 12634 else if (is_XML(n) && is_wstring(n)) | |
| 12635 fprintf(fout, "if (!soap_inwliteral(soap, tag, NULL))"); | |
| 12636 else if (n->type==Tarray) | |
| 12637 fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n)); | |
| 12638 else if (n->type != Tfun && !is_void(n)) | |
| 12639 fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n)); | |
| 12640 fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}\n\t\telse "); | |
| 12641 if (is_XML(n) && is_string(n)) | |
| 12642 fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); | |
| 12643 else if (is_XML(n) && is_wstring(n)) | |
| 12644 fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); | |
| 12645 else if (n->type==Tarray) | |
| 12646 fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n)); | |
| 12647 else if (n->type != Tfun && !is_void(n)) | |
| 12648 fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n)); | |
| 12649 fprintf(fout, "\n\t\t\tbreak;"); | |
| 12650 fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap, -1)))\n\t\t\treturn NULL;", c_ident(typ)); | |
| 12651 if ((!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) && (is_primitive(n) || n->type == Tpointer)) | |
| 12652 fprintf(fout, "\n\t\ta->push_back(n);"); | |
| 12653 else | |
| 12654 { | |
| 12655 if (is_primitive(n) || n->type == Tpointer) | |
| 12656 fprintf(fout, "\n\t\ta->insert(a->end(), n);"); | |
| 12657 else | |
| 12658 fprintf(fout, "\n\t\tsoap_update_pointers(soap, (char*)&n, (char*)&n + sizeof(n), (char*)&(*a->insert(a->end(), n)), (char*)&n);"); | |
| 12659 } | |
| 12660 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}"); | |
| 12661 break; | |
| 12662 default: break; | |
| 12663 } | |
| 12664 fflush(fout); | |
| 12665 } | |
| 12666 | |
| 12667 | |
| 12668 void | |
| 12669 soap_in_Darray(Tnode *typ) | |
| 12670 { int i, j, d; | |
| 12671 Entry *p; | |
| 12672 Table *t, *table; | |
| 12673 char *nsa = ns_qualifiedAttribute(typ); | |
| 12674 | |
| 12675 table=(Table *)typ->ref; | |
| 12676 p = is_dynamic_array(typ); | |
| 12677 d = get_Darraydims(typ); | |
| 12678 | |
| 12679 if (is_external(typ)) | |
| 12680 { 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, "*")); | |
| 12681 return; | |
| 12682 } | |
| 12683 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, "*")); | |
| 12684 if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) | |
| 12685 { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); | |
| 12686 fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); | |
| 12687 } | |
| 12688 fflush(fout); | |
| 12689 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")); | |
| 12690 if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ)) | |
| 12691 fprintf(fout,"\n{\n\t(void)type; /* appease -Wall -Werror */"); | |
| 12692 else if (d) | |
| 12693 fprintf(fout,"\n{\tint i, j, n;\n\t%s;", c_type_id(p->info.typ, "p")); | |
| 12694 else | |
| 12695 fprintf(fout,"\n{\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); | |
| 12696 fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); | |
| 12697 if (has_ns(typ) || is_untyped(typ)) | |
| 12698 { if (is_hexBinary(typ)) | |
| 12699 fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); | |
| 12700 else if (is_binary(typ)) | |
| 12701 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\"))"); | |
| 12702 else | |
| 12703 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)); | |
| 12704 } | |
| 12705 else | |
| 12706 fprintf(fout,"\n\tif (soap_match_array(soap, type))"); | |
| 12707 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); | |
| 12708 if (typ->type == Tclass) | |
| 12709 { 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)); | |
| 12710 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); | |
| 12711 fprintf(fout,"\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); | |
| 12712 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 12713 { for (p = t->list; p; p = p->next) | |
| 12714 if (p->info.sto & Sattribute) | |
| 12715 soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); | |
| 12716 } | |
| 12717 } | |
| 12718 else | |
| 12719 { 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)); | |
| 12720 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); | |
| 12721 /*fprintf(fout,"\n\tif (soap->alloced)");*/ | |
| 12722 fprintf(fout,"\n\tsoap_default_%s(soap, a);", c_ident(typ)); | |
| 12723 for (t = (Table*)typ->ref; t; t = t->prev) | |
| 12724 { for (p = t->list; p; p = p->next) | |
| 12725 if (p->info.sto & Sattribute) | |
| 12726 soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); | |
| 12727 } | |
| 12728 } | |
| 12729 fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); | |
| 12730 p = is_dynamic_array(typ); | |
| 12731 if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ)) | |
| 12732 { if (is_hexBinary(typ)) | |
| 12733 fprintf(fout,"\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); | |
| 12734 else | |
| 12735 { fprintf(fout,"\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); | |
| 12736 if (is_attachment(typ)) | |
| 12737 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"); | |
| 12738 } | |
| 12739 fprintf(fout,"\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12740 } | |
| 12741 else | |
| 12742 { if (d) | |
| 12743 { fprintf(fout,"\n\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); | |
| 12744 if (has_offset(typ)) | |
| 12745 fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); | |
| 12746 else | |
| 12747 fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); | |
| 12748 if (p->info.minOccurs > 0) | |
| 12749 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); | |
| 12750 if (p->info.maxOccurs > 1) | |
| 12751 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); | |
| 12752 fprintf(fout,"\n\t\tif (n >= 0)"); | |
| 12753 if (((Tnode*)p->info.typ->ref)->type == Tclass | |
| 12754 || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) | |
| 12755 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); | |
| 12756 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) | |
| 12757 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)); | |
| 12758 else if (((Tnode*)p->info.typ->ref)->type == Tpointer) | |
| 12759 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)); | |
| 12760 } | |
| 12761 else if (has_class((Tnode*)p->info.typ->ref)) | |
| 12762 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); | |
| 12763 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)); | |
| 12764 } | |
| 12765 else | |
| 12766 { 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)); | |
| 12767 if (((Tnode*)p->info.typ->ref)->type == Tpointer) | |
| 12768 fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); | |
| 12769 else if (!is_XML((Tnode*)p->info.typ->ref)) | |
| 12770 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)); | |
| 12771 } | |
| 12772 fprintf(fout,"\n\t\t\tfor (i = 0; i < n; i++)"); | |
| 12773 fprintf(fout,"\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); | |
| 12774 fprintf(fout,"\n\t\t\t\t{\ti = "); | |
| 12775 for (i = 0; i < d; i++) | |
| 12776 { fprintf(fout,"soap->positions[%d]", i); | |
| 12777 for (j = 1; j < d-i; j++) | |
| 12778 fprintf(fout,"*a->__size[%d]", j); | |
| 12779 if (i < d-1) | |
| 12780 fprintf(fout,"+"); | |
| 12781 } | |
| 12782 fprintf(fout,"-j;"); | |
| 12783 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}"); | |
| 12784 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)); | |
| 12785 fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); | |
| 12786 fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); | |
| 12787 fprintf(fout,"\n\t\t\t\t\tbreak;"); | |
| 12788 fprintf(fout,"\n\t\t\t\t}"); | |
| 12789 } | |
| 12790 else | |
| 12791 { fprintf(fout,"\n\t\ta->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j);"); | |
| 12792 if (has_offset(typ) && (p->next->next->info.sto & Sconst) == 0) | |
| 12793 { fprintf(fout,"\n\t\ta->__offset = j;"); | |
| 12794 } | |
| 12795 if (p->info.minOccurs > 0) | |
| 12796 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); | |
| 12797 if (p->info.maxOccurs > 1) | |
| 12798 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); | |
| 12799 fprintf(fout,"\n\t\tif (a->__size >= 0)"); | |
| 12800 if (((Tnode*)p->info.typ->ref)->type == Tclass | |
| 12801 || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) | |
| 12802 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); | |
| 12803 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) | |
| 12804 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)); | |
| 12805 else | |
| 12806 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)); | |
| 12807 } | |
| 12808 else if (has_class((Tnode*)p->info.typ->ref)) | |
| 12809 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); | |
| 12810 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)); | |
| 12811 } | |
| 12812 else | |
| 12813 { 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)); | |
| 12814 if (((Tnode*)p->info.typ->ref)->type == Tpointer) | |
| 12815 fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); | |
| 12816 else if (!is_XML((Tnode*)p->info.typ->ref)) | |
| 12817 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)); | |
| 12818 } | |
| 12819 fprintf(fout,"\n\t\t\tfor (i = 0; i < a->__size; i++)"); | |
| 12820 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}"); | |
| 12821 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) | |
| 12822 fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, a->%s + i))", ident(p->sym->name)); | |
| 12823 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) | |
| 12824 fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, a->%s + i))", ident(p->sym->name)); | |
| 12825 else | |
| 12826 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)); | |
| 12827 fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); | |
| 12828 fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); | |
| 12829 fprintf(fout,"\n\t\t\t\t\tbreak;"); | |
| 12830 fprintf(fout,"\n\t\t\t\t}"); | |
| 12831 } | |
| 12832 fprintf(fout,"\n\t\t\t}\n\t\t}\n\t\telse"); | |
| 12833 fprintf(fout,"\n\t\t{\tif (soap_new_block(soap) == NULL)\n\t\t\t\treturn NULL;"); | |
| 12834 if (p->info.maxOccurs > 1) | |
| 12835 { if (d) | |
| 12836 fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; a->__size[0] <= " SOAP_LONG_FORMAT "; a->__size[0]++)", p->info.maxOccurs); | |
| 12837 else | |
| 12838 fprintf(fout,"\n\t\t\tfor (a->__size = 0; a->__size <= " SOAP_LONG_FORMAT "; a->__size++)", p->info.maxOccurs); | |
| 12839 } | |
| 12840 else | |
| 12841 { if (d) | |
| 12842 fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; ; a->__size[0]++)"); | |
| 12843 else | |
| 12844 fprintf(fout,"\n\t\t\tfor (a->__size = 0; ; a->__size++)"); | |
| 12845 } | |
| 12846 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)); | |
| 12847 if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) | |
| 12848 fprintf(fout,"\n\t\t\t\tSOAP_PLACEMENT_NEW(p, %s);", c_type((Tnode*)p->info.typ->ref)); | |
| 12849 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)) | |
| 12850 fprintf(fout,"\n\t\t\t\tp->soap_default(soap);"); | |
| 12851 else if (((Tnode*)p->info.typ->ref)->type == Tpointer) | |
| 12852 fprintf(fout,"\n\t\t\t\t*p = NULL;"); | |
| 12853 else if (!is_XML((Tnode*)p->info.typ->ref)) | |
| 12854 fprintf(fout,"\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); | |
| 12855 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) | |
| 12856 fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); | |
| 12857 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) | |
| 12858 fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); | |
| 12859 else | |
| 12860 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)); | |
| 12861 fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); | |
| 12862 fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); | |
| 12863 fprintf(fout,"\n\t\t\t\t\tbreak;"); | |
| 12864 fprintf(fout,"\n\t\t\t\t}"); | |
| 12865 fprintf(fout,"\n\t\t\t}"); | |
| 12866 fprintf(fout,"\n\t\t\tsoap_pop_block(soap, NULL);"); | |
| 12867 if (p->info.minOccurs > 0) | |
| 12868 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); | |
| 12869 if (p->info.maxOccurs > 1) | |
| 12870 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); | |
| 12871 if (((Tnode*)p->info.typ->ref)->type == Tclass | |
| 12872 || has_class((Tnode*)p->info.typ->ref) | |
| 12873 || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) | |
| 12874 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)); | |
| 12875 else | |
| 12876 fprintf(fout,"\n\t\t\ta->%s = (%s)soap_malloc(soap, soap->blist->size);", ident(p->sym->name), c_type(p->info.typ)); | |
| 12877 fprintf(fout,"\n\t\t\tsoap_save_block(soap, NULL, (char*)a->%s, 1);", ident(p->sym->name)); | |
| 12878 fprintf(fout,"\n\t\t}"); | |
| 12879 fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12880 } | |
| 12881 if (has_getter(typ)) | |
| 12882 fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); | |
| 12883 fprintf(fout,"\n\t}\n\telse\n\t{\t"); | |
| 12884 if (is_attachment(typ)) | |
| 12885 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"); | |
| 12886 if (typ->type == Tclass) | |
| 12887 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)); | |
| 12888 else | |
| 12889 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)); | |
| 12890 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); | |
| 12891 fprintf(fout,"\n\t}"); | |
| 12892 fprintf(fout,"\n\treturn a;\n}"); | |
| 12893 } | |
| 12894 | |
| 12895 const char * | |
| 12896 cstring(const char *s) | |
| 12897 { size_t n; | |
| 12898 char *t; | |
| 12899 const char *r; | |
| 12900 for (n = 0, r = s; *r; n++, r++) | |
| 12901 if (*r == '"' || *r == '\\') | |
| 12902 n++; | |
| 12903 else if (*r < 32) | |
| 12904 n += 3; | |
| 12905 r = t = (char*)emalloc(n + 1); | |
| 12906 for (; *s; s++) | |
| 12907 { if (*s == '"' || *s == '\\') | |
| 12908 { *t++ = '\\'; | |
| 12909 *t++ = *s; | |
| 12910 } | |
| 12911 else if (*s < 32) | |
| 12912 { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); | |
| 12913 t += 4; | |
| 12914 } | |
| 12915 else | |
| 12916 *t++ = *s; | |
| 12917 } | |
| 12918 *t = '\0'; | |
| 12919 return r; | |
| 12920 } | |
| 12921 | |
| 12922 const char * | |
| 12923 xstring(const char *s) | |
| 12924 { size_t n; | |
| 12925 char *t; | |
| 12926 const char *r; | |
| 12927 for (n = 0, r = s; *r; n++, r++) | |
| 12928 { if (*r < 32 || *r >= 127) | |
| 12929 n += 4; | |
| 12930 else if (*r == '<' || *r == '>') | |
| 12931 n += 3; | |
| 12932 else if (*r == '&') | |
| 12933 n += 4; | |
| 12934 else if (*r == '"') | |
| 12935 n += 5; | |
| 12936 else if (*r == '\\') | |
| 12937 n += 1; | |
| 12938 } | |
| 12939 r = t = (char*)emalloc(n + 1); | |
| 12940 for (; *s; s++) | |
| 12941 { if (*s < 32 || *s >= 127) | |
| 12942 { sprintf(t, "&#%.2x;", (unsigned char)*s); | |
| 12943 t += 5; | |
| 12944 } | |
| 12945 else if (*s == '<') | |
| 12946 { strcpy(t, "<"); | |
| 12947 t += 4; | |
| 12948 } | |
| 12949 else if (*s == '>') | |
| 12950 { strcpy(t, ">"); | |
| 12951 t += 4; | |
| 12952 } | |
| 12953 else if (*s == '&') | |
| 12954 { strcpy(t, "&"); | |
| 12955 t += 5; | |
| 12956 } | |
| 12957 else if (*s == '"') | |
| 12958 { strcpy(t, """); | |
| 12959 t += 6; | |
| 12960 } | |
| 12961 else if (*s == '\\') | |
| 12962 { strcpy(t, "\\\\"); | |
| 12963 t += 2; | |
| 12964 } | |
| 12965 else | |
| 12966 *t++ = *s; | |
| 12967 } | |
| 12968 *t = '\0'; | |
| 12969 return r; | |
| 12970 } |
