diff options
Diffstat (limited to 'src/VBox/Main/webservice/websrv-wsdl2gsoapH.xsl')
-rw-r--r-- | src/VBox/Main/webservice/websrv-wsdl2gsoapH.xsl | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/src/VBox/Main/webservice/websrv-wsdl2gsoapH.xsl b/src/VBox/Main/webservice/websrv-wsdl2gsoapH.xsl new file mode 100644 index 00000000..4303e537 --- /dev/null +++ b/src/VBox/Main/webservice/websrv-wsdl2gsoapH.xsl @@ -0,0 +1,308 @@ +<?xml version="1.0"?> + +<!-- + websrv-gsoapH.xsl: + XSLT stylesheet that generates a gSOAP pseudo-header + file from VirtualBox.xidl. Such a pseudo-header files + can be fed into gSOAP's soapcpp2 to create web service + client headers and server stubs. + See webservice/Makefile.kmk for an overview of all the things + generated for the webservice. +--> +<!-- + Copyright (C) 2006-2022 Oracle and/or its affiliates. + + This file is part of VirtualBox base platform packages, as + available from https://www.virtualbox.org. + + 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, in version 3 of the + License. + + 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, see <https://www.gnu.org/licenses>. + + SPDX-License-Identifier: GPL-3.0-only +--> + +<xsl:stylesheet + version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:vbox="http://www.virtualbox.org/" + xmlns:exsl="http://exslt.org/common" + extension-element-prefixes="exsl" + > + + <xsl:param name="G_argDebug" /> + + <xsl:output method="text"/> + + <xsl:strip-space elements="*"/> + +<!-- - - - - - - - - - - - - - - - - - - - - - - + global XSLT variables + - - - - - - - - - - - - - - - - - - - - - - --> + +<xsl:variable name="G_xsltFilename" select="'websrv-wsdl2gsoapH.xsl'" /> + +<xsl:include href="../idl/typemap-shared.inc.xsl" /> + +<!-- collect all interfaces with "wsmap='suppress'" in a global variable for + quick lookup --> +<xsl:variable name="G_setSuppressedInterfaces" + select="//interface[@wsmap='suppress']" /> + + +<!-- - - - - - - - - - - - - - - - - - - - - - - + Keys for more efficiently looking up of stuff + - - - - - - - - - - - - - - - - - - - - - - --> + +<xsl:key name="G_keyMessagesByName" match="//wsdl:message[@name]" use="@name"/> +<xsl:key name="G_keySimpleTypesByName" match="//xsd:simpleType[@name]" use="@name"/> +<xsl:key name="G_keyComplexTypesByName" match="//xsd:complexType[@name]" use="@name"/> + + +<!-- - - - - - - - - - - - - - - - - - - - - - - + root match + - - - - - - - - - - - - - - - - - - - - - - --> + +<xsl:template match="/wsdl:definitions"> + <xsl:text><![CDATA[ +/* DO NOT EDIT! This is a generated file. + * Generated from: vboxweb.wsdl (generated WSDL file) + * Generator: src/VBox/Main/webservice/websrv-gsoapH.xsl + * + * Note: This is not a real C/C++ header file. Instead, gSOAP uses files like this + * one -- with a pseudo-C-header syntax -- to describe a web service API. + */ + +// STL vector containers +#import "stlvector.h" + +]]></xsl:text> + + <xsl:value-of select="concat('//gsoap vbox schema namespace: ', $G_targetNamespace)" /> + <xsl:value-of select="concat('//gsoap vbox schema form: unqualified', '')" /> + + <xsl:text> +/**************************************************************************** + * + * declarations + * + ****************************************************************************/ + +// forward declarations +class _vbox__InvalidObjectFault; +class _vbox__RuntimeFault; + +struct SOAP_ENV__Detail +{ + _vbox__InvalidObjectFault *vbox__InvalidObjectFault; + _vbox__RuntimeFault *vbox__RuntimeFault; + int __type; + void *fault; + _XML __any; +}; +</xsl:text> + + <xsl:apply-templates /> +</xsl:template> + +<xsl:template name="convertSequence"> + <xsl:param name="xmltype" /> + <xsl:param name="ctype" /> + + <xsl:value-of select="concat('class ', $ctype, $G_sNewLine)" /> + <xsl:text>{ + public: +</xsl:text> + <xsl:for-each select="xsd:element"> + <xsl:variable name="typefield" select="@type" /> + <xsl:variable name="xmltypefield" select="substring($typefield, 5)" /><!-- remove "xsd:" prefix--> + <xsl:variable name="withoutvboxtypefield" select="substring($typefield, 6)" /><!-- remove "vbox:" prefix--> + <xsl:variable name="ctypefield" select="exsl:node-set($G_aSharedTypes)/type[@xmlname=$xmltypefield]/@cname" /> + <xsl:text> </xsl:text> + <xsl:choose> + <xsl:when test="$ctypefield"> + <!-- array or simple type: depends on whether maxOccurs="unbounded" is in WSDL --> + <xsl:choose> + <xsl:when test="@maxOccurs='unbounded'"> + <xsl:value-of select="concat('std::vector<', $ctypefield, '>')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$ctypefield" /> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <!-- is there an enum of this type? (look up in simple types) --> + <xsl:when test="count(key('G_keySimpleTypesByName', $withoutvboxtypefield)) > 0"> + <xsl:variable name="enumname"> + <xsl:value-of select="concat('enum vbox__', $withoutvboxtypefield)" /> + </xsl:variable> + <xsl:choose> + <xsl:when test="@maxOccurs='unbounded'"> + <xsl:value-of select="concat('std::vector<', $enumname, '>')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$enumname" /> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <!-- is this one of the vbox types? (look up in complex types) --> + <xsl:when test="count(key('G_keyComplexTypesByName', $withoutvboxtypefield)) > 0"> + <!-- array or simple type: depends on whether maxOccurs="unbounded" is in WSDL --> + <xsl:choose> + <xsl:when test="@maxOccurs='unbounded'"> + <xsl:value-of select="concat('std::vector<vbox__', $withoutvboxtypefield, '*>')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="concat('vbox__', $withoutvboxtypefield, '*')" /> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="concat('std::string', '')" /> + </xsl:otherwise> + </xsl:choose> + <xsl:variable name="underscoredname"> + <xsl:call-template name="escapeUnderscores"> + <xsl:with-param name="string" select="@name" /> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="concat(' ', $underscoredname, ' 1;', $G_sNewLine)" /> + </xsl:for-each> + <xsl:text> struct soap *soap; +}; +</xsl:text> +<xsl:call-template name="xsltprocNewlineOutputHack"/> + +</xsl:template> + +<xsl:template match="wsdl:types/xsd:schema"> + + <!-- enums are represented as simple types --> + <xsl:for-each select="xsd:simpleType"> + <xsl:variable name="ctype" select="concat('vbox__', @name)" /> + <xsl:for-each select="xsd:restriction"> + <xsl:value-of select="concat('enum ', $ctype)" /> + <xsl:text> +{ +</xsl:text> + <xsl:for-each select="xsd:enumeration"> + <xsl:variable name="underscoredname"> + <xsl:call-template name="escapeUnderscores"> + <xsl:with-param name="string" select="@value" /> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="concat(' ', $ctype, '__', $underscoredname)" /> + <xsl:if test = "not(position()=last())" > + <xsl:text >,</xsl:text> + </xsl:if> + <xsl:text> +</xsl:text> + </xsl:for-each> + <xsl:text>}; + +</xsl:text> + </xsl:for-each> + </xsl:for-each> + + <!-- structs and arrays are represented as complex types --> + <xsl:for-each select="xsd:complexType"> + <xsl:variable name="xmltype" select="@name" /> + <xsl:variable name="ctype" select="concat('vbox__', $xmltype)" /> + <xsl:for-each select="xsd:sequence"> + <xsl:call-template name="convertSequence"> + <xsl:with-param name="xmltype" select="$xmltype" /> + <xsl:with-param name="ctype" select="$ctype" /> + </xsl:call-template> + </xsl:for-each> + </xsl:for-each> + + <!-- individual message elements are represented with xsd:element -> xsd:complexType -> xsdSequence --> + <xsl:for-each select="xsd:element"> + <xsl:variable name="xmltype" select="@name" /> + <xsl:variable name="underscoredname"> + <xsl:call-template name="escapeUnderscores"> + <xsl:with-param name="string" select="$xmltype" /> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="ctype" select="concat('_vbox__', $underscoredname)" /> + <xsl:for-each select="xsd:complexType"> + <xsl:for-each select="xsd:sequence"> + <xsl:call-template name="convertSequence"> + <xsl:with-param name="xmltype" select="$xmltype" /> + <xsl:with-param name="ctype" select="$ctype" /> + </xsl:call-template> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> +</xsl:template> + +<xsl:template match="wsdl:portType"> + + <xsl:value-of select="concat('//gsoap vbox service name: vbox', $G_bindingSuffix, $G_sNewLine)" /> + <xsl:value-of select="concat('//gsoap vbox service type: vbox', $G_portTypeSuffix, $G_sNewLine)" /> + <xsl:value-of select="concat('//gsoap vbox service namespace: ', $G_targetNamespace, $G_targetNamespaceSeparator, $G_sNewLine)" /> + <xsl:value-of select="concat('//gsoap vbox service transport: ', 'http://schemas.xmlsoap.org/soap/http', $G_sNewLine)" /> + + <xsl:for-each select="wsdl:operation"> + <xsl:variable name="methodname" select="@name" /> + <xsl:variable name="cmethodname"> + <xsl:call-template name="escapeUnderscores"> + <xsl:with-param name="string" select="$methodname" /> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="requestmsg" select="concat($methodname, $G_methodRequest)" /> + <xsl:variable name="responsemsg" select="concat($methodname, $G_methodResponse)" /> + + <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-style: ', $cmethodname, ' ', $G_basefmt)" /> + <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-encoding: ', $cmethodname, ' ', $G_parmfmt)" /> + <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-action: ', $cmethodname, ' ""')" /> + <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-fault: ', $cmethodname, ' vbox__InvalidObjectFault')" /> + <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-fault: ', $cmethodname, ' vbox__RuntimeFault')" /> + <xsl:value-of select="concat($G_sNewLine, 'int __vbox__', $cmethodname, '(', $G_sNewLine)" /> + + <!-- request element --> + <xsl:variable name="reqtype" select="key('G_keyMessagesByName', $requestmsg)/wsdl:part/@element" /> + <xsl:if test="not($reqtype)"> + <xsl:call-template name="fatalError"> + <xsl:with-param name="msg" select="concat('wsdl:portType match: Cannot find message with "name"="', $requestmsg, '".')" /> + </xsl:call-template> + </xsl:if> + <xsl:variable name="creqtype"> + <xsl:call-template name="escapeUnderscores"> + <xsl:with-param name="string" select="substring($reqtype, 6)" /> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="concat(' _vbox__', $creqtype, '* vbox__', $creqtype, ',', $G_sNewLine)"/> + <!-- response element --> + <xsl:variable name="resptype" select="key('G_keyMessagesByName', $responsemsg)/wsdl:part/@element" /> + <xsl:if test="not($resptype)"> + <xsl:call-template name="fatalError"> + <xsl:with-param name="msg" select="concat('wsdl:portType match: Cannot find message with "name"="', $responsemsg, '".')" /> + </xsl:call-template> + </xsl:if> + <xsl:variable name="cresptype"> + <xsl:call-template name="escapeUnderscores"> + <xsl:with-param name="string" select="substring($resptype, 6)" /> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="concat(' _vbox__', $cresptype, '* vbox__', $cresptype, $G_sNewLine)"/> + + <xsl:text>);</xsl:text> + <xsl:call-template name="xsltprocNewlineOutputHack"/> + + </xsl:for-each> +</xsl:template> + +</xsl:stylesheet> |