comparison GEMBASSY-1.0.3/gsoap/src/symbol2.c @ 0:8300eb051bea draft

Initial upload
author ktnyt
date Fri, 26 Jun 2015 05:19:29 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:8300eb051bea
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, "&lt;");
12947 t += 4;
12948 }
12949 else if (*s == '>')
12950 { strcpy(t, "&gt;");
12951 t += 4;
12952 }
12953 else if (*s == '&')
12954 { strcpy(t, "&amp;");
12955 t += 5;
12956 }
12957 else if (*s == '"')
12958 { strcpy(t, "&quot;");
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 }