comparison GEMBASSY-1.0.3/gsoap/wsdl/wsdl2h.cpp @ 2:8947fca5f715 draft default tip

Uploaded
author ktnyt
date Fri, 26 Jun 2015 05:21:44 -0400
parents 84a17b3fad1f
children
comparison
equal deleted inserted replaced
1:84a17b3fad1f 2:8947fca5f715
1 /*
2 wsdl2h.cpp
3
4 WSDL parser, translator, and generator (of the gSOAP header file format)
5
6 --------------------------------------------------------------------------------
7 gSOAP XML Web services tools
8 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.
9 This 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 A commercial use license is available from Genivia, Inc., contact@genivia.com
31 --------------------------------------------------------------------------------
32
33 Build:
34 soapcpp2 -ipwsdl wsdl.h
35 g++ -o wsdl2h wsdl2h.cpp types.cpp service.cpp wsdl.cpp schema.cpp wsdlC.cpp stdsoap2.cpp
36
37 TODO:
38 Resolve relative versus absolute import paths for reading imported WSDL/schema (use URL local addresses)
39 Do not generate abstract complexTypes, but include defs in derived types
40 Handle simpleType derivation from base64
41
42 */
43
44 #include "includes.h"
45 #include "types.h"
46 #include "service.h"
47
48 #ifndef WSDL2H_IMPORT_PATH
49 #define WSDL2H_IMPORT_PATH (NULL)
50 #endif
51
52 #ifndef WSDL_TYPEMAP_FILE
53 #define WSDL_TYPEMAP_FILE "typemap.dat"
54 #endif
55
56 static void init();
57 static void options(int argc, char **argv);
58
59 int _flag = 0,
60 aflag = 0,
61 bflag = 0,
62 cflag = 0,
63 dflag = 0,
64 eflag = 0,
65 fflag = 0,
66 gflag = 0,
67 iflag = 0,
68 jflag = 0,
69 kflag = 0,
70 mflag = 0,
71 pflag = 0,
72 Pflag = 0,
73 Rflag = 0,
74 sflag = 0,
75 uflag = 0,
76 vflag = 0,
77 wflag = 0,
78 Wflag = 0,
79 xflag = 0,
80 yflag = 0,
81 zflag = 0;
82
83 int infiles = 0;
84 char *infile[MAXINFILES],
85 *outfile = NULL,
86 *proxy_host = NULL,
87 *proxy_userid = NULL,
88 *proxy_passwd = NULL,
89 *auth_userid = NULL,
90 *auth_passwd = NULL;
91 const char
92 *mapfile = WSDL_TYPEMAP_FILE,
93 *import_path = WSDL2H_IMPORT_PATH,
94 *cwd_path = NULL,
95 *cppnamespace = NULL;
96
97 int proxy_port = 8080;
98
99 FILE *stream = stdout;
100
101 SetOfString exturis;
102
103 extern struct Namespace namespaces[];
104
105 const char *service_prefix = NULL;
106 const char *schema_prefix = "ns";
107
108 const char elementformat[] = " %-35s %-30s";
109 const char pointerformat[] = " %-35s *%-30s";
110 const char attributeformat[] = " @%-35s %-30s";
111 const char vectorformat[] = " std::vector<%-23s> %-30s";
112 const char pointervectorformat[] = " std::vector<%-22s> *%-30s";
113 const char vectorformat_open[] = " std::vector<%s";
114 const char arrayformat[] = " %-35s *__ptr%-25s";
115 const char arraysizeformat[] = " %-35s __size%-24s";
116 const char arrayoffsetformat[] = "// %-35s __offset%-22s";
117 const char sizeformat[] = " $%-35s __size%-24s";
118 const char choiceformat[] = " $%-35s __union%-23s";
119 const char schemaformat[] = "//gsoap %-5s schema %s:\t%s\n";
120 const char serviceformat[] = "//gsoap %-4s service %s:\t%s %s\n";
121 const char paraformat[] = " %-35s%s%s%s";
122 const char anonformat[] = " %-35s%s_%s%s";
123
124 const char copyrightnotice[] = "\n** The gSOAP WSDL/Schema processor for C and C++, wsdl2h release " WSDL2H_VERSION "\n** Copyright (C) 2000-2013 Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The wsdl2h tool is released under one of the following licenses:\n** GPL or the commercial license by Genivia Inc. Use option -l for details.\n\n";
125
126 const char licensenotice[] = "\
127 --------------------------------------------------------------------------------\n\
128 gSOAP XML Web services tools\n\
129 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\
130 \n\
131 This software is released under one of the following licenses:\n\
132 GPL or Genivia's license for commercial use.\n\
133 --------------------------------------------------------------------------------\n\
134 GPL license.\n\
135 \n\
136 This program is free software; you can redistribute it and/or modify it under\n\
137 the terms of the GNU General Public License as published by the Free Software\n\
138 Foundation; either version 2 of the License, or (at your option) any later\n\
139 version.\n\
140 \n\
141 This program is distributed in the hope that it will be useful, but WITHOUT ANY\n\
142 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\
143 PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\
144 \n\
145 You should have received a copy of the GNU General Public License along with\n\
146 this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n\
147 Place, Suite 330, Boston, MA 02111-1307 USA\n\
148 \n\
149 Author contact information:\n\
150 engelen@genivia.com / engelen@acm.org\n\
151 \n\
152 This program is released under the GPL with the additional exemption that\n\
153 compiling, linking, and/or using OpenSSL is allowed.\n\
154 --------------------------------------------------------------------------------\n\
155 A commercial-use license is available from Genivia, Inc., contact@genivia.com\n\
156 --------------------------------------------------------------------------------\n";
157
158 int main(int argc, char **argv)
159 { init();
160 fprintf(stderr, "%s", copyrightnotice);
161 options(argc, argv);
162 Definitions def;
163 wsdl__definitions definitions;
164 definitions.read(infiles, infile);
165 if (definitions.error())
166 { definitions.print_fault();
167 exit(1);
168 }
169 definitions.traverse();
170 def.compile(definitions);
171 if (outfile)
172 { fclose(stream);
173 fprintf(stderr, "\nTo complete the process, compile with:\n> soapcpp2 %s\n", outfile);
174 if (!cflag)
175 fprintf(stderr, "or to generate C++ proxy and object classes:\n> soapcpp2 -j %s\n", outfile);
176 fprintf(stderr, "\n");
177 }
178 return 0;
179 }
180
181 ////////////////////////////////////////////////////////////////////////////////
182 //
183 // Initialization
184 //
185 ////////////////////////////////////////////////////////////////////////////////
186
187 static void init()
188 { struct Namespace *p = namespaces;
189 if (p)
190 { for (; p->id; p++)
191 { if (p->in && *p->in)
192 exturis.insert(p->in);
193 if (p->ns && *p->ns)
194 exturis.insert(p->ns);
195 }
196 }
197 }
198
199 ////////////////////////////////////////////////////////////////////////////////
200 //
201 // Parse command line options
202 //
203 ////////////////////////////////////////////////////////////////////////////////
204
205 static void options(int argc, char **argv)
206 { int i;
207 infiles = 0;
208 for (i = 1; i < argc; i++)
209 { char *a = argv[i];
210 if (*a == '-'
211 #ifdef WIN32
212 || *a == '/'
213 #endif
214 )
215 { int g = 1;
216 while (g && *++a)
217 { switch (*a)
218 { case '_':
219 _flag = 1;
220 break;
221 case 'a':
222 aflag = 1;
223 break;
224 case 'b':
225 bflag = 1;
226 break;
227 case 'c':
228 cflag = 1;
229 if (cppnamespace)
230 fprintf(stderr, "wsdl2h: Options -c and -q clash\n");
231 break;
232 case 'd':
233 dflag = 1;
234 break;
235 case 'e':
236 eflag = 1;
237 break;
238 case 'f':
239 fflag = 1;
240 break;
241 case 'g':
242 gflag = 1;
243 break;
244 case 'i':
245 iflag = 1;
246 break;
247 case 'j':
248 jflag = 1;
249 break;
250 case 'k':
251 kflag = 1;
252 break;
253 case 'I':
254 a++;
255 g = 0;
256 if (*a)
257 import_path = a;
258 else if (i < argc && argv[++i])
259 import_path = argv[i];
260 else
261 fprintf(stderr, "wsdl2h: Option -I requires a path argument\n");
262 break;
263 case 'l':
264 fprintf(stderr, "%s", licensenotice);
265 exit(0);
266 break;
267 case 'm':
268 mflag = 1;
269 break;
270 case 'n':
271 a++;
272 g = 0;
273 if (*a)
274 schema_prefix = a;
275 else if (i < argc && argv[++i])
276 schema_prefix = argv[i];
277 else
278 fprintf(stderr, "wsdl2h: Option -n requires a prefix name argument\n");
279 break;
280 case 'N':
281 a++;
282 g = 0;
283 if (*a)
284 service_prefix = a;
285 else if (i < argc && argv[++i])
286 service_prefix = argv[i];
287 else
288 fprintf(stderr, "wsdl2h: Option -N requires a prefix name argument\n");
289 break;
290 case 'o':
291 a++;
292 g = 0;
293 if (*a)
294 outfile = a;
295 else if (i < argc && argv[++i])
296 outfile = argv[i];
297 else
298 fprintf(stderr, "wsdl2h: Option -o requires an output file argument\n");
299 break;
300 case 'p':
301 pflag = 1;
302 break;
303 case 'P':
304 Pflag = 1;
305 break;
306 case 'q':
307 a++;
308 g = 0;
309 if (*a)
310 cppnamespace = a;
311 else if (i < argc && argv[++i])
312 cppnamespace = argv[i];
313 else
314 fprintf(stderr, "wsdl2h: Option -q requires a C++ namespace name argument\n");
315 if (cflag)
316 fprintf(stderr, "wsdl2h: Options -c and -q clash\n");
317 break;
318 case 'r':
319 a++;
320 g = 0;
321 if (*a)
322 proxy_host = a;
323 else if (i < argc && argv[++i])
324 proxy_host = argv[i];
325 else
326 fprintf(stderr, "wsdl2h: Option -r requires proxy host:port:userid:passwd or :userid:passwd authentication argument\n");
327 if (proxy_host)
328 { char *s = (char*)emalloc(strlen(proxy_host + 1));
329 strcpy(s, proxy_host);
330 proxy_host = s;
331 s = strchr(proxy_host, ':');
332 if (s)
333 { *s = '\0';
334 if (*proxy_host)
335 { proxy_port = soap_strtol(s + 1, &s, 10);
336 if (s && *s == ':')
337 { *s = '\0';
338 proxy_userid = s + 1;
339 s = strchr(proxy_userid, ':');
340 if (s && *s == ':')
341 { *s = '\0';
342 proxy_passwd = s + 1;
343 }
344 }
345 }
346 else
347 { s = proxy_host;
348 proxy_host = NULL;
349 auth_userid = s + 1;
350 s = strchr(auth_userid, ':');
351 if (s && *s == ':')
352 { *s = '\0';
353 auth_passwd = s + 1;
354 }
355 }
356 }
357 }
358 break;
359 case 'R':
360 Rflag = 1;
361 break;
362 case 's':
363 sflag = 1;
364 break;
365 case 't':
366 a++;
367 g = 0;
368 if (*a)
369 mapfile = a;
370 else if (i < argc && argv[++i])
371 mapfile = argv[i];
372 else
373 fprintf(stderr, "wsdl2h: Option -t requires a type map file argument\n");
374 break;
375 case 'u':
376 uflag = 1;
377 break;
378 case 'v':
379 vflag = 1;
380 break;
381 case 'w':
382 wflag = 1;
383 break;
384 case 'W':
385 Wflag = 1;
386 break;
387 case 'x':
388 xflag = 1;
389 break;
390 case 'y':
391 yflag = 1;
392 break;
393 case 'z':
394 a++;
395 g = 0;
396 if (*a)
397 zflag = soap_strtol(a, NULL, 10);
398 else if (i < argc && argv[++i])
399 zflag = soap_strtol(argv[i], NULL, 10);
400 else
401 zflag = 1;
402 break;
403 case '?':
404 case 'h':
405 fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c] [-d] [-e] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-l] [-m] [-N name] [-n name] [-P|-p] [-q name] [-R] [-r proxyhost[:port[:uid:pwd]]] [-r:userid:passwd] [-s] [-t typemapfile] [-u] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n");
406 fprintf(stderr, "\
407 -a generate indexed struct names for local elements with anonymous types\n\
408 -b bi-directional operations (duplex ops) added to serve one-way responses\n\
409 -c generate C source code\n\
410 -d use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\
411 -e don't qualify enum names\n\
412 -f generate flat C++ class hierarchy\n\
413 -g generate global top-level element declarations\n\
414 -h display help info\n\
415 -Ipath use path to find files\n\
416 -i don't import (advanced option)\n\
417 -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\
418 -k don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\
419 -l display license information\n\
420 -m use xsd.h module to import primitive types\n\
421 -Nname use name for service prefixes to produce a service for each binding\n\
422 -nname use name as the base namespace prefix instead of 'ns'\n\
423 -ofile output to file\n\
424 -P don't create polymorphic types inherited from xsd__anyType\n\
425 -p create polymorphic types inherited from base xsd__anyType\n\
426 -qname use name for the C++ namespace of all declarations\n\
427 -R generate REST operations for REST bindings in the WSDL\n\
428 -rhost[:port[:uid:pwd]]\n\
429 connect via proxy host, port, and proxy credentials\n\
430 -r:uid:pwd\n\
431 connect with authentication credentials (digest auth requires SSL)\n\
432 -s don't generate STL code (no std::string and no std::vector)\n\
433 -tfile use type map file instead of the default file typemap.dat\n\
434 -u don't generate unions\n\
435 -v verbose output\n\
436 -W suppress warnings\n\
437 -w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\
438 -x don't generate _XML any/anyAttribute extensibility elements\n\
439 -y generate typedef synonyms for structs and enums\n\
440 -z1 compatibility with 2.7.6e: generate pointer-based arrays\n\
441 -z2 compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\
442 -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\
443 -z4 compatibility up to 2.8.11: don't generate union structs in std::vector\n\
444 -z5 compatibility up to 2.8.15\n\
445 -_ don't generate _USCORE (replace with UNICODE _x005f)\n\
446 infile.wsdl infile.xsd http://www... list of input sources (if none: use stdin)\n\
447 \n");
448 exit(0);
449 default:
450 fprintf(stderr, "wsdl2h: Unknown option %s\n", a);
451 exit(1);
452 }
453 }
454 }
455 else
456 { infile[infiles++] = argv[i];
457 if (infiles >= MAXINFILES)
458 { fprintf(stderr, "wsdl2h: too many files\n");
459 exit(1);
460 }
461 }
462 }
463 if (infiles)
464 { if (!outfile)
465 { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8))
466 { const char *s = strrchr(infile[0], '.');
467 if (s && (!soap_tag_cmp(s, ".wsdl") || !soap_tag_cmp(s, ".gwsdl") || !soap_tag_cmp(s, ".xsd")))
468 { outfile = estrdup(infile[0]);
469 outfile[s - infile[0] + 1] = 'h';
470 outfile[s - infile[0] + 2] = '\0';
471 }
472 else
473 { outfile = (char*)emalloc(strlen(infile[0]) + 3);
474 strcpy(outfile, infile[0]);
475 strcat(outfile, ".h");
476 }
477 }
478 }
479 if (outfile)
480 { stream = fopen(outfile, "w");
481 if (!stream)
482 { fprintf(stderr, "Cannot write to %s\n", outfile);
483 exit(1);
484 }
485 if (cppnamespace)
486 fprintf(stream, "namespace %s {\n", cppnamespace);
487 fprintf(stderr, "Saving %s\n\n", outfile);
488 }
489 }
490 }
491
492 ////////////////////////////////////////////////////////////////////////////////
493 //
494 // Namespaces
495 //
496 ////////////////////////////////////////////////////////////////////////////////
497
498 struct Namespace namespaces[] =
499 {
500 {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope"},
501 {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding"},
502 {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
503 {"xsd", "-"}, // http://www.w3.org/2001/XMLSchema"}, // don't use this, it might conflict with xs
504 {"xml", "http://www.w3.org/XML/1998/namespace"},
505 {"xs", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" },
506 {"http", "http://schemas.xmlsoap.org/wsdl/http/"},
507 {"soap", "http://schemas.xmlsoap.org/wsdl/soap/", "http://schemas.xmlsoap.org/wsdl/soap*/"},
508 {"mime", "http://schemas.xmlsoap.org/wsdl/mime/"},
509 {"xmime", "http://www.w3.org/2005/05/xmlmime"},
510 {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/"},
511 {"sp", "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702", "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"},
512 {"wsdl", "http://schemas.xmlsoap.org/wsdl/", "http://www.w3.org/ns/wsdl"},
513 {"wsdli", "http://www.w3.org/ns/wsdl-instance"},
514 {"wsdlx", "http://www.w3.org/ns/wsdl-extensions"},
515 {"wsoap", "http://www.w3.org/ns/wsdl/soap"},
516 {"whttp", "http://www.w3.org/ns/wsdl/http"},
517 {"wrpc", "http://www.w3.org/ns/wsdl/rpc"},
518 {"wsa_", "http://www.w3.org/2005/08/addressing"},
519 {"wsaw", "http://www.w3.org/2006/05/addressing/wsdl"},
520 {"wsam", "http://www.w3.org/2007/05/addressing/metadata"},
521 {"wsrmp", "http://schemas.xmlsoap.org/ws/2005/02/rm/policy", "http://docs.oasis-open.org/ws-rx/wsrmp/*"},
522 {"wsp", "http://www.w3.org/ns/ws-policy", "http://schemas.xmlsoap.org/ws/2004/09/policy"},
523 {"wst", "http://docs.oasis-open.org/ws-sx/ws-trust/200512"},
524 {"wsu_", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"},
525 {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions"},
526 {NULL, NULL}
527 };