aboutsummaryrefslogtreecommitdiff
path: root/wsdl/wsdl2h.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'wsdl/wsdl2h.cpp')
-rw-r--r--wsdl/wsdl2h.cpp410
1 files changed, 410 insertions, 0 deletions
diff --git a/wsdl/wsdl2h.cpp b/wsdl/wsdl2h.cpp
new file mode 100644
index 0000000..a67aba0
--- /dev/null
+++ b/wsdl/wsdl2h.cpp
@@ -0,0 +1,410 @@
+/*
+
+wsdl2h.cpp
+
+WSDL parser and converter to gSOAP header file format
+
+--------------------------------------------------------------------------------
+gSOAP XML Web services tools
+Copyright (C) 2000-2006, Robert van Engelen, Genivia Inc. All Rights Reserved.
+This software is released under one of the following two licenses:
+GPL or Genivia's license for commercial use.
+--------------------------------------------------------------------------------
+GPL license.
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+Author contact information:
+engelen@genivia.com / engelen@acm.org
+--------------------------------------------------------------------------------
+A commercial use license is available from Genivia, Inc., contact@genivia.com
+--------------------------------------------------------------------------------
+
+Build:
+ soapcpp2 -ipwsdl wsdl.h
+ g++ -o wsdl2h wsdl2h.cpp types.cpp service.cpp wsdl.cpp schema.cpp wsdlC.cpp stdsoap2.cpp
+
+TODO:
+ Resolve relative versus absolute import paths for reading imported WSDL/schema (use URL local addresses)
+ Do not generate abstract complexTypes, but include defs in derived types
+ Handle simpleType derivation from base64
+ Option to define base class for all classes, e.g. -b xsd__anyType
+ Look into improving xs:any
+
+*/
+
+#include "includes.h"
+#include "types.h"
+#include "service.h"
+
+static void init();
+static void options(int argc, char **argv);
+
+int aflag = 0,
+ cflag = 0,
+ dflag = 0,
+ eflag = 0,
+ fflag = 0,
+ gflag = 0,
+ iflag = 0,
+ lflag = 0,
+ mflag = 0,
+ pflag = 0,
+ sflag = 0,
+ uflag = 0,
+ vflag = 0,
+ wflag = 0,
+ xflag = 0,
+ yflag = 0,
+ zflag = 0;
+
+int infiles = 0;
+char *infile[100],
+ *outfile = NULL,
+ *mapfile = "typemap.dat",
+ *proxy_host = NULL,
+ *import_path = NULL;
+
+int proxy_port = 8080;
+
+FILE *stream = stdout;
+
+SetOfString exturis;
+
+const char *service_prefix = NULL;
+const char *schema_prefix = "ns";
+
+char elementformat[] = " %-35s %-30s";
+char pointerformat[] = " %-35s *%-30s";
+char attributeformat[] = " @%-35s %-30s";
+char vectorformat[] = " std::vector<%-23s> %-30s";
+char pointervectorformat[] = " std::vector<%-22s> *%-30s";
+char arrayformat[] = " %-35s *__ptr%-25s";
+char sizeformat[] = " %-35s __size%-24s";
+char offsetformat[] = "// %-35s __offset%-22s";
+char choiceformat[] = " %-35s __union%-23s";
+char schemaformat[] = "//gsoap %-5s schema %s:\t%s\n";
+char serviceformat[] = "//gsoap %-4s service %s:\t%s %s\n";
+char paraformat[] = " %-35s%s%s%s";
+char anonformat[] = " %-35s%s_%s%s";
+
+char copyrightnotice[] = "\n** The gSOAP WSDL parser for C and C++ "VERSION"\n** Copyright (C) 2000-2006 Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The gSOAP WSDL parser is released under one of the following two licenses:\n** GPL or the commercial license by Genivia Inc. Use option -l for more info.\n\n";
+
+char licensenotice[] = "\
+--------------------------------------------------------------------------------\n\
+gSOAP XML Web services tools\n\
+Copyright (C) 2000-2006, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\
+\n\
+This software is released under one of the following two licenses:\n\
+GPL or Genivia's license for commercial use.\n\
+\n\
+GPL license.\n\
+\n\
+This program is free software; you can redistribute it and/or modify it under\n\
+the terms of the GNU General Public License as published by the Free Software\n\
+Foundation; either version 2 of the License, or (at your option) any later\n\
+version.\n\
+\n\
+This program is distributed in the hope that it will be useful, but WITHOUT ANY\n\
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\
+PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\
+\n\
+You should have received a copy of the GNU General Public License along with\n\
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n\
+Place, Suite 330, Boston, MA 02111-1307 USA\n\
+\n\
+Author contact information:\n\
+engelen@genivia.com / engelen@acm.org\n\
+--------------------------------------------------------------------------------\n\
+A commercial use license is available from Genivia, Inc., contact@genivia.com\n\
+--------------------------------------------------------------------------------\n";
+
+int main(int argc, char **argv)
+{ init();
+ options(argc, argv);
+ fprintf(stderr, copyrightnotice);
+ if (lflag)
+ { fprintf(stderr, licensenotice);
+ if (!infiles)
+ exit(0);
+ }
+ wsdl__definitions definitions;
+ if (infiles)
+ { if (!outfile)
+ { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8))
+ { const char *s = strrchr(infile[0], '.');
+ if (s && (!strcmp(s, ".wsdl") || !strcmp(s, ".gwsdl") || !strcmp(s, ".xsd")))
+ { outfile = estrdup(infile[0]);
+ outfile[s - infile[0] + 1] = 'h';
+ outfile[s - infile[0] + 2] = '\0';
+ }
+ else
+ { outfile = (char*)emalloc(strlen(infile[0]) + 3);
+ strcpy(outfile, infile[0]);
+ strcat(outfile, ".h");
+ }
+ }
+ }
+ }
+ if (outfile)
+ { stream = fopen(outfile, "w");
+ if (!stream)
+ { fprintf(stderr, "Cannot write to %s\n", outfile);
+ exit(1);
+ }
+ fprintf(stderr, "Saving %s\n\n", outfile);
+ }
+ Definitions def;
+ definitions.read(infiles, infile);
+ if (definitions.error())
+ { definitions.print_fault();
+ exit(1);
+ }
+ definitions.traverse();
+ def.compile(definitions);
+ if (outfile)
+ { fclose(stream);
+ fprintf(stderr, "\nTo complete the process, compile with:\nsoapcpp2 %s\n\n", outfile);
+ }
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Initialization
+//
+////////////////////////////////////////////////////////////////////////////////
+
+static void init()
+{ struct Namespace *p = namespaces;
+ if (p)
+ { for (; p->id; p++)
+ { if (p->in && *p->in)
+ exturis.insert(p->in);
+ if (p->ns && *p->ns)
+ exturis.insert(p->ns);
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Parse command line options
+//
+////////////////////////////////////////////////////////////////////////////////
+
+static void options(int argc, char **argv)
+{ int i;
+ infiles = 0;
+ for (i = 1; i < argc; i++)
+ { char *a = argv[i];
+ if (*a == '-'
+#ifdef WIN32
+ || *a == '/'
+#endif
+ )
+ { int g = 1;
+ while (g && *++a)
+ { switch (*a)
+ { case 'a':
+ aflag = 1;
+ break;
+ case 'c':
+ cflag = 1;
+ break;
+ case 'd':
+ dflag = 1;
+ break;
+ case 'e':
+ eflag = 1;
+ break;
+ case 'f':
+ fflag = 1;
+ break;
+ case 'g':
+ gflag = 1;
+ break;
+ case 'i':
+ iflag = 1;
+ break;
+ case 'I':
+ a++;
+ g = 0;
+ if (*a)
+ import_path = a;
+ else if (i < argc && argv[++i])
+ import_path = argv[i];
+ else
+ fprintf(stderr, "wsdl2h: Option -I requires a path argument");
+ break;
+ case 'l':
+ lflag = 1;
+ break;
+ case 'm':
+ mflag = 1;
+ break;
+ case 'n':
+ a++;
+ g = 0;
+ if (*a)
+ schema_prefix = a;
+ else if (i < argc && argv[++i])
+ schema_prefix = argv[i];
+ else
+ fprintf(stderr, "wsdl2h: Option -n requires a prefix name argument");
+ break;
+ case 'N':
+ a++;
+ g = 0;
+ if (*a)
+ service_prefix = a;
+ else if (i < argc && argv[++i])
+ service_prefix = argv[i];
+ else
+ fprintf(stderr, "wsdl2h: Option -N requires a prefix name argument");
+ break;
+ case 'o':
+ a++;
+ g = 0;
+ if (*a)
+ outfile = a;
+ else if (i < argc && argv[++i])
+ outfile = argv[i];
+ else
+ fprintf(stderr, "wsdl2h: Option -o requires an output file argument");
+ break;
+ case 'p':
+ pflag = 1;
+ break;
+ case 'r':
+ a++;
+ g = 0;
+ if (*a)
+ proxy_host = a;
+ else if (i < argc && argv[++i])
+ proxy_host = argv[i];
+ else
+ fprintf(stderr, "wsdl2h: Option -r requires a proxy host:port argument");
+ if (proxy_host)
+ { char *s = (char*)emalloc(strlen(proxy_host + 1));
+ strcpy(s, proxy_host);
+ proxy_host = s;
+ s = strchr(proxy_host, ':');
+ if (s)
+ { proxy_port = soap_strtol(s + 1, NULL, 10);
+ *s = '\0';
+ }
+ }
+ break;
+ case 's':
+ sflag = 1;
+ break;
+ case 't':
+ a++;
+ g = 0;
+ if (*a)
+ mapfile = a;
+ else if (i < argc && argv[++i])
+ mapfile = argv[i];
+ else
+ fprintf(stderr, "wsdl2h: Option -t requires a type map file argument");
+ break;
+ case 'u':
+ uflag = 1;
+ break;
+ case 'v':
+ vflag = 1;
+ break;
+ case 'w':
+ wflag = 1;
+ break;
+ case 'x':
+ xflag = 1;
+ break;
+ case 'y':
+ yflag = 1;
+ break;
+ case 'z':
+ zflag = 1;
+ break;
+ case '?':
+ case 'h':
+ fprintf(stderr, "Usage: wsdl2h [-a] [-c] [-d] [-e] [-f] [-g] [-h] [-I path] [-l] [-m] [-n name] [-N name] [-p] [-r proxyhost:port] [-s] [-t typemapfile.dat] [-u] [-v] [-w] [-x] [-y] [-z] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n");
+ fprintf(stderr, "\
+-a generate indexed struct names for local elements with anonymous types\n\
+-c generate C source code\n\
+-d use DOM to populate xs:any and xsd:anyType elements\n\
+-e don't qualify enum names\n\
+-f generate flat C++ class hierarchy\n\
+-g generate global top-level element declarations\n\
+-h display help info\n\
+-Ipath use path to find files\n\
+-l include license information in output\n\
+-m use xsd.h module to import primitive types\n\
+-nname use name as the base namespace prefix instead of 'ns'\n\
+-Nname use name as the base namespace prefix for service namespaces\n\
+-ofile output to file\n\
+-p create polymorphic types with C++ inheritance with base xsd__anyType\n\
+-rhost:port\n\
+ connect via proxy host and port\n\
+-s don't generate STL code (no std::string and no std::vector)\n\
+-tfile use type map file instead of the default file typemap.dat\n\
+-u don't generate unions\n\
+-v verbose output\n\
+-w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\
+-x don't generate _XML any/anyAttribute extensibility elements\n\
+-y generate typedef synonyms for structs and enums\n\
+-z generate pointer-based arrays for backward compatibility < gSOAP 2.7.6e\n\
+infile.wsdl infile.xsd http://www... list of input sources (if none use stdin)\n\
+\n");
+ exit(0);
+ default:
+ fprintf(stderr, "wsdl2h: Unknown option %s\n", a);
+ exit(1);
+ }
+ }
+ }
+ else
+ { infile[infiles++] = argv[i];
+ if (infiles >= 100)
+ { fprintf(stderr, "wsdl2h: too many files\n");
+ exit(1);
+ }
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespaces
+//
+////////////////////////////////////////////////////////////////////////////////
+
+struct Namespace namespaces[] =
+{
+ {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope"},
+ {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding"},
+ {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
+ {"xsd", ""}, // http://www.w3.org/2001/XMLSchema"}, // don't use this, it might conflict with xs
+ {"xml", "http://www.w3.org/XML/1998/namespace"},
+ {"xs", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" },
+ {"http", "http://schemas.xmlsoap.org/wsdl/http/"},
+ {"soap", "http://schemas.xmlsoap.org/wsdl/soap/", "http://schemas.xmlsoap.org/wsdl/soap*/"},
+ {"mime", "http://schemas.xmlsoap.org/wsdl/mime/"},
+ {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/"},
+ {"wsdl", "http://schemas.xmlsoap.org/wsdl/"},
+ {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions"},
+ {"sd", "http://www.gridforum.org/namespaces/2003/03/serviceData"},
+ {NULL, NULL}
+};