<?
xml version=
"1.0" encoding=
"UTF-8"?>
<!--
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
-->
<!-- Generate a .hxx file with type-safe C++ abstractions (based on
comphelper/configuration.hxx) for all the <prop> and <set> elements in an
.xcs file.
Takes up to three parameters ns1, ns2, ns3 that represent the .xcs file's
nesting within the org/openoffice hierarchy (e.g., for
officecfg/registry/schema/org/openoffice/Office/Common.xcs, ns1 would be
"Office", ns2 would be "Common", and ns3 would remain unset.
TODO: Does not yet handle <node-ref> indirections (as, e.g., used in
officecfg/registry/schema/org/openoffice/Office/Common.xcs as
"ApplicationControlLayout"). Also, the available abstractions can still be
improved (e.g., for extensible groups or for set element types).
-->
<
xsl:
stylesheet
version=
"1.0" xmlns:
xsl=
"http://www.w3.org/1999/XSL/Transform"
xmlns:oor=
"http://openoffice.org/2001/registry">
<
xsl:param name=
"ns1"/>
<
xsl:param name=
"ns2"/>
<
xsl:param name=
"ns3"/>
<
xsl:output method=
"text"/>
<
xsl:template match=
"/oor:component-schema">
<
xsl:apply-templates select=
"component">
<
xsl:with-param name=
"path">
<
xsl:text>/</
xsl:text>
<
xsl:value-of select=
"@oor:package"/>
<
xsl:text>.</
xsl:text>
<
xsl:value-of select=
"@oor:name"/>
</
xsl:with-param>
</
xsl:apply-templates>
</
xsl:template>
<
xsl:template match=
"component">
<
xsl:param name=
"path"/>
<
xsl:text>#ifndef INCLUDED_OFFICECFG_</
xsl:text>
<
xsl:value-of
select=
"translate($ns1, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<
xsl:if test=
"$ns2">
<
xsl:text>_</
xsl:text>
<
xsl:value-of
select=
"translate($ns2, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<
xsl:if test=
"$ns3">
<
xsl:text>_</
xsl:text>
<
xsl:value-of
select=
"translate($ns3, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
</
xsl:if>
</
xsl:if>
<
xsl:text>_HXX
</
xsl:text>
<
xsl:text>#define INCLUDED_OFFICECFG_</
xsl:text>
<
xsl:value-of
select=
"translate($ns1, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<
xsl:if test=
"$ns2">
<
xsl:text>_</
xsl:text>
<
xsl:value-of
select=
"translate($ns2, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<
xsl:if test=
"$ns3">
<
xsl:text>_</
xsl:text>
<
xsl:value-of
select=
"translate($ns3, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
</
xsl:if>
</
xsl:if>
<
xsl:text>_HXX
</
xsl:text>
<
xsl:text>
</
xsl:text>
<
xsl:text>#
include "sal/config.h"
</
xsl:text>
<
xsl:text>
</
xsl:text>
<
xsl:if test=
".//prop or .//set">
<
xsl:if
test=
".//prop[count(@oor:nillable) = 0 or @oor:nillable = 'true']">
<
xsl:text>#
include <optional>
</
xsl:text>
</
xsl:if>
<
xsl:if test=
".//prop/@oor:type = 'oor:any'">
<
xsl:text>#
include "com/sun/star/uno/Any.hxx"
</
xsl:text>
</
xsl:if>
<
xsl:if test=
".//prop/@oor:type = 'xs:hexBinary' or .//prop/@oor:type = 'oor:boolean-list' or .//prop/@oor:type = 'oor:short-list' or .//prop/@oor:type = 'oor:int-list' or .//prop/@oor:type = 'oor:long-list' or .//prop/@oor:type = 'oor:double-list' or .//prop/@oor:type = 'oor:string-list'">
<
xsl:text>#
include "com/sun/star/uno/Sequence.hxx"
</
xsl:text>
</
xsl:if>
<
xsl:text>#
include "rtl/ustring.h"
</
xsl:text>
<
xsl:text>#
include "rtl/ustring.hxx"
</
xsl:text>
<
xsl:if test=
".//prop/@oor:type = 'xs:short' or .//prop/@oor:type = 'xs:int' or .//prop/@oor:type = 'xs:long' or .//prop/@oor:type = 'xs:hexBinary'">
<
xsl:text>#
include "sal/types.h"
</
xsl:text>
</
xsl:if>
<
xsl:text>#
include "comphelper/configuration.hxx"
</
xsl:text>
<
xsl:text>
</
xsl:text>
<
xsl:text>namespace officecfg { namespace </
xsl:text>
<
xsl:value-of select=
"$ns1"/>
<
xsl:if test=
"$ns2">
<
xsl:text> { namespace </
xsl:text>
<
xsl:value-of select=
"$ns2"/>
<
xsl:if test=
"$ns3">
<
xsl:text> { namespace </
xsl:text>
<
xsl:value-of select=
"$ns3"/>
</
xsl:if>
</
xsl:if>
<
xsl:text> {
</
xsl:text>
<
xsl:text>
</
xsl:text>
<
xsl:apply-templates select=
"group|set|prop">
<
xsl:with-param name=
"path" select=
"$path"/>
</
xsl:apply-templates>
<
xsl:if test=
"$ns2">
<
xsl:text>} </
xsl:text>
<
xsl:if test=
"$ns3">
<
xsl:text>} </
xsl:text>
</
xsl:if>
</
xsl:if>
<
xsl:text>} }
</
xsl:text>
<
xsl:text>
</
xsl:text>
</
xsl:if>
<
xsl:text>#endif
</
xsl:text>
</
xsl:template>
<
xsl:template match=
"group">
<
xsl:param name=
"path"/>
<
xsl:if test=
"not(info/deprecated) and (.//prop or .//set)">
<
xsl:variable name=
"name" select=
"translate(@oor:name, '-.', '__')"/>
<
xsl:text>struct </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>:
public comphelper::ConfigurationGroup< </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>> {
</
xsl:text>
<
xsl:text> static OUString path() { static constexpr OUString PATH(
<!--
-->
<
xsl:value-of select=
"$path"/>
<
xsl:text>/</
xsl:text>
<
xsl:value-of select=
"@oor:name"/>
<
xsl:text>
"_ustr); return PATH; }
</xsl:text>
<
xsl:text>
</
xsl:text>
<
xsl:apply-templates select=
"group|set|prop">
<
xsl:with-param name=
"path">
<
xsl:value-of select=
"$path"/>
<
xsl:text>/</
xsl:text>
<
xsl:value-of select=
"@oor:name"/>
</
xsl:with-param>
</
xsl:apply-templates>
<
xsl:text>private:
</
xsl:text>
<
xsl:text> </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>(); // not defined
</
xsl:text>
<
xsl:text> ~</
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>(); // not defined
</
xsl:text>
<
xsl:text>};
</
xsl:text>
<
xsl:text>
</
xsl:text>
</
xsl:if>
</
xsl:template>
<
xsl:template match=
"set">
<
xsl:param name=
"path"/>
<
xsl:if test=
"not(info/deprecated)">
<
xsl:variable name=
"name" select=
"translate(@oor:name, '-.', '__')"/>
<
xsl:text>struct </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>:
public comphelper::ConfigurationSet< </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>> {
</
xsl:text>
<
xsl:text> static OUString path() { static constexpr OUString PATH(
<!--
-->
<
xsl:value-of select=
"$path"/>
<
xsl:text>/</
xsl:text>
<
xsl:value-of select=
"@oor:name"/>
<
xsl:text>
"_ustr); return PATH; }
</xsl:text>
<
xsl:text>private:
</
xsl:text>
<
xsl:text> </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>(); // not defined
</
xsl:text>
<
xsl:text> ~</
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>(); // not defined
</
xsl:text>
<
xsl:text>};
</
xsl:text>
<
xsl:text>
</
xsl:text>
</
xsl:if>
</
xsl:template>
<
xsl:template match=
"prop">
<
xsl:param name=
"path"/>
<
xsl:if test=
"not(info/deprecated)">
<
xsl:variable name=
"name" select=
"translate(@oor:name, '-.', '__')"/>
<
xsl:text>struct </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>:
public comphelper::</
xsl:text>
<
xsl:choose>
<
xsl:when test=
"@oor:localized = 'true'">
<
xsl:text>ConfigurationLocalizedProperty</
xsl:text>
</
xsl:when>
<
xsl:otherwise>
<
xsl:text>ConfigurationProperty</
xsl:text>
</
xsl:otherwise>
</
xsl:choose>
<
xsl:text><</
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>, </
xsl:text>
<
xsl:if test=
"not(@oor:nillable = 'false')">
<
xsl:text>std::optional<</
xsl:text>
</
xsl:if>
<
xsl:choose>
<
xsl:when test=
"@oor:type='oor:any'">
<
xsl:text>com::sun::star::uno::Any</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:boolean'">
<
xsl:text>bool</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:short'">
<
xsl:text>sal_Int16</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:int'">
<
xsl:text>sal_Int32</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:long'">
<
xsl:text>sal_Int64</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:double'">
<
xsl:text>double</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:string'">
<
xsl:text>OUString</
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='xs:hexBinary'">
<
xsl:text>com::sun::star::uno::Sequence<sal_Int8> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:boolean-list'">
<
xsl:text>com::sun::star::uno::Sequence<bool> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:short-list'">
<
xsl:text>com::sun::star::uno::Sequence<sal_Int16> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:int-list'">
<
xsl:text>com::sun::star::uno::Sequence<sal_Int32> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:long-list'">
<
xsl:text>com::sun::star::uno::Sequence<sal_Int64> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:double-list'">
<
xsl:text>com::sun::star::uno::Sequence<double> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:string-list'">
<
xsl:text>com::sun::star::uno::Sequence<OUString> </
xsl:text>
</
xsl:when>
<
xsl:when test=
"@oor:type='oor:hexBinary-list'">
<
xsl:text>com::sun::star::uno::Sequence<
<!--
-->
</
xsl:when>
</
xsl:choose>
<
xsl:if test=
"not(@oor:nillable = 'false')">
<
xsl:text>> </
xsl:text>
</
xsl:if>
<
xsl:text>> {
</
xsl:text>
<
xsl:text> static OUString path() { static constexpr OUString PATH(
<!--
-->
<
xsl:value-of select=
"$path"/>
<
xsl:text>/</
xsl:text>
<
xsl:value-of select=
"@oor:name"/>
<
xsl:text>
"_ustr); return PATH; }
</xsl:text>
<
xsl:text>private:
</
xsl:text>
<
xsl:text> </
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>(); // not defined
</
xsl:text>
<
xsl:text> ~</
xsl:text>
<
xsl:value-of select=
"$name"/>
<
xsl:text>(); // not defined
</
xsl:text>
<
xsl:text>};
</
xsl:text>
<
xsl:text>
</
xsl:text>
</
xsl:if>
</
xsl:template>
</
xsl:
stylesheet>