diff GEMBASSY-1.0.3/gsoap/wsdl/wsdl2h.cpp @ 0:8300eb051bea draft

Initial upload
author ktnyt
date Fri, 26 Jun 2015 05:19:29 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GEMBASSY-1.0.3/gsoap/wsdl/wsdl2h.cpp	Fri Jun 26 05:19:29 2015 -0400
@@ -0,0 +1,527 @@
+/*
+	wsdl2h.cpp
+
+	WSDL parser, translator, and generator (of the gSOAP header file format)
+
+--------------------------------------------------------------------------------
+gSOAP XML Web services tools
+Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.
+This software is released under one of the following licenses:
+GPL or Genivia's license for commercial use.
+--------------------------------------------------------------------------------
+GPL license.
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+Author contact information:
+engelen@genivia.com / engelen@acm.org
+--------------------------------------------------------------------------------
+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
+
+*/
+
+#include "includes.h"
+#include "types.h"
+#include "service.h"
+
+#ifndef WSDL2H_IMPORT_PATH
+#define WSDL2H_IMPORT_PATH (NULL)
+#endif
+
+#ifndef WSDL_TYPEMAP_FILE
+#define WSDL_TYPEMAP_FILE "typemap.dat"
+#endif
+
+static void init();
+static void options(int argc, char **argv);
+
+int _flag = 0,
+    aflag = 0,
+    bflag = 0,
+    cflag = 0,
+    dflag = 0,
+    eflag = 0,
+    fflag = 0,
+    gflag = 0,
+    iflag = 0,
+    jflag = 0,
+    kflag = 0,
+    mflag = 0,
+    pflag = 0,
+    Pflag = 0,
+    Rflag = 0,
+    sflag = 0,
+    uflag = 0,
+    vflag = 0,
+    wflag = 0,
+    Wflag = 0,
+    xflag = 0,
+    yflag = 0,
+    zflag = 0;
+
+int infiles = 0;
+char *infile[MAXINFILES],
+     *outfile = NULL,
+     *proxy_host = NULL,
+     *proxy_userid = NULL,
+     *proxy_passwd = NULL,
+     *auth_userid = NULL,
+     *auth_passwd = NULL;
+const char
+     *mapfile = WSDL_TYPEMAP_FILE,
+     *import_path = WSDL2H_IMPORT_PATH,
+     *cwd_path = NULL,
+     *cppnamespace = NULL;
+
+int proxy_port = 8080;
+
+FILE *stream = stdout;
+
+SetOfString exturis;
+
+extern struct Namespace namespaces[];
+
+const char *service_prefix = NULL;
+const char *schema_prefix = "ns";
+
+const char elementformat[]             = "    %-35s  %-30s";
+const char pointerformat[]             = "    %-35s *%-30s";
+const char attributeformat[]           = "   @%-35s  %-30s";
+const char vectorformat[]              = "    std::vector<%-23s> %-30s";
+const char pointervectorformat[]       = "    std::vector<%-22s> *%-30s";
+const char vectorformat_open[]         = "    std::vector<%s";
+const char arrayformat[]               = "    %-35s *__ptr%-25s";
+const char arraysizeformat[]           = "    %-35s  __size%-24s";
+const char arrayoffsetformat[]         = "//  %-35s  __offset%-22s";
+const char sizeformat[]                = "   $%-35s  __size%-24s";
+const char choiceformat[]              = "   $%-35s  __union%-23s";
+const char schemaformat[]              = "//gsoap %-5s schema %s:\t%s\n";
+const char serviceformat[]             = "//gsoap %-4s service %s:\t%s %s\n";
+const char paraformat[]                = "    %-35s%s%s%s";
+const char anonformat[]                = "    %-35s%s_%s%s";
+
+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";
+
+const char licensenotice[]   = "\
+--------------------------------------------------------------------------------\n\
+gSOAP XML Web services tools\n\
+Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\
+\n\
+This software is released under one of the following 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\
+This program is released under the GPL with the additional exemption that\n\
+compiling, linking, and/or using OpenSSL is allowed.\n\
+--------------------------------------------------------------------------------\n\
+A commercial-use license is available from Genivia, Inc., contact@genivia.com\n\
+--------------------------------------------------------------------------------\n";
+
+int main(int argc, char **argv)
+{ init();
+  fprintf(stderr, "%s", copyrightnotice);
+  options(argc, argv);
+  Definitions def;
+  wsdl__definitions definitions;
+  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:\n> soapcpp2 %s\n", outfile);
+    if (!cflag)
+      fprintf(stderr, "or to generate C++ proxy and object classes:\n> soapcpp2 -j %s\n", outfile);
+    fprintf(stderr, "\n");
+  }
+  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 '_':
+            _flag = 1;
+       	    break;
+          case 'a':
+            aflag = 1;
+       	    break;
+          case 'b':
+            bflag = 1;
+       	    break;
+          case 'c':
+            cflag = 1;
+            if (cppnamespace)
+	      fprintf(stderr, "wsdl2h: Options -c and -q clash\n");
+       	    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 'j':
+	    jflag = 1;
+	    break;
+	  case 'k':
+	    kflag = 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\n");
+	    break;
+	  case 'l':
+            fprintf(stderr, "%s", licensenotice);
+	    exit(0);
+	    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\n");
+	    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\n");
+	    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\n");
+	    break;
+	  case 'p':
+	    pflag = 1;
+	    break;
+	  case 'P':
+	    Pflag = 1;
+	    break;
+	  case 'q':
+            a++;
+            g = 0;
+            if (*a)
+	      cppnamespace = a;
+            else if (i < argc && argv[++i])
+              cppnamespace = argv[i];
+            else
+              fprintf(stderr, "wsdl2h: Option -q requires a C++ namespace name argument\n");
+            if (cflag)
+	      fprintf(stderr, "wsdl2h: Options -c and -q clash\n");
+	    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 proxy host:port:userid:passwd or :userid:passwd authentication argument\n");
+            if (proxy_host)
+	    { char *s = (char*)emalloc(strlen(proxy_host + 1));
+	      strcpy(s, proxy_host);
+	      proxy_host = s;
+	      s = strchr(proxy_host, ':');
+	      if (s)
+	      { *s = '\0';
+		if (*proxy_host)
+	        { proxy_port = soap_strtol(s + 1, &s, 10);
+		  if (s && *s == ':')
+	          { *s = '\0';
+		    proxy_userid = s + 1;
+		    s = strchr(proxy_userid, ':');
+		    if (s && *s == ':')
+		    { *s = '\0';
+		      proxy_passwd = s + 1;
+		    }
+		  }
+	        }
+		else
+		{ s = proxy_host;
+		  proxy_host = NULL;
+		  auth_userid = s + 1;
+                  s = strchr(auth_userid, ':');
+		  if (s && *s == ':')
+		  { *s = '\0';
+		    auth_passwd = s + 1;
+		  }
+		}
+	      }
+	    }
+	    break;
+	  case 'R':
+	    Rflag = 1;
+	    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\n");
+	    break;
+	  case 'u':
+	    uflag = 1;
+	    break;
+	  case 'v':
+	    vflag = 1;
+	    break;
+	  case 'w':
+	    wflag = 1;
+	    break;
+	  case 'W':
+	    Wflag = 1;
+	    break;
+	  case 'x':
+	    xflag = 1;
+	    break;
+	  case 'y':
+	    yflag = 1;
+	    break;
+	  case 'z':
+            a++;
+            g = 0;
+            if (*a)
+              zflag = soap_strtol(a, NULL, 10);
+            else if (i < argc && argv[++i])
+              zflag = soap_strtol(argv[i], NULL, 10);
+	    else
+	      zflag = 1;
+	    break;
+          case '?':
+          case 'h':
+            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");
+            fprintf(stderr, "\
+-a      generate indexed struct names for local elements with anonymous types\n\
+-b	bi-directional operations (duplex ops) added to serve one-way responses\n\
+-c      generate C source code\n\
+-d      use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\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\
+-i      don't import (advanced option)\n\
+-j      don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\
+-k      don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\
+-l      display license information\n\
+-m      use xsd.h module to import primitive types\n\
+-Nname  use name for service prefixes to produce a service for each binding\n\
+-nname  use name as the base namespace prefix instead of 'ns'\n\
+-ofile  output to file\n\
+-P      don't create polymorphic types inherited from xsd__anyType\n\
+-p      create polymorphic types inherited from base xsd__anyType\n\
+-qname  use name for the C++ namespace of all declarations\n\
+-R      generate REST operations for REST bindings in the WSDL\n\
+-rhost[:port[:uid:pwd]]\n\
+        connect via proxy host, port, and proxy credentials\n\
+-r:uid:pwd\n\
+        connect with authentication credentials (digest auth requires SSL)\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      suppress warnings\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\
+-z1     compatibility with 2.7.6e: generate pointer-based arrays\n\
+-z2     compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\
+-z3     compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\
+-z4     compatibility up to 2.8.11: don't generate union structs in std::vector\n\
+-z5     compatibility up to 2.8.15\n\
+-_      don't generate _USCORE (replace with UNICODE _x005f)\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 >= MAXINFILES)
+      { fprintf(stderr, "wsdl2h: too many files\n");
+        exit(1);
+      }
+    }
+  }
+  if (infiles)
+  { if (!outfile)
+    { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8))
+      { const char *s = strrchr(infile[0], '.');
+        if (s && (!soap_tag_cmp(s, ".wsdl") || !soap_tag_cmp(s, ".gwsdl") || !soap_tag_cmp(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);
+      }
+      if (cppnamespace)
+        fprintf(stream, "namespace %s {\n", cppnamespace);
+      fprintf(stderr, "Saving %s\n\n", outfile);
+    }
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//	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/"},
+  {"xmime", "http://www.w3.org/2005/05/xmlmime"},
+  {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/"},
+  {"sp", "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702", "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"},
+  {"wsdl", "http://schemas.xmlsoap.org/wsdl/", "http://www.w3.org/ns/wsdl"},
+  {"wsdli", "http://www.w3.org/ns/wsdl-instance"},
+  {"wsdlx", "http://www.w3.org/ns/wsdl-extensions"},
+  {"wsoap", "http://www.w3.org/ns/wsdl/soap"},
+  {"whttp", "http://www.w3.org/ns/wsdl/http"},
+  {"wrpc", "http://www.w3.org/ns/wsdl/rpc"},
+  {"wsa_", "http://www.w3.org/2005/08/addressing"},
+  {"wsaw", "http://www.w3.org/2006/05/addressing/wsdl"},
+  {"wsam", "http://www.w3.org/2007/05/addressing/metadata"},
+  {"wsrmp", "http://schemas.xmlsoap.org/ws/2005/02/rm/policy", "http://docs.oasis-open.org/ws-rx/wsrmp/*"},
+  {"wsp", "http://www.w3.org/ns/ws-policy", "http://schemas.xmlsoap.org/ws/2004/09/policy"},
+  {"wst", "http://docs.oasis-open.org/ws-sx/ws-trust/200512"},
+  {"wsu_", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"},
+  {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions"},
+  {NULL, NULL}
+};