summaryrefslogtreecommitdiff
path: root/cppuhelper
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-02-22 17:20:18 +0100
committerStephan Bergmann <sbergman@redhat.com>2013-02-22 17:24:09 +0100
commitfa559f1c416884015d1d83d0a7ac8803e745d9df (patch)
treecd00b71ee3268a9dd196a94ba5827b0c777c4704 /cppuhelper
parent5677e3f2514d5b797c239d99edce0189d5cf364b (diff)
WIP: Experimental new binary type.rdb format
Prepare cppuhelper/unoidl.hxx for direct consumption by code that currently uses registry/ to read .rdb files (e.g., codemaker). The additional exports will need to be properly hidden from general users in gcc3.map (and documented, and...). Change-Id: I5cdff6fe69ab88435972e16dbda2311450f20ede
Diffstat (limited to 'cppuhelper')
-rw-r--r--cppuhelper/Library_cppuhelper.mk2
-rw-r--r--cppuhelper/Package_inc.mk1
-rw-r--r--cppuhelper/inc/cppuhelper/unoidl.hxx527
-rw-r--r--cppuhelper/source/typedescriptionprovider.cxx2081
-rw-r--r--cppuhelper/source/unoidl.cxx63
-rw-r--r--cppuhelper/source/unoidlprovider.cxx1363
-rw-r--r--cppuhelper/source/unoidlprovider.hxx54
7 files changed, 2399 insertions, 1692 deletions
diff --git a/cppuhelper/Library_cppuhelper.mk b/cppuhelper/Library_cppuhelper.mk
index 500bac39e401..2b849a109ac8 100644
--- a/cppuhelper/Library_cppuhelper.mk
+++ b/cppuhelper/Library_cppuhelper.mk
@@ -76,6 +76,8 @@ $(eval $(call gb_Library_add_exception_objects,cppuhelper,\
cppuhelper/source/tdmgr \
cppuhelper/source/typedescriptionprovider \
cppuhelper/source/typeprovider \
+ cppuhelper/source/unoidl \
+ cppuhelper/source/unoidlprovider \
cppuhelper/source/unourl \
cppuhelper/source/weak \
))
diff --git a/cppuhelper/Package_inc.mk b/cppuhelper/Package_inc.mk
index af5a823c1d49..420eecf2fc47 100644
--- a/cppuhelper/Package_inc.mk
+++ b/cppuhelper/Package_inc.mk
@@ -77,6 +77,7 @@ $(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/queryinterface.h
$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/shlib.hxx,cppuhelper/shlib.hxx))
$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/supportsservice.hxx,cppuhelper/supportsservice.hxx))
$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/typeprovider.hxx,cppuhelper/typeprovider.hxx))
+$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/unoidl.hxx,cppuhelper/unoidl.hxx))
$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/unourl.hxx,cppuhelper/unourl.hxx))
$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/weakagg.hxx,cppuhelper/weakagg.hxx))
$(eval $(call gb_Package_add_file,cppuhelper_inc,inc/cppuhelper/weak.hxx,cppuhelper/weak.hxx))
diff --git a/cppuhelper/inc/cppuhelper/unoidl.hxx b/cppuhelper/inc/cppuhelper/unoidl.hxx
new file mode 100644
index 000000000000..589f8462063a
--- /dev/null
+++ b/cppuhelper/inc/cppuhelper/unoidl.hxx
@@ -0,0 +1,527 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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/.
+ */
+
+#ifndef INCLUDED_CPPUHELPER_UNOIDL_HXX
+#define INCLUDED_CPPUHELPER_UNOIDL_HXX
+
+#include "sal/config.h"
+
+#include <cassert>
+#include <vector>
+
+#include "com/sun/star/uno/Any.hxx"
+#include "cppuhelper/cppuhelperdllapi.h"
+#include "rtl/ref.hxx"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+#include "salhelper/simplereferenceobject.hxx"
+
+namespace cppu { namespace unoidl {
+
+class CPPUHELPER_DLLPUBLIC Entity: public salhelper::SimpleReferenceObject {
+public:
+ enum Sort {
+ SORT_MODULE,
+ SORT_ENUM_TYPE,
+ SORT_PLAIN_STRUCT_TYPE,
+ SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE,
+ SORT_EXCEPTION_TYPE,
+ SORT_INTERFACE_TYPE,
+ SORT_TYPEDEF,
+ SORT_CONSTANT_GROUP,
+ SORT_SINGLE_INTERFACE_BASED_SERVICE,
+ SORT_ACCUMULATION_BASED_SERVICE,
+ SORT_INTERFACE_BASED_SINGLETON,
+ SORT_SERVICE_BASED_SINGLETON
+ };
+
+ Sort getSort() const { return sort_; }
+
+protected:
+ explicit SAL_DLLPRIVATE Entity(Sort sort): sort_(sort) {}
+
+ virtual SAL_DLLPRIVATE ~Entity() throw ();
+
+private:
+ Sort sort_;
+};
+
+class CPPUHELPER_DLLPUBLIC MapCursor: public salhelper::SimpleReferenceObject {
+public:
+ virtual rtl::Reference< Entity > getNext(rtl::OUString * name) = 0;
+
+protected:
+ SAL_DLLPRIVATE MapCursor() {}
+
+ virtual SAL_DLLPRIVATE ~MapCursor() throw();
+};
+
+class CPPUHELPER_DLLPUBLIC ModuleEntity: public Entity {
+public:
+ virtual std::vector< rtl::OUString > getMemberNames() const = 0;
+
+ virtual rtl::Reference< MapCursor > createCursor() const = 0;
+
+protected:
+ SAL_DLLPRIVATE ModuleEntity(): Entity(SORT_MODULE) {}
+
+ virtual SAL_DLLPRIVATE ~ModuleEntity() throw ();
+};
+
+class CPPUHELPER_DLLPUBLIC PublishableEntity: public Entity {
+public:
+ bool isPublished() const { return published_; }
+
+protected:
+ SAL_DLLPRIVATE PublishableEntity(Sort sort, bool published):
+ Entity(sort), published_(published)
+ {}
+
+ virtual SAL_DLLPRIVATE ~PublishableEntity() throw ();
+
+private:
+ bool published_;
+};
+
+class CPPUHELPER_DLLPUBLIC EnumTypeEntity: public PublishableEntity {
+public:
+ struct Member {
+ Member(rtl::OUString const & theName, sal_Int32 theValue):
+ name(theName), value(theValue)
+ {}
+
+ rtl::OUString name;
+
+ sal_Int32 value;
+ };
+
+ SAL_DLLPRIVATE EnumTypeEntity(
+ bool published, std::vector< Member > const & members):
+ PublishableEntity(SORT_ENUM_TYPE, published), members_(members)
+ { assert(!members.empty()); }
+
+ std::vector< Member > const & getMembers() const { return members_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~EnumTypeEntity() throw ();
+
+ std::vector< Member > members_;
+};
+
+class CPPUHELPER_DLLPUBLIC PlainStructTypeEntity: public PublishableEntity {
+public:
+ struct Member {
+ Member(rtl::OUString const & theName, rtl::OUString const & theType):
+ name(theName), type(theType)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+ };
+
+ SAL_DLLPRIVATE PlainStructTypeEntity(
+ bool published, rtl::OUString const & directBase,
+ std::vector< Member > const & directMembers):
+ PublishableEntity(SORT_PLAIN_STRUCT_TYPE, published),
+ directBase_(directBase), directMembers_(directMembers)
+ {}
+
+ rtl::OUString getDirectBase() const { return directBase_; }
+
+ std::vector< Member > const & getDirectMembers() const
+ { return directMembers_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~PlainStructTypeEntity() throw ();
+
+ rtl::OUString directBase_;
+ std::vector< Member > directMembers_;
+};
+
+class CPPUHELPER_DLLPUBLIC PolymorphicStructTypeTemplateEntity:
+ public PublishableEntity
+{
+public:
+ struct Member {
+ Member(
+ rtl::OUString const & theName, rtl::OUString const & theType,
+ bool theParameterized):
+ name(theName), type(theType), parameterized(theParameterized)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+
+ bool parameterized;
+ };
+
+ SAL_DLLPRIVATE PolymorphicStructTypeTemplateEntity(
+ bool published, std::vector< rtl::OUString > const & typeParameters,
+ std::vector< Member > const & members):
+ PublishableEntity(SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE, published),
+ typeParameters_(typeParameters), members_(members)
+ {}
+
+ std::vector< rtl::OUString > const & getTypeParameters() const
+ { return typeParameters_; }
+
+ std::vector< Member > const & getMembers() const { return members_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~PolymorphicStructTypeTemplateEntity() throw ();
+
+ std::vector< rtl::OUString > typeParameters_;
+ std::vector< Member > members_;
+};
+
+class CPPUHELPER_DLLPUBLIC ExceptionTypeEntity: public PublishableEntity {
+public:
+ struct Member {
+ Member(rtl::OUString const & theName, rtl::OUString const & theType):
+ name(theName), type(theType)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+ };
+
+ SAL_DLLPRIVATE ExceptionTypeEntity(
+ bool published, rtl::OUString const & directBase,
+ std::vector< Member > const & directMembers):
+ PublishableEntity(SORT_EXCEPTION_TYPE, published),
+ directBase_(directBase), directMembers_(directMembers)
+ {}
+
+ rtl::OUString getDirectBase() const { return directBase_; }
+
+ std::vector< Member > const & getDirectMembers() const
+ { return directMembers_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~ExceptionTypeEntity() throw ();
+
+ rtl::OUString directBase_;
+ std::vector< Member > directMembers_;
+};
+
+class CPPUHELPER_DLLPUBLIC InterfaceTypeEntity: public PublishableEntity {
+public:
+ struct Attribute {
+ Attribute(
+ rtl::OUString const & theName, rtl::OUString const & theType,
+ bool theBound, bool theReadOnly,
+ std::vector< rtl::OUString > const & theGetExceptions,
+ std::vector< rtl::OUString > const & theSetExceptions):
+ name(theName), type(theType), bound(theBound),
+ readOnly(theReadOnly), getExceptions(theGetExceptions),
+ setExceptions(theSetExceptions)
+ { assert(!theReadOnly || theSetExceptions.empty()); }
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+
+ bool bound;
+
+ bool readOnly;
+
+ std::vector< rtl::OUString > getExceptions;
+
+ std::vector< rtl::OUString > setExceptions;
+ };
+
+ struct Method {
+ struct Parameter {
+ enum Direction { DIRECTION_IN, DIRECTION_OUT, DIRECTION_IN_OUT };
+
+ Parameter(
+ rtl::OUString const & theName, rtl::OUString const & theType,
+ Direction theDirection):
+ name(theName), type(theType), direction(theDirection)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+
+ Direction direction;
+ };
+
+ Method(
+ rtl::OUString const & theName, rtl::OUString const & theReturnType,
+ std::vector< Parameter > const & theParameters,
+ std::vector< rtl::OUString > const & theExceptions):
+ name(theName), returnType(theReturnType), parameters(theParameters),
+ exceptions(theExceptions)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString returnType;
+
+ std::vector< Parameter > parameters;
+
+ std::vector< rtl::OUString > exceptions;
+ };
+
+ SAL_DLLPRIVATE InterfaceTypeEntity(
+ bool published,
+ std::vector< rtl::OUString > const & directMandatoryBases,
+ std::vector< rtl::OUString > const & directOptionalBases,
+ std::vector< Attribute > const & directAttributes,
+ std::vector< Method > const & directMethods):
+ PublishableEntity(SORT_INTERFACE_TYPE, published),
+ directMandatoryBases_(directMandatoryBases),
+ directOptionalBases_(directOptionalBases),
+ directAttributes_(directAttributes), directMethods_(directMethods)
+ {}
+
+ std::vector< rtl::OUString > const & getDirectMandatoryBases() const
+ { return directMandatoryBases_; }
+
+ std::vector< rtl::OUString > const & getDirectOptionalBases() const
+ { return directOptionalBases_; }
+
+ std::vector< Attribute > const & getDirectAttributes() const
+ { return directAttributes_; }
+
+ std::vector< Method > const & getDirectMethods() const
+ { return directMethods_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~InterfaceTypeEntity() throw ();
+
+ std::vector< rtl::OUString > directMandatoryBases_;
+ std::vector< rtl::OUString > directOptionalBases_;
+ std::vector< Attribute > directAttributes_;
+ std::vector< Method > directMethods_;
+};
+
+class CPPUHELPER_DLLPUBLIC TypedefEntity: public PublishableEntity {
+public:
+ SAL_DLLPRIVATE TypedefEntity(bool published, rtl::OUString const & type):
+ PublishableEntity(SORT_TYPEDEF, published), type_(type)
+ {}
+
+ rtl::OUString getType() const { return type_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~TypedefEntity() throw ();
+
+ rtl::OUString type_;
+};
+
+class CPPUHELPER_DLLPUBLIC ConstantGroupEntity: public PublishableEntity {
+public:
+ struct Member {
+ Member(rtl::OUString const & theName, css::uno::Any const & theValue):
+ name(theName), value(theValue)
+ {}
+
+ rtl::OUString name;
+
+ css::uno::Any value;
+ };
+
+ SAL_DLLPRIVATE ConstantGroupEntity(
+ bool published, std::vector< Member > const & members):
+ PublishableEntity(SORT_CONSTANT_GROUP, published), members_(members)
+ {}
+
+ std::vector< Member > const & getMembers() const { return members_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~ConstantGroupEntity() throw ();
+
+ std::vector< Member > members_;
+};
+
+class CPPUHELPER_DLLPUBLIC SingleInterfaceBasedServiceEntity:
+ public PublishableEntity
+{
+public:
+ struct Constructor {
+ struct Parameter {
+ Parameter(
+ rtl::OUString const & theName, rtl::OUString const & theType,
+ bool theRest):
+ name(theName), type(theType), rest(theRest)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+
+ bool rest;
+ };
+
+ Constructor(): defaultConstructor(true) {}
+
+ Constructor(
+ rtl::OUString const & theName,
+ std::vector< Parameter > const & theParameters,
+ std::vector< rtl::OUString > const & theExceptions):
+ name(theName), parameters(theParameters), exceptions(theExceptions),
+ defaultConstructor(false)
+ {}
+
+ rtl::OUString name;
+
+ std::vector< Parameter > parameters;
+
+ std::vector< rtl::OUString > exceptions;
+
+ bool defaultConstructor;
+ };
+
+ SAL_DLLPRIVATE SingleInterfaceBasedServiceEntity(
+ bool published, rtl::OUString const & base,
+ std::vector< Constructor > const & constructors):
+ PublishableEntity(SORT_SINGLE_INTERFACE_BASED_SERVICE, published),
+ base_(base), constructors_(constructors)
+ {}
+
+ rtl::OUString getBase() const { return base_; }
+
+ std::vector< Constructor > const & getConstructors() const
+ { return constructors_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~SingleInterfaceBasedServiceEntity() throw ();
+
+ rtl::OUString base_;
+ std::vector< Constructor > constructors_;
+};
+
+class CPPUHELPER_DLLPUBLIC AccumulationBasedServiceEntity:
+ public PublishableEntity
+{
+public:
+ struct Property {
+ enum Attributes {
+ ATTRIBUTE_MAYBE_VOID = 0x001,
+ ATTRIBUTE_BOUND = 0x002,
+ ATTRIBUTE_CONSTRAINED = 0x004,
+ ATTRIBUTE_TRANSIENT = 0x008,
+ ATTRIBUTE_READ_ONLY = 0x010,
+ ATTRIBUTE_MAYBE_AMBIGUOUS = 0x020,
+ ATTRIBUTE_MAYBE_DEFAULT = 0x040,
+ ATTRIBUTE_REMOVABLE = 0x080,
+ ATTRIBUTE_OPTIONAL = 0x100
+ };
+
+ Property(
+ rtl::OUString const & theName, rtl::OUString const & theType,
+ Attributes theAttributes):
+ name(theName), type(theType), attributes(theAttributes)
+ {}
+
+ rtl::OUString name;
+
+ rtl::OUString type;
+
+ Attributes attributes;
+ };
+
+ SAL_DLLPRIVATE AccumulationBasedServiceEntity(
+ bool published,
+ std::vector< rtl::OUString > const & directMandatoryBaseServices,
+ std::vector< rtl::OUString > const & directOptionalBaseServices,
+ std::vector< rtl::OUString > const & directMandatoryBaseInterfaces,
+ std::vector< rtl::OUString > const & directOptionalBaseInterfaces,
+ std::vector< Property > const & directProperties):
+ PublishableEntity(SORT_ACCUMULATION_BASED_SERVICE, published),
+ directMandatoryBaseServices_(directMandatoryBaseServices),
+ directOptionalBaseServices_(directOptionalBaseServices),
+ directMandatoryBaseInterfaces_(directMandatoryBaseInterfaces),
+ directOptionalBaseInterfaces_(directOptionalBaseInterfaces),
+ directProperties_(directProperties)
+ {}
+
+ std::vector< rtl::OUString > const & getDirectMandatoryBaseServices() const
+ { return directMandatoryBaseServices_; }
+
+ std::vector< rtl::OUString > const & getDirectOptionalBaseServices() const
+ { return directOptionalBaseServices_; }
+
+ std::vector< rtl::OUString > const & getDirectMandatoryBaseInterfaces()
+ const
+ { return directMandatoryBaseInterfaces_; }
+
+ std::vector< rtl::OUString > const & getDirectOptionalBaseInterfaces() const
+ { return directOptionalBaseInterfaces_; }
+
+ std::vector< Property > const & getDirectProperties() const
+ { return directProperties_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~AccumulationBasedServiceEntity() throw ();
+
+ std::vector< rtl::OUString > directMandatoryBaseServices_;
+ std::vector< rtl::OUString > directOptionalBaseServices_;
+ std::vector< rtl::OUString > directMandatoryBaseInterfaces_;
+ std::vector< rtl::OUString > directOptionalBaseInterfaces_;
+ std::vector< Property > directProperties_;
+};
+
+class CPPUHELPER_DLLPUBLIC InterfaceBasedSingletonEntity:
+ public PublishableEntity
+{
+public:
+ SAL_DLLPRIVATE InterfaceBasedSingletonEntity(
+ bool published, rtl::OUString const & base):
+ PublishableEntity(SORT_INTERFACE_BASED_SINGLETON, published),
+ base_(base)
+ {}
+
+ rtl::OUString getBase() const { return base_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~InterfaceBasedSingletonEntity() throw ();
+
+ rtl::OUString base_;
+};
+
+class CPPUHELPER_DLLPUBLIC ServiceBasedSingletonEntity: public PublishableEntity
+{
+public:
+ SAL_DLLPRIVATE ServiceBasedSingletonEntity(
+ bool published, rtl::OUString const & base):
+ PublishableEntity(SORT_SERVICE_BASED_SINGLETON, published), base_(base)
+ {}
+
+ rtl::OUString getBase() const { return base_; }
+
+private:
+ virtual SAL_DLLPRIVATE ~ServiceBasedSingletonEntity() throw ();
+
+ rtl::OUString base_;
+};
+
+class CPPUHELPER_DLLPUBLIC Provider: public salhelper::SimpleReferenceObject {
+public:
+ virtual rtl::Reference< MapCursor > createRootCursor() const = 0;
+
+protected:
+ SAL_DLLPRIVATE Provider() {}
+
+ virtual SAL_DLLPRIVATE ~Provider() throw ();
+};
+
+CPPUHELPER_DLLPUBLIC rtl::Reference< Provider > loadProvider(
+ rtl::OUString const & uri);
+
+} }
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppuhelper/source/typedescriptionprovider.cxx b/cppuhelper/source/typedescriptionprovider.cxx
index 97a1788add04..bf77491ea991 100644
--- a/cppuhelper/source/typedescriptionprovider.cxx
+++ b/cppuhelper/source/typedescriptionprovider.cxx
@@ -10,7 +10,7 @@
#include "sal/config.h"
#include <cassert>
-#include <cstring>
+#include <cstdlib>
#include <set>
#include <stack>
#include <vector>
@@ -49,537 +49,19 @@
#include "com/sun/star/uno/XInterface.hpp"
#include "cppuhelper/compbase2.hxx"
#include "cppuhelper/implbase1.hxx"
-#include "osl/endian.h"
-#include "osl/file.h"
+#include "cppuhelper/unoidl.hxx"
#include "osl/file.hxx"
#include "osl/mutex.hxx"
#include "rtl/ref.hxx"
#include "rtl/ustring.hxx"
-#include "sal/log.hxx"
#include "sal/types.h"
-#include "salhelper/simplereferenceobject.hxx"
#include "paths.hxx"
#include "typedescriptionprovider.hxx"
-
-// New binary format:
-//
-// Uses the following definitions:
-//
-// * UInt16: 2-byte value, LSB first
-// * UInt32: 4-byte value, LSB first
-// * UInt64: 8-byte value, LSB first
-// * Offset: UInt32 value, counting bytes from start of file
-// * NUL-Name: zero or more non-NUL US-ASCII bytes followed by a NUL byte
-// * Len-Name: UInt32 number of characters, with 0x80000000 bit 1, followed by
-// that many (- 0x80000000) US-ASCII bytes
-// * Idx-Name: either an Offset (with 0x80000000 bit 0) of a Len-Name, or a
-// Len-Name
-// * Entry: Offset of NUL-Name followed by Offset of payload
-// * Map: zero or more Entries
-//
-// Layout of per-entry payload in the root or a module Map:
-//
-// * kind byte:
-// ** 0: module
-// *** followed by:
-// **** UInt32 number N1 of entries of Map
-// **** N1 * Entry
-// ** otherwise:
-// *** 0x80 bit: 1 if published
-// *** 0x40 bit: 1 if deprecated
-// *** 0x20 bit: flag (may only be 1 for certain kinds, see below)
-// *** remaining bits:
-// **** 1: enum type
-// ***** followed by:
-// ****** UInt32 number N1 of members
-// ****** N1 * tuple of:
-// ******* Offset of Idx-Name
-// ******* UInt32
-// **** 2: plain struct type (with base if flag is 1)
-// ***** followed by:
-// ****** if "with base": Offset of Idx-Name
-// ****** UInt32 number N1 of direct members
-// ****** N1 * tuple of:
-// ******* Offset of Idx-Name name
-// ******* Offset of Idx-Name type
-// **** 3: polymorphic struct type template
-// ***** followed by:
-// ****** UInt32 number N1 of type parameters
-// ****** N1 * Offset of Idx-Name
-// ****** UInt32 number N2 of members
-// ****** N2 * tuple of:
-// ******* kind byte: 0x01 bit is 1 if parameterized type
-// ******* Offset of Idx-Name name
-// ******* Offset of Idx-Name type
-// **** 4: exception type (with base if flag is 1)
-// ***** followed by:
-// ****** if "with base": Offset of Idx-Name
-// ****** UInt32 number N1 of direct members
-// ****** N1 * tuple of:
-// ******* Offset of Idx-Name name
-// ******* Offset of Idx-Name type
-// **** 5: interface type
-// ***** followed by:
-// ****** UInt32 number N1 of direct mandatory bases
-// ****** N1 * Offset of Idx-Name
-// ****** UInt32 number N2 of direct optional bases
-// ****** N2 * Offset of Idx-Name
-// ****** UInt32 number N3 of direct attributes
-// ****** N3 * tuple of:
-// ******* kind byte:
-// ******** 0x02 bit: 1 if read-only
-// ******** 0x01 bit: 1 if bound
-// ******* Offset of Idx-Name name
-// ******* Offset of Idx-Name type
-// ******* UInt32 number N4 of get exceptions
-// ******* N4 * Offset of Idx-Name
-// ******* UInt32 number N5 of set exceptions
-// ******* N5 * Offset of Idx-Name
-// ****** UInt32 number N6 of direct methods
-// ****** N6 * tuple of:
-// ******* Offset of Idx-Name name
-// ******* Offset of Idx-Name return type
-// ******* UInt32 number N7 of parameters
-// ******* N7 * tuple of:
-// ******** direction byte: 0 for in, 1 for out, 2 for in-out
-// ******** Offset of Idx-Name name
-// ******** Offset of Idx-Name type
-// ******* UInt32 number N8 of exceptions
-// ******* N8 * Offset of Idx-Name
-// **** 6: typedef
-// ***** followed by:
-// ****** Offset of Idx-Name
-// **** 7: constant group
-// ***** followed by:
-// ****** UInt32 number N1 of entries of Map
-// ****** N1 * Entry
-// **** 8: single-interface--based service (with default constructor if flag is
-// 1)
-// ***** followed by:
-// ****** Offset of Idx-Name
-// ****** if not "with default constructor":
-// ******* UInt32 number N1 of constructors
-// ******* N1 * tuple of:
-// ******** Offset of Idx-Name
-// ******** UInt32 number N2 of parameters
-// ******** N2 * tuple of
-// ********* kind byte: 0x04 bit is 1 if rest parameter
-// ********* Offset of Idx-Name name
-// ********* Offset of Idx-Name type
-// ******** UInt32 number N3 of exceptions
-// ******** N3 * Offset of Idx-Name
-// **** 9: accumulation-based service
-// ***** followed by:
-// ****** UInt32 number N1 of direct mandatory base services
-// ****** N1 * Offset of Idx-Name
-// ****** UInt32 number N2 of direct optional base services
-// ****** N2 * Offset of Idx-Name
-// ****** UInt32 number N3 of direct mandatory base interfaces
-// ****** N3 * Offset of Idx-Name
-// ****** UInt32 number N4 of direct optional base interfaces
-// ****** N4 * Offset of Idx-Name
-// ****** UInt32 number N5 of direct properties
-// ****** N5 * tuple of:
-// ******* UInt16 kind:
-// ******** 0x0100 bit: 1 if optional
-// ******** 0x0080 bit: 1 if removable
-// ******** 0x0040 bit: 1 if maybedefault
-// ******** 0x0020 bit: 1 if maybeambiguous
-// ******** 0x0010 bit: 1 if readonly
-// ******** 0x0008 bit: 1 if transient
-// ******** 0x0004 bit: 1 if constrained
-// ******** 0x0002 bit: 1 if bound
-// ******** 0x0001 bit: 1 if maybevoid
-// ******* Offset of Idx-Name name
-// ******* Offset of Idx-Name type
-// **** 10: interface-based singleton
-// ***** followed by:
-// ****** Offset of Idx-Name
-// **** 11: service-based singleton
-// ***** followed by:
-// ****** Offset of Idx-Name
-//
-// Layout of per-entry payload in a constant group Map:
-//
-// * kind byte:
-// ** 0x80 bit: 1 if deprecated
-// ** remaining bits:
-// *** 0: BOOLEAN
-// **** followed by value byte, 0 represents false, 1 represents true
-// *** 1: BYTE
-// **** followed by value byte, representing values with two's complement
-// *** 2: SHORT
-// **** followed by UInt16 value, representing values with two's complement
-// *** 3: UNSIGNED SHORT
-// **** followed by UInt16 value
-// *** 4: LONG
-// **** followed by UInt32 value, representing values with two's complement
-// *** 5: UNSIGNED LONG
-// **** followed by UInt32 value
-// *** 6: HYPER
-// **** followed by UInt64 value, representing values with two's complement
-// *** 7: UNSIGNED HYPER
-// **** followed by UInt64 value
-// *** 8: FLOAT
-// **** followed by 4-byte value, representing values in ISO 60599 binary32
-// format, LSB first
-// *** 9: DOUBLE
-// **** followed by 8-byte value, representing values in ISO 60599 binary64
-// format, LSB first
-//
-// Memory layout:
-//
-// * 8 byte header "UNOIDL\0\xFF
-// * Offset of root Map
-// * UInt32 number of entries of root Map
-// ...
+#include "unoidlprovider.hxx"
namespace {
-// sizeof (Memory16) == 2
-struct Memory16 {
- unsigned char byte[2];
-
- sal_uInt16 getUnsigned16() const {
- return static_cast< sal_uInt16 >(byte[0])
- | (static_cast< sal_uInt16 >(byte[1]) << 8);
- }
-};
-
-// sizeof (Memory32) == 4
-struct Memory32 {
- unsigned char byte[4];
-
- sal_uInt32 getUnsigned32() const {
- return static_cast< sal_uInt32 >(byte[0])
- | (static_cast< sal_uInt32 >(byte[1]) << 8)
- | (static_cast< sal_uInt32 >(byte[2]) << 16)
- | (static_cast< sal_uInt32 >(byte[3]) << 24);
- }
-
- float getIso60599Binary32() const {
- union {
- unsigned char buf[4];
- float f; // assuming float is ISO 60599 binary32
- } sa;
-#if defined OSL_LITENDIAN
- sa.buf[0] = byte[0];
- sa.buf[1] = byte[1];
- sa.buf[2] = byte[2];
- sa.buf[3] = byte[3];
-#else
- sa.buf[0] = byte[3];
- sa.buf[1] = byte[2];
- sa.buf[2] = byte[1];
- sa.buf[3] = byte[0];
-#endif
- return sa.f;
- }
-};
-
-// sizeof (Memory64) == 8
-struct Memory64 {
- unsigned char byte[8];
-
- sal_uInt64 getUnsigned64() const {
- return static_cast< sal_uInt64 >(byte[0])
- | (static_cast< sal_uInt64 >(byte[1]) << 8)
- | (static_cast< sal_uInt64 >(byte[2]) << 16)
- | (static_cast< sal_uInt64 >(byte[3]) << 24)
- | (static_cast< sal_uInt64 >(byte[4]) << 32)
- | (static_cast< sal_uInt64 >(byte[5]) << 40)
- | (static_cast< sal_uInt64 >(byte[6]) << 48)
- | (static_cast< sal_uInt64 >(byte[7]) << 56);
- }
-
- double getIso60599Binary64() const {
- union {
- unsigned char buf[8];
- double d; // assuming double is ISO 60599 binary64
- } sa;
-#if defined OSL_LITENDIAN
- sa.buf[0] = byte[0];
- sa.buf[1] = byte[1];
- sa.buf[2] = byte[2];
- sa.buf[3] = byte[3];
- sa.buf[4] = byte[4];
- sa.buf[5] = byte[5];
- sa.buf[6] = byte[6];
- sa.buf[7] = byte[7];
-#else
- sa.buf[0] = byte[7];
- sa.buf[1] = byte[6];
- sa.buf[2] = byte[5];
- sa.buf[3] = byte[4];
- sa.buf[4] = byte[3];
- sa.buf[5] = byte[2];
- sa.buf[6] = byte[1];
- sa.buf[7] = byte[0];
-#endif
- return sa.d;
- }
-};
-
-struct MappedFile:
- public salhelper::SimpleReferenceObject, private boost::noncopyable
-{
- explicit MappedFile(rtl::OUString const & fileUrl);
-
- sal_uInt8 read8(sal_uInt32 offset) const;
-
- sal_uInt16 read16(sal_uInt32 offset) const;
-
- sal_uInt32 read32(sal_uInt32 offset) const;
-
- sal_uInt64 read64(sal_uInt32 offset) const;
-
- float readIso60599Binary32(sal_uInt32 offset) const;
-
- double readIso60599Binary64(sal_uInt32 offset) const;
-
- rtl::OUString readNameNul(sal_uInt32 offset) const;
-
- rtl::OUString readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset = 0)
- const;
-
- oslFileHandle handle;
- sal_uInt64 size;
- void * address;
-
-private:
- virtual ~MappedFile();
-
- sal_uInt8 get8(sal_uInt32 offset) const;
-
- sal_uInt16 get16(sal_uInt32 offset) const;
-
- sal_uInt32 get32(sal_uInt32 offset) const;
-
- sal_uInt64 get64(sal_uInt32 offset) const;
-
- float getIso60599Binary32(sal_uInt32 offset) const;
-
- double getIso60599Binary64(sal_uInt32 offset) const;
-};
-
-MappedFile::MappedFile(rtl::OUString const & fileUrl) {
- oslFileError e = osl_openFile(
- fileUrl.pData, &handle, osl_File_OpenFlag_Read);
- switch (e) {
- case osl_File_E_None:
- break;
- case osl_File_E_NOENT:
- throw css::container::NoSuchElementException(
- fileUrl, css::uno::Reference< css::uno::XInterface >());
- default:
- throw css::uno::RuntimeException(
- "cannot open " + fileUrl + ": " + rtl::OUString::number(e),
- css::uno::Reference< css::uno::XInterface >());
- }
- e = osl_getFileSize(handle, &size);
- if (e == osl_File_E_None) {
- e = osl_mapFile(
- handle, &address, size, 0, osl_File_MapFlag_RandomAccess);
- }
- if (e != osl_File_E_None) {
- oslFileError e2 = osl_closeFile(handle);
- SAL_WARN_IF(
- e2 != osl_File_E_None, "cppuhelper",
- "cannot close " << fileUrl << ": " << +e2);
- throw css::uno::RuntimeException(
- "cannot mmap " + fileUrl + ": " + rtl::OUString::number(e),
- css::uno::Reference< css::uno::XInterface >());
- }
-}
-
-sal_uInt8 MappedFile::read8(sal_uInt32 offset) const {
- assert(size >= 8);
- if (offset > size - 1) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for 8-bit value too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- return get8(offset);
-}
-
-sal_uInt16 MappedFile::read16(sal_uInt32 offset) const {
- assert(size >= 8);
- if (offset > size - 2) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for 16-bit value too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- return get16(offset);
-}
-
-sal_uInt32 MappedFile::read32(sal_uInt32 offset) const {
- assert(size >= 8);
- if (offset > size - 4) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for 32-bit value too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- return get32(offset);
-}
-
-sal_uInt64 MappedFile::read64(sal_uInt32 offset) const {
- assert(size >= 8);
- if (offset > size - 8) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for 64-bit value too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- return get64(offset);
-}
-
-float MappedFile::readIso60599Binary32(sal_uInt32 offset) const {
- assert(size >= 8);
- if (offset > size - 4) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for 32-bit value too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- return getIso60599Binary32(offset);
-}
-
-double MappedFile::readIso60599Binary64(sal_uInt32 offset) const {
- assert(size >= 8);
- if (offset > size - 8) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for 64-bit value too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- return getIso60599Binary64(offset);
-}
-
-rtl::OUString MappedFile::readNameNul(sal_uInt32 offset) const {
- if (offset > size) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: offset for string too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- sal_uInt64 end = offset;
- for (;; ++end) {
- if (end == size) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: string misses trailing NUL",
- css::uno::Reference< css::uno::XInterface >());
- }
- if (static_cast< char const * >(address)[end] == 0) {
- break;
- }
- }
- if (end - offset > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: string too long",
- css::uno::Reference< css::uno::XInterface >());
- }
- rtl::OUString name;
- if (!rtl_convertStringToUString(
- &name.pData, static_cast< char const * >(address) + offset,
- end - offset, RTL_TEXTENCODING_ASCII_US,
- (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
- | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
- | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
- {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: name is not ASCII",
- css::uno::Reference< css::uno::XInterface >());
- }
- return name;
-}
-
-rtl::OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset)
- const
-{
- sal_uInt32 len = read32(offset);
- if ((len & 0x80000000) == 0) {
- if (newOffset != 0) {
- *newOffset = offset + 4;
- }
- offset = len;
- len = read32(offset);
- if ((len & 0x80000000) == 0) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: name length high bit unset",
- css::uno::Reference< css::uno::XInterface >());
- }
- len &= ~0x80000000;
- } else {
- len &= ~0x80000000;
- if (newOffset != 0) {
- *newOffset = offset + 4 + len;
- }
- }
- if (len > SAL_MAX_INT32 || len > size - offset - 4) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: size of name is too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- rtl::OUString name;
- if (!rtl_convertStringToUString(
- &name.pData, static_cast< char const * >(address) + offset + 4, len,
- RTL_TEXTENCODING_ASCII_US,
- (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
- | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
- | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
- {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: name is not ASCII",
- css::uno::Reference< css::uno::XInterface >());
- }
- return name;
-}
-
-MappedFile::~MappedFile() {
- oslFileError e = osl_unmapMappedFile(handle, address, size);
- SAL_WARN_IF(e != osl_File_E_None, "cppuhelper", "cannot unmap: " << +e);
- e = osl_closeFile(handle);
- SAL_WARN_IF(e != osl_File_E_None, "cppuhelper", "cannot close: " << +e);
-}
-
-sal_uInt8 MappedFile::get8(sal_uInt32 offset) const {
- assert(size >= 8);
- assert(offset <= size - 1);
- return static_cast< char const * >(address)[offset];
-}
-
-sal_uInt16 MappedFile::get16(sal_uInt32 offset) const {
- assert(size >= 8);
- assert(offset <= size - 2);
- return reinterpret_cast< Memory16 const * >(
- static_cast< char const * >(address) + offset)->getUnsigned16();
-}
-
-sal_uInt32 MappedFile::get32(sal_uInt32 offset) const {
- assert(size >= 8);
- assert(offset <= size - 4);
- return reinterpret_cast< Memory32 const * >(
- static_cast< char const * >(address) + offset)->getUnsigned32();
-}
-
-sal_uInt64 MappedFile::get64(sal_uInt32 offset) const {
- assert(size >= 8);
- assert(offset <= size - 8);
- return reinterpret_cast< Memory64 const * >(
- static_cast< char const * >(address) + offset)->getUnsigned64();
-}
-
-float MappedFile::getIso60599Binary32(sal_uInt32 offset) const {
- assert(size >= 8);
- assert(offset <= size - 4);
- return reinterpret_cast< Memory32 const * >(
- static_cast< char const * >(address) + offset)->getIso60599Binary32();
-}
-
-double MappedFile::getIso60599Binary64(sal_uInt32 offset) const {
- assert(size >= 8);
- assert(offset <= size - 8);
- return reinterpret_cast< Memory64 const * >(
- static_cast< char const * >(address) + offset)->getIso60599Binary64();
-}
-
css::uno::Reference< css::reflection::XTypeDescription > resolve(
css::uno::Reference< css::uno::XComponentContext > const & context,
rtl::OUString const & name)
@@ -626,9 +108,9 @@ public:
ModuleDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
rtl::OUString const & name,
- std::vector< rtl::OUString > const & items):
- context_(context), name_(name), items_(items)
- {}
+ rtl::Reference< cppu::unoidl::ModuleEntity > const & entity):
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~ModuleDescription() {}
@@ -647,17 +129,18 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- std::vector< rtl::OUString > items_;
+ rtl::Reference< cppu::unoidl::ModuleEntity > entity_;
};
css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
ModuleDescription::getMembers() throw (css::uno::RuntimeException) {
- assert(items_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(items_.size());
+ std::vector< rtl::OUString > names(entity_->getMemberNames());
+ assert(names.size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(names.size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = resolve(context_, name_ + "." + items_[i]);
+ s[i] = resolve(context_, name_ + "." + names[i]);
}
return s;
}
@@ -668,20 +151,12 @@ EnumTypeDescription_Base;
class EnumTypeDescription: public EnumTypeDescription_Base {
public:
- struct Member {
- Member(rtl::OUString const & theName, sal_Int32 theValue):
- name(theName), value(theValue)
- {}
-
- rtl::OUString name;
- sal_Int32 value;
- };
-
EnumTypeDescription(
- rtl::OUString const & name, bool published,
- std::vector< Member > const & members):
- EnumTypeDescription_Base(published), name_(name), members_(members)
- { assert(!members_.empty()); }
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::EnumTypeEntity > const & entity):
+ EnumTypeDescription_Base(entity->isPublished()), name_(name),
+ entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~EnumTypeDescription() {}
@@ -695,7 +170,7 @@ private:
virtual sal_Int32 SAL_CALL getDefaultEnumValue()
throw (css::uno::RuntimeException)
- { return members_[0].value; }
+ { return entity_->getMembers()[0].value; }
virtual css::uno::Sequence< rtl::OUString > SAL_CALL getEnumNames()
throw (css::uno::RuntimeException);
@@ -704,17 +179,17 @@ private:
throw (css::uno::RuntimeException);
rtl::OUString name_;
- std::vector< Member > members_;
+ rtl::Reference< cppu::unoidl::EnumTypeEntity > entity_;
};
css::uno::Sequence< rtl::OUString > EnumTypeDescription::getEnumNames()
throw (css::uno::RuntimeException)
{
- assert(members_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(members_.size());
+ assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
css::uno::Sequence< rtl::OUString > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = members_[i].name;
+ s[i] = entity_->getMembers()[i].name;
}
return s;
}
@@ -722,11 +197,11 @@ css::uno::Sequence< rtl::OUString > EnumTypeDescription::getEnumNames()
css::uno::Sequence< sal_Int32 > EnumTypeDescription::getEnumValues()
throw (css::uno::RuntimeException)
{
- assert(members_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(members_.size());
+ assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
css::uno::Sequence< sal_Int32 > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = members_[i].value;
+ s[i] = entity_->getMembers()[i].value;
}
return s;
}
@@ -737,22 +212,13 @@ PlainStructTypeDescription_Base;
class PlainStructTypeDescription: public PlainStructTypeDescription_Base {
public:
- struct Member {
- Member(rtl::OUString const & theName, rtl::OUString const & theType):
- name(theName), type(theType)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- };
-
PlainStructTypeDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published, rtl::OUString const & base,
- std::vector< Member > const & directMembers):
- PlainStructTypeDescription_Base(published), context_(context),
- name_(name), base_(base), directMembers_(directMembers)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::PlainStructTypeEntity > const & entity):
+ PlainStructTypeDescription_Base(entity->isPublished()),
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~PlainStructTypeDescription() {}
@@ -766,9 +232,9 @@ private:
virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
getBaseType() throw (css::uno::RuntimeException) {
- return base_.isEmpty()
+ return entity_->getDirectBase().isEmpty()
? css::uno::Reference< css::reflection::XTypeDescription >()
- : resolve(context_, base_);
+ : resolve(context_, entity_->getDirectBase());
}
virtual
@@ -793,19 +259,18 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- rtl::OUString base_;
- std::vector< Member > directMembers_;
+ rtl::Reference< cppu::unoidl::PlainStructTypeEntity > entity_;
};
css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
PlainStructTypeDescription::getMemberTypes() throw (css::uno::RuntimeException)
{
- assert(directMembers_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(directMembers_.size());
+ assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getDirectMembers().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = resolve(context_, directMembers_[i].type);
+ s[i] = resolve(context_, entity_->getDirectMembers()[i].type);
}
return s;
}
@@ -813,11 +278,11 @@ PlainStructTypeDescription::getMemberTypes() throw (css::uno::RuntimeException)
css::uno::Sequence< rtl::OUString > PlainStructTypeDescription::getMemberNames()
throw (css::uno::RuntimeException)
{
- assert(directMembers_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(directMembers_.size());
+ assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getDirectMembers().size());
css::uno::Sequence< rtl::OUString > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = directMembers_[i].name;
+ s[i] = entity_->getDirectMembers()[i].name;
}
return s;
}
@@ -853,27 +318,14 @@ class PolymorphicStructTypeTemplateDescription:
public PolymorphicStructTypeTemplateDescription_Base
{
public:
- struct Member {
- Member(
- rtl::OUString const & theName, rtl::OUString const & theType,
- bool theParameterized):
- name(theName), type(theType), parameterized(theParameterized)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- bool parameterized;
- };
-
PolymorphicStructTypeTemplateDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published,
- std::vector< rtl::OUString > const & typeParameters,
- std::vector< Member > const & members):
- PolymorphicStructTypeTemplateDescription_Base(published),
- context_(context), name_(name), typeParameters_(typeParameters),
- members_(members)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::PolymorphicStructTypeTemplateEntity >
+ const & entity):
+ PolymorphicStructTypeTemplateDescription_Base(entity->isPublished()),
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~PolymorphicStructTypeTemplateDescription() {}
@@ -910,22 +362,22 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- std::vector< rtl::OUString > typeParameters_;
- std::vector< Member > members_;
+ rtl::Reference< cppu::unoidl::PolymorphicStructTypeTemplateEntity > entity_;
};
css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
PolymorphicStructTypeTemplateDescription::getMemberTypes()
throw (css::uno::RuntimeException)
{
- assert(members_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(members_.size());
+ assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = members_[i].parameterized
- ? new ParameterizedMemberTypeDescription(members_[i].type)
- : resolve(context_, members_[i].type);
+ s[i] = entity_->getMembers()[i].parameterized
+ ? new ParameterizedMemberTypeDescription(
+ entity_->getMembers()[i].type)
+ : resolve(context_, entity_->getMembers()[i].type);
}
return s;
}
@@ -934,11 +386,11 @@ css::uno::Sequence< rtl::OUString >
PolymorphicStructTypeTemplateDescription::getMemberNames()
throw (css::uno::RuntimeException)
{
- assert(members_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(members_.size());
+ assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
css::uno::Sequence< rtl::OUString > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = members_[i].name;
+ s[i] = entity_->getMembers()[i].name;
}
return s;
}
@@ -947,11 +399,11 @@ css::uno::Sequence< rtl::OUString >
PolymorphicStructTypeTemplateDescription::getTypeParameters()
throw (css::uno::RuntimeException)
{
- assert(typeParameters_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(typeParameters_.size());
+ assert(entity_->getTypeParameters().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getTypeParameters().size());
css::uno::Sequence< rtl::OUString > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = typeParameters_[i];
+ s[i] = entity_->getTypeParameters()[i];
}
return s;
}
@@ -962,22 +414,13 @@ ExceptionTypeDescription_Base;
class ExceptionTypeDescription: public ExceptionTypeDescription_Base {
public:
- struct Member {
- Member(rtl::OUString const & theName, rtl::OUString const & theType):
- name(theName), type(theType)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- };
-
ExceptionTypeDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published, rtl::OUString const & base,
- std::vector< Member > const & directMembers):
- ExceptionTypeDescription_Base(published), context_(context),
- name_(name), base_(base), directMembers_(directMembers)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::ExceptionTypeEntity > const & entity):
+ ExceptionTypeDescription_Base(entity->isPublished()), context_(context),
+ name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~ExceptionTypeDescription() {}
@@ -991,9 +434,9 @@ private:
virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
getBaseType() throw (css::uno::RuntimeException) {
- return base_.isEmpty()
+ return entity_->getDirectBase().isEmpty()
? css::uno::Reference< css::reflection::XTypeDescription >()
- : resolve(context_, base_);
+ : resolve(context_, entity_->getDirectBase());
}
virtual
@@ -1006,18 +449,17 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- rtl::OUString base_;
- std::vector< Member > directMembers_;
+ rtl::Reference< cppu::unoidl::ExceptionTypeEntity > entity_;
};
css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
ExceptionTypeDescription::getMemberTypes() throw (css::uno::RuntimeException) {
- assert(directMembers_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(directMembers_.size());
+ assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getDirectMembers().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = resolve(context_, directMembers_[i].type);
+ s[i] = resolve(context_, entity_->getDirectMembers()[i].type);
}
return s;
}
@@ -1025,11 +467,11 @@ ExceptionTypeDescription::getMemberTypes() throw (css::uno::RuntimeException) {
css::uno::Sequence< rtl::OUString > ExceptionTypeDescription::getMemberNames()
throw (css::uno::RuntimeException)
{
- assert(directMembers_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(directMembers_.size());
+ assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getDirectMembers().size());
css::uno::Sequence< rtl::OUString > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = directMembers_[i].name;
+ s[i] = entity_->getDirectMembers()[i].name;
}
return s;
}
@@ -1100,24 +542,6 @@ void BaseOffset::calculate(
}
}
-struct Attribute {
- Attribute(
- rtl::OUString const & theName, rtl::OUString const & theType,
- bool theBound, bool theReadOnly,
- std::vector< rtl::OUString > const & theGetExceptions,
- std::vector< rtl::OUString > const & theSetExceptions):
- name(theName), type(theType), bound(theBound), readOnly(theReadOnly),
- getExceptions(theGetExceptions), setExceptions(theSetExceptions)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- bool bound;
- bool readOnly;
- std::vector< rtl::OUString > getExceptions;
- std::vector< rtl::OUString > setExceptions;
-};
-
class AttributeDescription:
public cppu::WeakImplHelper1<
css::reflection::XInterfaceAttributeTypeDescription2 >,
@@ -1126,7 +550,9 @@ class AttributeDescription:
public:
AttributeDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, Attribute attribute, sal_Int32 position):
+ rtl::OUString const & name,
+ cppu::unoidl::InterfaceTypeEntity::Attribute const & attribute,
+ sal_Int32 position):
context_(context), name_(name), attribute_(attribute),
position_(position)
{}
@@ -1170,7 +596,7 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- Attribute attribute_;
+ cppu::unoidl::InterfaceTypeEntity::Attribute attribute_;
sal_Int32 position_;
};
@@ -1204,35 +630,6 @@ AttributeDescription::getSetExceptions() throw (css::uno::RuntimeException) {
return s;
}
-struct Method {
- struct Parameter {
- enum Direction { DIRECTION_IN, DIRECTION_OUT, DIRECTION_IN_OUT };
-
- Parameter(
- rtl::OUString const & theName, rtl::OUString const & theType,
- Direction theDirection):
- name(theName), type(theType), direction(theDirection)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- Direction direction;
- };
-
- Method(
- rtl::OUString const & theName, rtl::OUString const & theReturnType,
- std::vector< Parameter > const & theParameters,
- std::vector< rtl::OUString > const & theExceptions):
- name(theName), returnType(theReturnType), parameters(theParameters),
- exceptions(theExceptions)
- {}
-
- rtl::OUString name;
- rtl::OUString returnType;
- std::vector< Parameter > parameters;
- std::vector< rtl::OUString > exceptions;
-};
-
class MethodParameter:
public cppu::WeakImplHelper1< css::reflection::XMethodParameter >,
private boost::noncopyable
@@ -1240,7 +637,8 @@ class MethodParameter:
public:
MethodParameter(
css::uno::Reference< css::uno::XComponentContext > const & context,
- Method::Parameter parameter, sal_Int32 position):
+ cppu::unoidl::InterfaceTypeEntity::Method::Parameter const & parameter,
+ sal_Int32 position):
context_(context), parameter_(parameter), position_(position)
{}
@@ -1255,20 +653,30 @@ private:
{ return resolve(context_, parameter_.type); }
virtual sal_Bool SAL_CALL isIn() throw (css::uno::RuntimeException) {
- return parameter_.direction == Method::Parameter::DIRECTION_IN
- || parameter_.direction == Method::Parameter::DIRECTION_IN_OUT;
+ return
+ (parameter_.direction
+ == cppu::unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_IN)
+ || (parameter_.direction
+ == cppu::unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_IN_OUT);
}
virtual sal_Bool SAL_CALL isOut() throw (css::uno::RuntimeException) {
- return parameter_.direction == Method::Parameter::DIRECTION_OUT
- || parameter_.direction == Method::Parameter::DIRECTION_IN_OUT;
+ return
+ (parameter_.direction
+ == cppu::unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_OUT)
+ || (parameter_.direction
+ == cppu::unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_IN_OUT);
}
virtual sal_Int32 SAL_CALL getPosition() throw (css::uno::RuntimeException)
{ return position_; }
css::uno::Reference< css::uno::XComponentContext > context_;
- Method::Parameter parameter_;
+ cppu::unoidl::InterfaceTypeEntity::Method::Parameter parameter_;
sal_Int32 position_;
};
@@ -1280,7 +688,9 @@ class MethodDescription:
public:
MethodDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, Method method, sal_Int32 position):
+ rtl::OUString const & name,
+ cppu::unoidl::InterfaceTypeEntity::Method const & method,
+ sal_Int32 position):
context_(context), name_(name), method_(method), position_(position)
{}
@@ -1320,7 +730,7 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- Method method_;
+ cppu::unoidl::InterfaceTypeEntity::Method method_;
sal_Int32 position_;
};
@@ -1356,16 +766,11 @@ class InterfaceTypeDescription: public InterfaceTypeDescription_Base {
public:
InterfaceTypeDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published,
- std::vector< rtl::OUString > const & mandatoryDirectBases,
- std::vector< rtl::OUString > const & optionalDirectBases,
- std::vector< Attribute > const & directAttributes,
- std::vector< Method > const & directMethods):
- InterfaceTypeDescription_Base(published), context_(context),
- name_(name), mandatoryDirectBases_(mandatoryDirectBases),
- optionalDirectBases_(optionalDirectBases),
- directAttributes_(directAttributes), directMethods_(directMethods)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::InterfaceTypeEntity > const & entity):
+ InterfaceTypeDescription_Base(entity->isPublished()), context_(context),
+ name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~InterfaceTypeDescription() {}
@@ -1379,9 +784,9 @@ private:
virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
getBaseType() throw (css::uno::RuntimeException) {
- return mandatoryDirectBases_.empty()
+ return entity_->getDirectMandatoryBases().empty()
? css::uno::Reference< css::reflection::XTypeDescription >()
- : resolve(context_, mandatoryDirectBases_[0]);
+ : resolve(context_, entity_->getDirectMandatoryBases()[0]);
}
virtual css::uno::Uik SAL_CALL getUik() throw (css::uno::RuntimeException)
@@ -1405,45 +810,45 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- std::vector< rtl::OUString > mandatoryDirectBases_;
- std::vector< rtl::OUString > optionalDirectBases_;
- std::vector< Attribute > directAttributes_;
- std::vector< Method > directMethods_;
+ rtl::Reference< cppu::unoidl::InterfaceTypeEntity > entity_;
};
css::uno::Sequence<
css::uno::Reference< css::reflection::XInterfaceMemberTypeDescription > >
InterfaceTypeDescription::getMembers() throw (css::uno::RuntimeException) {
assert(
- directAttributes_.size() <= SAL_MAX_INT32
- && directMethods_.size() <= SAL_MAX_INT32 - directAttributes_.size());
- sal_Int32 n1 = static_cast< sal_Int32 >(directAttributes_.size());
- sal_Int32 n2 = static_cast< sal_Int32 >(directMethods_.size());
+ entity_->getDirectAttributes().size() <= SAL_MAX_INT32
+ && (entity_->getDirectMethods().size()
+ <= SAL_MAX_INT32 - entity_->getDirectAttributes().size()));
+ sal_Int32 n1 = static_cast< sal_Int32 >(
+ entity_->getDirectAttributes().size());
+ sal_Int32 n2 = static_cast< sal_Int32 >(entity_->getDirectMethods().size());
css::uno::Sequence<
css::uno::Reference<
css::reflection::XInterfaceMemberTypeDescription > > s(n1 + n2);
sal_Int32 off = BaseOffset(this).get();
for (sal_Int32 i = 0; i != n1; ++i) {
s[i] = new AttributeDescription(
- context_, name_ + "::" + directAttributes_[i].name,
- directAttributes_[i], off + i);
+ context_, name_ + "::" + entity_->getDirectAttributes()[i].name,
+ entity_->getDirectAttributes()[i], off + i);
}
for (sal_Int32 i = 0; i != n2; ++i) {
s[n1 + i] = new MethodDescription(
- context_, name_ + "::" + directMethods_[i].name,
- directMethods_[i], off + n1 + i);
+ context_, name_ + "::" + entity_->getDirectMethods()[i].name,
+ entity_->getDirectMethods()[i], off + n1 + i);
}
return s;
}
css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
InterfaceTypeDescription::getBaseTypes() throw (css::uno::RuntimeException) {
- assert(mandatoryDirectBases_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(mandatoryDirectBases_.size());
+ assert(entity_->getDirectMandatoryBases().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(
+ entity_->getDirectMandatoryBases().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = resolve(context_, mandatoryDirectBases_[i]);
+ s[i] = resolve(context_, entity_->getDirectMandatoryBases()[i]);
}
return s;
}
@@ -1452,12 +857,13 @@ css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
InterfaceTypeDescription::getOptionalBaseTypes()
throw (css::uno::RuntimeException)
{
- assert(optionalDirectBases_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(optionalDirectBases_.size());
+ assert(entity_->getDirectOptionalBases().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(
+ entity_->getDirectOptionalBases().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = resolve(context_, optionalDirectBases_[i]);
+ s[i] = resolve(context_, entity_->getDirectOptionalBases()[i]);
}
return s;
}
@@ -1498,11 +904,11 @@ class ConstantGroupDescription: public ConstantGroupDescription_Base {
public:
ConstantGroupDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published,
- std::vector< rtl::OUString > const & constants):
- ConstantGroupDescription_Base(published), context_(context),
- name_(name), constants_(constants)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::ConstantGroupEntity > const & entity):
+ ConstantGroupDescription_Base(entity->isPublished()), context_(context),
+ name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~ConstantGroupDescription() {}
@@ -1521,19 +927,20 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- std::vector< rtl::OUString > constants_;
+ rtl::Reference< cppu::unoidl::ConstantGroupEntity > entity_;
};
css::uno::Sequence<
css::uno::Reference< css::reflection::XConstantTypeDescription > >
ConstantGroupDescription::getConstants() throw (css::uno::RuntimeException) {
- assert(constants_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(constants_.size());
+ assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XConstantTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
+ //TODO: use entity_->getMembers()[i].value directly?
s[i].set(
- resolve(context_, name_ + "." + constants_[i]),
+ resolve(context_, name_ + "." + entity_->getMembers()[i].name),
css::uno::UNO_QUERY_THROW);
}
return s;
@@ -1547,10 +954,11 @@ class TypedefDescription: public TypedefDescription_Base {
public:
TypedefDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published, rtl::OUString const & type):
- TypedefDescription_Base(published), context_(context), name_(name),
- type_(type)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::TypedefEntity > const & entity):
+ TypedefDescription_Base(entity->isPublished()), context_(context),
+ name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~TypedefDescription() {}
@@ -1564,40 +972,11 @@ private:
virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
getReferencedType() throw (css::uno::RuntimeException)
- { return resolve(context_, type_); }
+ { return resolve(context_, entity_->getType()); }
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- rtl::OUString type_;
-};
-
-struct Constructor {
- struct Parameter {
- Parameter(
- rtl::OUString const & theName, rtl::OUString const & theType,
- bool theRest):
- name(theName), type(theType), rest(theRest)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- bool rest;
- };
-
- Constructor(): defaultConstructor(true) {}
-
- Constructor(
- rtl::OUString const & theName,
- std::vector< Parameter > const & theParameters,
- std::vector< rtl::OUString > const & theExceptions):
- defaultConstructor(false), name(theName), parameters(theParameters),
- exceptions(theExceptions)
- {}
-
- bool defaultConstructor;
- rtl::OUString name;
- std::vector< Parameter > parameters;
- std::vector< rtl::OUString > exceptions;
+ rtl::Reference< cppu::unoidl::TypedefEntity > entity_;
};
class ConstructorParameter:
@@ -1607,7 +986,9 @@ class ConstructorParameter:
public:
ConstructorParameter(
css::uno::Reference< css::uno::XComponentContext > const & context,
- Constructor::Parameter parameter, sal_Int32 position):
+ cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter
+ const & parameter,
+ sal_Int32 position):
context_(context), parameter_(parameter), position_(position)
{}
@@ -1635,7 +1016,8 @@ private:
{ return parameter_.rest; }
css::uno::Reference< css::uno::XComponentContext > context_;
- Constructor::Parameter parameter_;
+ cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter
+ parameter_;
sal_Int32 position_;
};
@@ -1647,7 +1029,8 @@ class ConstructorDescription:
public:
ConstructorDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- Constructor const & constructor):
+ cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor const &
+ constructor):
context_(context), constructor_(constructor)
{}
@@ -1672,7 +1055,7 @@ private:
SAL_CALL getExceptions() throw (css::uno::RuntimeException);
css::uno::Reference< css::uno::XComponentContext > context_;
- Constructor constructor_;
+ cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor constructor_;
};
css::uno::Sequence< css::uno::Reference< css::reflection::XParameter > >
@@ -1713,11 +1096,12 @@ class SingleInterfaceBasedServiceDescription:
public:
SingleInterfaceBasedServiceDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published, rtl::OUString const & type,
- std::vector< Constructor > const & constructors):
- SingleInterfaceBasedServiceDescription_Base(published),
- context_(context), name_(name), type_(type), constructors_(constructors)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::SingleInterfaceBasedServiceEntity >
+ const & entity):
+ SingleInterfaceBasedServiceDescription_Base(entity->isPublished()),
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~SingleInterfaceBasedServiceDescription() {}
@@ -1783,7 +1167,7 @@ private:
virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
getInterface() throw (css::uno::RuntimeException)
- { return resolve(context_, type_); }
+ { return resolve(context_, entity_->getBase()); }
virtual
css::uno::Sequence<
@@ -1792,8 +1176,7 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- rtl::OUString type_;
- std::vector< Constructor > constructors_;
+ rtl::Reference< cppu::unoidl::SingleInterfaceBasedServiceEntity > entity_;
};
css::uno::Sequence<
@@ -1801,29 +1184,18 @@ css::uno::Sequence<
SingleInterfaceBasedServiceDescription::getConstructors()
throw (css::uno::RuntimeException)
{
- assert(constructors_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(constructors_.size());
+ assert(entity_->getConstructors().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(entity_->getConstructors().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XServiceConstructorDescription > >
s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = new ConstructorDescription(context_, constructors_[i]);
+ s[i] = new ConstructorDescription(
+ context_, entity_->getConstructors()[i]);
}
return s;
}
-struct Property {
- Property(
- rtl::OUString const & theName, rtl::OUString const & theType,
- sal_uInt16 theAttributes):
- name(theName), type(theType), attributes(theAttributes)
- {}
-
- rtl::OUString name;
- rtl::OUString type;
- sal_Int16 attributes;
-};
-
class PropertyDescription:
public cppu::WeakImplHelper1< css::reflection::XPropertyTypeDescription >,
private boost::noncopyable
@@ -1831,7 +1203,8 @@ class PropertyDescription:
public:
PropertyDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- Property const & property):
+ cppu::unoidl::AccumulationBasedServiceEntity::Property const &
+ property):
context_(context), property_(property)
{}
@@ -1854,7 +1227,7 @@ private:
{ return resolve(context_, property_.type); }
css::uno::Reference< css::uno::XComponentContext > context_;
- Property property_;
+ cppu::unoidl::AccumulationBasedServiceEntity::Property property_;
};
typedef cppu::ImplInheritanceHelper1<
@@ -1867,19 +1240,12 @@ class AccumulationBasedServiceDescription:
public:
AccumulationBasedServiceDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published,
- std::vector< rtl::OUString > const & mandatoryDirectBaseServices,
- std::vector< rtl::OUString > const & optionalDirectBaseServices,
- std::vector< rtl::OUString > const & mandatoryDirectBaseInterfaces,
- std::vector< rtl::OUString > const & optionalDirectBaseInterfaces,
- std::vector< Property > const & directProperties):
- AccumulationBasedServiceDescription_Base(published), context_(context),
- name_(name), mandatoryDirectBaseServices_(mandatoryDirectBaseServices),
- optionalDirectBaseServices_(optionalDirectBaseServices),
- mandatoryDirectBaseInterfaces_(mandatoryDirectBaseInterfaces),
- optionalDirectBaseInterfaces_(optionalDirectBaseInterfaces),
- directProperties_(directProperties)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::AccumulationBasedServiceEntity > const &
+ entity):
+ AccumulationBasedServiceDescription_Base(entity->isPublished()),
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~AccumulationBasedServiceDescription() {}
@@ -1936,11 +1302,7 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- std::vector< rtl::OUString > mandatoryDirectBaseServices_;
- std::vector< rtl::OUString > optionalDirectBaseServices_;
- std::vector< rtl::OUString > mandatoryDirectBaseInterfaces_;
- std::vector< rtl::OUString > optionalDirectBaseInterfaces_;
- std::vector< Property > directProperties_;
+ rtl::Reference< cppu::unoidl::AccumulationBasedServiceEntity > entity_;
};
css::uno::Sequence<
@@ -1948,13 +1310,14 @@ css::uno::Sequence<
AccumulationBasedServiceDescription::getMandatoryServices()
throw (css::uno::RuntimeException)
{
- assert(mandatoryDirectBaseServices_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(mandatoryDirectBaseServices_.size());
+ assert(entity_->getDirectMandatoryBaseServices().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(
+ entity_->getDirectMandatoryBaseServices().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XServiceTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
s[i].set(
- resolve(context_, mandatoryDirectBaseServices_[i]),
+ resolve(context_, entity_->getDirectMandatoryBaseServices()[i]),
css::uno::UNO_QUERY_THROW);
}
return s;
@@ -1965,13 +1328,14 @@ css::uno::Sequence<
AccumulationBasedServiceDescription::getOptionalServices()
throw (css::uno::RuntimeException)
{
- assert(optionalDirectBaseServices_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(optionalDirectBaseServices_.size());
+ assert(entity_->getDirectOptionalBaseServices().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(
+ entity_->getDirectOptionalBaseServices().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XServiceTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
s[i].set(
- resolve(context_, optionalDirectBaseServices_[i]),
+ resolve(context_, entity_->getDirectOptionalBaseServices()[i]),
css::uno::UNO_QUERY_THROW);
}
return s;
@@ -1982,16 +1346,17 @@ css::uno::Sequence<
AccumulationBasedServiceDescription::getMandatoryInterfaces()
throw (css::uno::RuntimeException)
{
- assert(mandatoryDirectBaseInterfaces_.size() <= SAL_MAX_INT32);
+ assert(entity_->getDirectMandatoryBaseInterfaces().size() <= SAL_MAX_INT32);
sal_Int32 n = static_cast< sal_Int32 >(
- mandatoryDirectBaseInterfaces_.size());
+ entity_->getDirectMandatoryBaseInterfaces().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XInterfaceTypeDescription > > s(
n);
for (sal_Int32 i = 0; i != n; ++i) {
s[i].set(
resolveTypedefs(
- resolve(context_, mandatoryDirectBaseInterfaces_[i])),
+ resolve(
+ context_, entity_->getDirectMandatoryBaseInterfaces()[i])),
css::uno::UNO_QUERY_THROW);
}
return s;
@@ -2002,16 +1367,17 @@ css::uno::Sequence<
AccumulationBasedServiceDescription::getOptionalInterfaces()
throw (css::uno::RuntimeException)
{
- assert(optionalDirectBaseInterfaces_.size() <= SAL_MAX_INT32);
+ assert(entity_->getDirectOptionalBaseInterfaces().size() <= SAL_MAX_INT32);
sal_Int32 n = static_cast< sal_Int32 >(
- optionalDirectBaseInterfaces_.size());
+ entity_->getDirectOptionalBaseInterfaces().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XInterfaceTypeDescription > > s(
n);
for (sal_Int32 i = 0; i != n; ++i) {
s[i].set(
resolveTypedefs(
- resolve(context_, optionalDirectBaseInterfaces_[i])),
+ resolve(
+ context_, entity_->getDirectOptionalBaseInterfaces()[i])),
css::uno::UNO_QUERY_THROW);
}
return s;
@@ -2022,12 +1388,14 @@ css::uno::Sequence<
AccumulationBasedServiceDescription::getProperties()
throw (css::uno::RuntimeException)
{
- assert(directProperties_.size() <= SAL_MAX_INT32);
- sal_Int32 n = static_cast< sal_Int32 >(directProperties_.size());
+ assert(entity_->getDirectProperties().size() <= SAL_MAX_INT32);
+ sal_Int32 n = static_cast< sal_Int32 >(
+ entity_->getDirectProperties().size());
css::uno::Sequence<
css::uno::Reference< css::reflection::XPropertyTypeDescription > > s(n);
for (sal_Int32 i = 0; i != n; ++i) {
- s[i] = new PropertyDescription(context_, directProperties_[i]);
+ s[i] = new PropertyDescription(
+ context_, entity_->getDirectProperties()[i]);
}
return s;
}
@@ -2042,10 +1410,12 @@ class InterfaceBasedSingletonDescription:
public:
InterfaceBasedSingletonDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published, rtl::OUString const & type):
- InterfaceBasedSingletonDescription_Base(published), context_(context),
- name_(name), type_(type)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::InterfaceBasedSingletonEntity > const &
+ entity):
+ InterfaceBasedSingletonDescription_Base(entity->isPublished()),
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~InterfaceBasedSingletonDescription() {}
@@ -2070,11 +1440,11 @@ private:
virtual css::uno::Reference< css::reflection::XTypeDescription >
SAL_CALL getInterface() throw (css::uno::RuntimeException)
- { return resolve(context_, type_); }
+ { return resolve(context_, entity_->getBase()); }
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- rtl::OUString type_;
+ rtl::Reference< cppu::unoidl::InterfaceBasedSingletonEntity > entity_;
};
typedef cppu::ImplInheritanceHelper1<
@@ -2087,10 +1457,12 @@ class ServiceBasedSingletonDescription:
public:
ServiceBasedSingletonDescription(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & name, bool published, rtl::OUString const & type):
- ServiceBasedSingletonDescription_Base(published), context_(context),
- name_(name), type_(type)
- {}
+ rtl::OUString const & name,
+ rtl::Reference< cppu::unoidl::ServiceBasedSingletonEntity > const &
+ entity):
+ ServiceBasedSingletonDescription_Base(entity_->isPublished()),
+ context_(context), name_(name), entity_(entity)
+ { assert(entity.is()); }
private:
virtual ~ServiceBasedSingletonDescription() {}
@@ -2106,7 +1478,7 @@ private:
SAL_CALL getService() throw (css::uno::RuntimeException)
{
return css::uno::Reference< css::reflection::XServiceTypeDescription >(
- resolve(context_, type_), css::uno::UNO_QUERY_THROW);
+ resolve(context_, entity_->getBase()), css::uno::UNO_QUERY_THROW);
}
virtual sal_Bool SAL_CALL isInterfaceBased()
@@ -2119,13 +1491,7 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString name_;
- rtl::OUString type_;
-};
-
-// sizeof (MapEntry) == 8
-struct MapEntry {
- Memory32 name;
- Memory32 data;
+ rtl::Reference< cppu::unoidl::ServiceBasedSingletonEntity > entity_;
};
class Enumeration:
@@ -2136,13 +1502,13 @@ class Enumeration:
public:
Enumeration(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::Reference< MappedFile > const & file, rtl::OUString const & prefix,
- MapEntry const * mapBegin, sal_uInt32 mapSize,
+ rtl::OUString const & prefix,
+ rtl::Reference< cppu::unoidl::MapCursor > const & cursor,
css::uno::Sequence< css::uno::TypeClass > const & types, bool deep):
- context_(context), file_(file), types_(types), deep_(deep)
+ context_(context), types_(types), deep_(deep)
{
- positions_.push(Position(prefix, mapBegin, mapSize, false));
- findMatch();
+ positions_.push(Position(prefix, cursor));
+ findNextMatch();
}
private:
@@ -2165,26 +1531,31 @@ private:
bool matches(css::uno::TypeClass tc) const;
- void proceed();
-
- void findMatch();
+ void findNextMatch();
struct Position {
Position(
- rtl::OUString const & thePrefix, MapEntry const * mapBegin,
- sal_uInt32 mapSize, bool theConstantGroup):
- prefix(thePrefix), position(mapBegin), end(mapBegin + mapSize),
- constantGroup(theConstantGroup)
- {}
+ rtl::OUString const & thePrefix,
+ rtl::Reference< cppu::unoidl::MapCursor > const & theCursor):
+ prefix(thePrefix), cursor(theCursor)
+ { assert(theCursor.is()); }
+
+ Position(
+ rtl::OUString const & thePrefix,
+ rtl::Reference< cppu::unoidl::ConstantGroupEntity > const &
+ theConstantGroup):
+ prefix(thePrefix), constantGroup(theConstantGroup),
+ constantGroupIndex(constantGroup->getMembers().begin())
+ { assert(theConstantGroup.is()); }
rtl::OUString prefix;
- MapEntry const * position;
- MapEntry const * end;
- bool constantGroup;
+ rtl::Reference< cppu::unoidl::MapCursor > cursor;
+ rtl::Reference< cppu::unoidl::ConstantGroupEntity > constantGroup;
+ std::vector< cppu::unoidl::ConstantGroupEntity::Member >::const_iterator
+ constantGroupIndex;
};
css::uno::Reference< css::uno::XComponentContext > context_;
- rtl::Reference< MappedFile > file_;
css::uno::Sequence< css::uno::TypeClass > types_;
bool deep_;
@@ -2206,8 +1577,7 @@ Enumeration::nextTypeDescription()
static_cast< cppu::OWeakObject * >(this));
}
name = current_;
- proceed();
- findMatch();
+ findNextMatch();
}
return resolve(context_, name);
}
@@ -2224,107 +1594,87 @@ bool Enumeration::matches(css::uno::TypeClass tc) const {
return false;
}
-void Enumeration::proceed() {
- assert(!positions_.empty());
- assert(positions_.top().position < positions_.top().end);
- if (deep_) {
- sal_uInt32 off = positions_.top().position->data.getUnsigned32();
- int v = file_->read8(off);
- bool recurse;
- bool cgroup = bool();
- if (v == 0) {
- recurse = true;
- cgroup = false;
- } else if ((v & 0x3F) == 7 && matches(css::uno::TypeClass_CONSTANT)) {
- recurse = true;
- cgroup = true;
- } else {
- recurse = false;
- }
- if (recurse) {
- rtl::OUString prefix(
- positions_.top().prefix
- + file_->readNameNul(
- positions_.top().position->name.getUnsigned32())
- + ".");
- sal_uInt32 mapSize = file_->read32(off + 1);
- if (8 * mapSize > file_->size - off - 5) { //TODO: overflow
- throw css::uno::DeploymentException(
- "broken UNOIDL file: map offset + size too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- MapEntry const * mapBegin = reinterpret_cast< MapEntry const * >(
- static_cast< char const * >(file_->address) + off + 5);
- ++positions_.top().position;
- positions_.push(Position(prefix, mapBegin, mapSize, cgroup));
- return;
- }
- }
- ++positions_.top().position;
-}
-
-void Enumeration::findMatch() {
- assert(!positions_.empty());
- for (;; proceed()) {
- while (positions_.top().position == positions_.top().end) {
- positions_.pop();
- if (positions_.empty()) {
- return;
+void Enumeration::findNextMatch() {
+ for (;;) {
+ assert(!positions_.empty());
+ rtl::OUString name;
+ if (positions_.top().cursor.is()) { // root or module
+ rtl::Reference< cppu::unoidl::Entity > ent(
+ positions_.top().cursor->getNext(&name));
+ if (!ent.is()) {
+ positions_.pop();
+ if (positions_.empty()) {
+ break;
+ }
+ continue;
}
- }
- bool match;
- if (positions_.top().constantGroup) {
- assert(matches(css::uno::TypeClass_CONSTANT));
- match = true;
- } else {
- sal_uInt32 off = positions_.top().position->data.getUnsigned32();
- int v = file_->read8(off);
+ name = positions_.top().prefix + name;
css::uno::TypeClass tc;
- switch (v & 0x1F) {
- case 0: // module
+ switch (ent->getSort()) {
+ case cppu::unoidl::Entity::SORT_MODULE:
tc = css::uno::TypeClass_MODULE;
+ if (deep_) {
+ positions_.push(
+ Position(
+ name + ".",
+ static_cast< cppu::unoidl::ModuleEntity * >(
+ ent.get())->createCursor()));
+ }
break;
- case 1: // enum type
+ case cppu::unoidl::Entity::SORT_ENUM_TYPE:
tc = css::uno::TypeClass_ENUM;
break;
- case 2: // plain struct type (with or without base)
- case 3: // polymorphic struct type template
+ case cppu::unoidl::Entity::SORT_PLAIN_STRUCT_TYPE:
+ case cppu::unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
tc = css::uno::TypeClass_STRUCT;
break;
- case 4: // exception type (with or without base)
+ case cppu::unoidl::Entity::SORT_EXCEPTION_TYPE:
tc = css::uno::TypeClass_EXCEPTION;
break;
- case 5: // interface type
+ case cppu::unoidl::Entity::SORT_INTERFACE_TYPE:
tc = css::uno::TypeClass_INTERFACE;
break;
- case 6: // typedef
+ case cppu::unoidl::Entity::SORT_TYPEDEF:
tc = css::uno::TypeClass_TYPEDEF;
break;
- case 7: // constant group
+ case cppu::unoidl::Entity::SORT_CONSTANT_GROUP:
tc = css::uno::TypeClass_CONSTANTS;
+ if (deep_ && matches(css::uno::TypeClass_CONSTANT)) {
+ positions_.push(
+ Position(
+ name + ".",
+ static_cast< cppu::unoidl::ConstantGroupEntity * >(
+ ent.get())));
+ }
break;
- case 8: // single-interface--based service (with or without default
- // constructor)
- case 9: // accumulation-based service
+ case cppu::unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE:
+ case cppu::unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE:
tc = css::uno::TypeClass_SERVICE;
break;
- case 10: // interface-based singleton
- case 11: // service-based singleton
+ case cppu::unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON:
+ case cppu::unoidl::Entity::SORT_SERVICE_BASED_SINGLETON:
tc = css::uno::TypeClass_SINGLETON;
break;
default:
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad type byte "
- + rtl::OUString::number(v)),
- css::uno::Reference< css::uno::XInterface >());
+ for (;;) { std::abort(); } // this cannot happen
+ }
+ if (matches(tc)) {
+ current_ = name;
+ break;
+ }
+ } else { // constant group
+ if (positions_.top().constantGroupIndex
+ == positions_.top().constantGroup->getMembers().end())
+ {
+ positions_.pop();
+ if (positions_.empty()) {
+ break;
+ }
+ continue;
}
- match = matches(tc);
- }
- if (match) {
current_ = positions_.top().prefix
- + file_->readNameNul(
- positions_.top().position->name.getUnsigned32());
- return;
+ + positions_.top().constantGroupIndex++->name;
+ break;
}
}
}
@@ -2340,14 +1690,15 @@ class Provider:
public:
Provider(
css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & uri);
+ rtl::OUString const & uri):
+ Provider_Base(*static_cast< osl::Mutex * >(this)), context_(context),
+ provider_(new cppu::UnoidlProvider(uri))
+ {}
using Provider_Base::acquire;
using Provider_Base::release;
private:
- enum Compare { COMPARE_LESS, COMPARE_GREATER, COMPARE_EQUAL };
-
virtual ~Provider() {}
virtual void SAL_CALL disposing() {} //TODO
@@ -2359,7 +1710,7 @@ private:
virtual sal_Bool SAL_CALL hasByHierarchicalName(
rtl::OUString const & aName) throw (css::uno::RuntimeException)
- { return find(aName) != 0; }
+ { return provider_->find(aName) != 0; }
virtual css::uno::Reference< css::reflection::XTypeDescriptionEnumeration >
SAL_CALL createTypeDescriptionEnumeration(
@@ -2371,654 +1722,117 @@ private:
css::reflection::InvalidTypeNameException,
css::uno::RuntimeException);
- sal_uInt32 find(rtl::OUString const & name, bool * constant = 0) const;
-
- sal_uInt32 findInMap(
- rtl::OUString const & name, sal_Int32 nameOffset, sal_Int32 nameLength,
- MapEntry const * mapBegin, sal_uInt32 mapSize) const;
-
- Compare compare(
- rtl::OUString const & name, sal_Int32 nameOffset, sal_Int32 nameLength,
- MapEntry const * entry) const;
-
css::uno::Reference< css::uno::XComponentContext > context_;
- rtl::Reference< MappedFile > file_;
- MapEntry const * mapBegin_;
- sal_uInt32 mapSize_;
+ rtl::Reference< cppu::UnoidlProvider > provider_;
};
-Provider::Provider(
- css::uno::Reference< css::uno::XComponentContext > const & context,
- rtl::OUString const & uri):
- Provider_Base(*static_cast< osl::Mutex * >(this)), context_(context),
- file_(new MappedFile(uri))
-{
- if (file_->size < 8 || std::memcmp(file_->address, "UNOIDL\0\xFF", 8) != 0)
- {
- throw css::registry::InvalidRegistryException(
- uri, css::uno::Reference< css::uno::XInterface >());
- }
- sal_uInt32 off = file_->read32(8);
- mapSize_ = file_->read32(12);
- if (off + 8 * mapSize_ > file_->size) { //TODO: overflow
- throw css::uno::DeploymentException(
- "broken UNOIDL file: root map offset + size too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- mapBegin_ = reinterpret_cast< MapEntry const * >(
- static_cast< char const * >(file_->address) + off);
-}
-
css::uno::Any Provider::getByHierarchicalName(rtl::OUString const & aName)
throw (css::container::NoSuchElementException, css::uno::RuntimeException)
{
bool cnst;
- sal_uInt32 off = find(aName, &cnst);
+ sal_uInt32 off = provider_->find(aName, &cnst);
if (off == 0) {
throw css::container::NoSuchElementException(
aName, static_cast< cppu::OWeakObject * >(this));
}
if (cnst) {
- int v = file_->read8(off);
- int type = v & 0x7F;
- bool deprecated = (v & 0x80) != 0; (void)deprecated;//TODO
- css::uno::Any any;
- switch (type) {
- case 0: // BOOLEAN
- v = file_->read8(off + 1);
- switch (v) {
- case 0:
- any <<= false;
- break;
- case 1:
- any <<= true;
- break;
- default:
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad boolean constant value "
- + rtl::OUString::number(v)),
- css::uno::Reference< css::uno::XInterface >());
- }
- break;
- case 1: // BYTE
- any <<= static_cast< sal_Int8 >(file_->read8(off + 1));
- //TODO: implementation-defined behavior of conversion from
- // sal_uInt8 to sal_Int8 relies on two's complement
- // representation
- break;
- case 2: // SHORT
- any <<= static_cast< sal_Int16 >(file_->read16(off + 1));
- //TODO: implementation-defined behavior of conversion from
- // sal_uInt16 to sal_Int16 relies on two's complement
- // representation
- break;
- case 3: // UNSIGNED SHORT
- any <<= file_->read16(off + 1);
- break;
- case 4: // LONG
- any <<= static_cast< sal_Int32 >(file_->read32(off + 1));
- //TODO: implementation-defined behavior of conversion from
- // sal_uInt32 to sal_Int32 relies on two's complement
- // representation
- break;
- case 5: // UNSIGNED LONG
- any <<= file_->read32(off + 1);
- break;
- case 6: // HYPER
- any <<= static_cast< sal_Int64 >(file_->read64(off + 1));
- //TODO: implementation-defined behavior of conversion from
- // sal_uInt64 to sal_Int64 relies on two's complement
- // representation
- break;
- case 7: // UNSIGNED HYPER
- any <<= file_->read64(off + 1);
- break;
- case 8: // FLOAT
- any <<= file_->readIso60599Binary32(off + 1);
- break;
- case 9: // DOUBLE
- any <<= file_->readIso60599Binary64(off + 1);
- break;
- default:
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad constant type byte "
- + rtl::OUString::number(v)),
- css::uno::Reference< css::uno::XInterface >());
- }
return css::uno::makeAny<
css::uno::Reference< css::reflection::XTypeDescription > >(
- new ConstantDescription(aName, any));
+ new ConstantDescription(aName, provider_->getConstant(off)));
} else {
- int v = file_->read8(off);
- int type = v & 0x3F;
- bool published = (v & 0x80) != 0;
- bool deprecated = (v & 0x40) != 0; (void)deprecated;//TODO
- bool flag = (v & 0x20) != 0;
- switch (type) {
- case 0: // module
- {
- if (v != 0) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad module type byte "
- + rtl::OUString::number(v)),
- css::uno::Reference< css::uno::XInterface >());
- }
- sal_uInt32 n = file_->read32(off + 1);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many items in module "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 5;
- std::vector< rtl::OUString > items;
- for (sal_uInt32 i = 0; i != n; ++i) {
- items.push_back(file_->readNameNul(file_->read32(off)));
- off += 8;
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new ModuleDescription(context_, aName, items));
- }
- case 1: // enum type
- {
- sal_uInt32 n = file_->read32(off + 1);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many members of enum type "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 5;
- std::vector< EnumTypeDescription::Member > mems;
- for (sal_uInt32 i = 0; i != n; ++i) {
- rtl::OUString memName(file_->readNameLen(off, &off));
- sal_Int32 memValue = static_cast< sal_Int32 >(
- file_->read32(off));
- //TODO: implementation-defined behavior of conversion
- // from sal_uInt32 to sal_Int32 relies on two's
- // complement representation
- off += 4;
- mems.push_back(
- EnumTypeDescription::Member(memName, memValue));
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new EnumTypeDescription(aName, published, mems));
- }
- case 2: // plain struct type without base
- case 2 | 0x20: // plain struct type with base
- {
- ++off;
- rtl::OUString base;
- if (flag) {
- base = file_->readNameLen(off, &off);
- if (base.isEmpty()) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: empty base type name of plain"
- " struct type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- }
- sal_uInt32 n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many direct members of plain"
- " struct type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< PlainStructTypeDescription::Member > mems;
- for (sal_uInt32 i = 0; i != n; ++i) {
- rtl::OUString memName(file_->readNameLen(off, &off));
- rtl::OUString memType(file_->readNameLen(off, &off));
- mems.push_back(
- PlainStructTypeDescription::Member(memName, memType));
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new PlainStructTypeDescription(
- context_, aName, published, base, mems));
- }
- case 3: // polymorphic struct type template
- {
- sal_uInt32 n = file_->read32(off + 1);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many type parameters of"
- " polymorphic struct type template " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 5;
- std::vector< rtl::OUString > params;
- for (sal_uInt32 i = 0; i != n; ++i) {
- params.push_back(file_->readNameLen(off, &off));
- }
- n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many members of polymorphic"
- " struct type template " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< PolymorphicStructTypeTemplateDescription::Member >
- mems;
- for (sal_uInt32 i = 0; i != n; ++i) {
- v = file_->read8(off);
- ++off;
- rtl::OUString memName(file_->readNameLen(off, &off));
- rtl::OUString memType(file_->readNameLen(off, &off));
- if (v > 1) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad flags "
- + rtl::OUString::number(v) + " for member "
- + memName + " of polymorphic struct type template "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- mems.push_back(
- PolymorphicStructTypeTemplateDescription::Member(
- memName, memType, v == 1));
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new PolymorphicStructTypeTemplateDescription(
- context_, aName, published, params, mems));
- }
- case 4: // exception type without base
- case 4 | 0x20: // exception type with base
- {
- ++off;
- rtl::OUString base;
- if (flag) {
- base = file_->readNameLen(off, &off);
- if (base.isEmpty()) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: empty base type name of"
- " exception type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- }
- sal_uInt32 n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many direct members of"
- " exception type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< ExceptionTypeDescription::Member > mems;
- for (sal_uInt32 i = 0; i != n; ++i) {
- rtl::OUString memName(file_->readNameLen(off, &off));
- rtl::OUString memType(file_->readNameLen(off, &off));
- mems.push_back(
- ExceptionTypeDescription::Member(memName, memType));
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new ExceptionTypeDescription(
- context_, aName, published, base, mems));
- }
- case 5: // interface type
- {
- sal_uInt32 n = file_->read32(off + 1);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many mandatory direct bases"
- " of interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 5;
- std::vector< rtl::OUString > mandBases;
- for (sal_uInt32 i = 0; i != n; ++i) {
- mandBases.push_back(file_->readNameLen(off, &off));
- }
- n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many optional direct bases of"
- " interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< rtl::OUString > optBases;
- for (sal_uInt32 i = 0; i != n; ++i) {
- optBases.push_back(file_->readNameLen(off, &off));
- }
- sal_uInt32 nAttrs = file_->read32(off);
- if (nAttrs > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many direct attributes of"
- " interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< Attribute > attrs;
- for (sal_uInt32 i = 0; i != nAttrs; ++i) {
- v = file_->read8(off);
- ++off;
- rtl::OUString attrName(file_->readNameLen(off, &off));
- rtl::OUString attrType(file_->readNameLen(off, &off));
- if (v > 0x03) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad flags for direct"
- " attribute " + attrName + " of interface type "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- std::vector< rtl::OUString > getExcs;
- sal_uInt32 m = file_->read32(off);
- if (m > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many getter exceptions"
- " for direct attribute " + attrName
- + " of interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- for (sal_uInt32 j = 0; j != m; ++j) {
- getExcs.push_back(file_->readNameLen(off, &off));
- }
- std::vector< rtl::OUString > setExcs;
- if ((v & 0x02) == 0) {
- m = file_->read32(off);
- if (m > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many setter"
- " exceptions for direct attribute " + attrName
- + " of interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- for (sal_uInt32 j = 0; j != m; ++j) {
- setExcs.push_back(file_->readNameLen(off, &off));
- }
- }
- attrs.push_back(
- Attribute(
- attrName, attrType, (v & 0x01) != 0,
- (v & 0x02) != 0, getExcs, setExcs));
- }
- sal_uInt32 nMeths = file_->read32(off);
- if (nMeths > SAL_MAX_INT32 - nAttrs) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many direct attributes and"
- " methods of interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< Method > meths;
- for (sal_uInt32 i = 0; i != nMeths; ++i) {
- rtl::OUString methName(file_->readNameLen(off, &off));
- rtl::OUString methType(file_->readNameLen(off, &off));
- sal_uInt32 m = file_->read32(off);
- if (m > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many parameters for"
- " method " + methName + " of interface type "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< Method::Parameter > params;
- for (sal_uInt32 j = 0; j != m; ++j) {
- v = file_->read8(off);
- ++off;
- rtl::OUString paramName(file_->readNameLen(off, &off));
- rtl::OUString paramType(file_->readNameLen(off, &off));
- Method::Parameter::Direction dir;
- switch (v) {
- case 0:
- dir = Method::Parameter::DIRECTION_IN;
- break;
- case 1:
- dir = Method::Parameter::DIRECTION_OUT;
- break;
- case 2:
- dir = Method::Parameter::DIRECTION_IN_OUT;
- break;
- default:
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad direction "
- + rtl::OUString::number(v) + " of parameter "
- + paramName + " for method " + methName
- + " of interface type " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- params.push_back(
- Method::Parameter(paramName, paramType, dir));
- }
- std::vector< rtl::OUString > excs;
- m = file_->read32(off);
- if (m > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many exceptions for"
- " method " + methName + " of interface type "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- for (sal_uInt32 j = 0; j != m; ++j) {
- excs.push_back(file_->readNameLen(off, &off));
- }
- meths.push_back(Method(methName, methType, params, excs));
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new InterfaceTypeDescription(
- context_, aName, published, mandBases, optBases,
- attrs, meths));
- }
- case 6: // typedef
+ rtl::Reference< cppu::unoidl::Entity > ent(provider_->getEntity(off));
+ switch (ent->getSort()) {
+ case cppu::unoidl::Entity::SORT_MODULE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new ModuleDescription(
+ context_, aName,
+ static_cast< cppu::unoidl::ModuleEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_ENUM_TYPE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new EnumTypeDescription(
+ aName,
+ static_cast< cppu::unoidl::EnumTypeEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_PLAIN_STRUCT_TYPE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new PlainStructTypeDescription(
+ context_, aName,
+ static_cast< cppu::unoidl::PlainStructTypeEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new PolymorphicStructTypeTemplateDescription(
+ context_, aName,
+ static_cast<
+ cppu::unoidl::PolymorphicStructTypeTemplateEntity *
+ >(ent.get())));
+ case cppu::unoidl::Entity::SORT_EXCEPTION_TYPE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new ExceptionTypeDescription(
+ context_, aName,
+ static_cast< cppu::unoidl::ExceptionTypeEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_INTERFACE_TYPE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new InterfaceTypeDescription(
+ context_, aName,
+ static_cast< cppu::unoidl::InterfaceTypeEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_TYPEDEF:
return css::uno::makeAny<
css::uno::Reference< css::reflection::XTypeDescription > >(
new TypedefDescription(
- context_, aName, published,
- file_->readNameLen(off + 1)));
- case 7: // constant group
- {
- sal_uInt32 n = file_->read32(off + 1);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many constants in constant"
- " group " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 5;
- std::vector< rtl::OUString > consts;
- for (sal_uInt32 i = 0; i != n; ++i) {
- consts.push_back(file_->readNameNul(file_->read32(off)));
- off += 8;
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new ConstantGroupDescription(
- context_, aName, published, consts));
- }
- case 8: // single-interface--based service without default constructor
- case 8 | 0x20:
- // single-interface--based service with default constructor
- {
- rtl::OUString base(file_->readNameLen(off + 1, &off));
- std::vector< Constructor > ctors;
- if (flag) {
- ctors.push_back(Constructor());
- } else {
- sal_uInt32 n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many constructors of"
- " single-interface--based service " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- for (sal_uInt32 i = 0; i != n; ++i) {
- rtl::OUString ctorName(file_->readNameLen(off, &off));
- sal_uInt32 m = file_->read32(off);
- if (m > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many parameters for"
- " constructor " + ctorName
- + " of single-interface--based service "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< Constructor::Parameter > params;
- for (sal_uInt32 j = 0; j != m; ++j) {
- v = file_->read8(off);
- ++off;
- rtl::OUString paramName(
- file_->readNameLen(off, &off));
- rtl::OUString paramType(
- file_->readNameLen(off, &off));
- bool rest;
- switch (v) {
- case 0:
- rest = false;
- break;
- case 0x04:
- rest = true;
- break;
- default:
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad mode "
- + rtl::OUString::number(v)
- + " of parameter " + paramName
- + " for constructor " + ctorName
- + " of single-interface--based service "
- + aName),
- css::uno::Reference<
- css::uno::XInterface >());
- }
- params.push_back(
- Constructor::Parameter(
- paramName, paramType, rest));
- }
- std::vector< rtl::OUString > excs;
- m = file_->read32(off);
- if (m > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many exceptions for"
- " constructor " + ctorName
- + " of single-interface--based service "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- for (sal_uInt32 j = 0; j != m; ++j) {
- excs.push_back(file_->readNameLen(off, &off));
- }
- ctors.push_back(Constructor(ctorName, params, excs));
- }
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new SingleInterfaceBasedServiceDescription(
- context_, aName, published, base, ctors));
- }
- case 9: // accumulation-based service
- {
- sal_uInt32 n = file_->read32(off + 1);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many mandatory direct service"
- " bases of accumulation-based service " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 5;
- std::vector< rtl::OUString > mandServs;
- for (sal_uInt32 i = 0; i != n; ++i) {
- mandServs.push_back(file_->readNameLen(off, &off));
- }
- n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many optional direct service"
- " bases of accumulation-based servcie " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< rtl::OUString > optServs;
- for (sal_uInt32 i = 0; i != n; ++i) {
- optServs.push_back(file_->readNameLen(off, &off));
- }
- n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many mandatory direct"
- " interface bases of accumulation-based servcie "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< rtl::OUString > mandIfcs;
- for (sal_uInt32 i = 0; i != n; ++i) {
- mandIfcs.push_back(file_->readNameLen(off, &off));
- }
- n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many optional direct"
- " interface bases of accumulation-based servcie "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< rtl::OUString > optIfcs;
- for (sal_uInt32 i = 0; i != n; ++i) {
- optIfcs.push_back(file_->readNameLen(off, &off));
- }
- n = file_->read32(off);
- if (n > SAL_MAX_INT32) {
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: too many direct properties of"
- " accumulation-based servcie " + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- off += 4;
- std::vector< Property > props;
- for (sal_uInt32 i = 0; i != n; ++i) {
- sal_uInt16 attrs = file_->read16(off);
- off += 2;
- rtl::OUString propName(file_->readNameLen(off, &off));
- rtl::OUString propType(file_->readNameLen(off, &off));
- if (attrs > 0x01FF) { // see css.beans.PropertyAttribute
- throw css::uno::DeploymentException(
- ("broken UNOIDL file: bad mode "
- + rtl::OUString::number(v) + " of property "
- + propName + " for accumulation-based servcie "
- + aName),
- css::uno::Reference< css::uno::XInterface >());
- }
- props.push_back(
- Property(
- propName, propType,
- static_cast< sal_Int32 >(attrs)));
- }
- return css::uno::makeAny<
- css::uno::Reference< css::reflection::XTypeDescription > >(
- new AccumulationBasedServiceDescription(
- context_, aName, published, mandServs, optServs,
- mandIfcs, optIfcs, props));
- }
- case 10: // interface-based singleton
+ context_, aName,
+ static_cast< cppu::unoidl::TypedefEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_CONSTANT_GROUP:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new ConstantGroupDescription(
+ context_, aName,
+ static_cast< cppu::unoidl::ConstantGroupEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new SingleInterfaceBasedServiceDescription(
+ context_, aName,
+ static_cast<
+ cppu::unoidl::SingleInterfaceBasedServiceEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE:
+ return css::uno::makeAny<
+ css::uno::Reference< css::reflection::XTypeDescription > >(
+ new AccumulationBasedServiceDescription(
+ context_, aName,
+ static_cast<
+ cppu::unoidl::AccumulationBasedServiceEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON:
return css::uno::makeAny<
css::uno::Reference< css::reflection::XTypeDescription > >(
new InterfaceBasedSingletonDescription(
- context_, aName, published,
- file_->readNameLen(off + 1)));
- case 11: // service-based singleton
+ context_, aName,
+ static_cast<
+ cppu::unoidl::InterfaceBasedSingletonEntity * >(
+ ent.get())));
+ case cppu::unoidl::Entity::SORT_SERVICE_BASED_SINGLETON:
return css::uno::makeAny<
css::uno::Reference< css::reflection::XTypeDescription > >(
new ServiceBasedSingletonDescription(
- context_, aName, published,
- file_->readNameLen(off + 1)));
+ context_, aName,
+ static_cast<
+ cppu::unoidl::ServiceBasedSingletonEntity * >(
+ ent.get())));
default:
- throw css::uno::DeploymentException(
- "broken UNOIDL file: bad type byte " + rtl::OUString::number(v),
- css::uno::Reference< css::uno::XInterface >());
+ for (;;) { std::abort(); } // this cannot happen
}
}
}
@@ -3033,151 +1847,34 @@ Provider::createTypeDescriptionEnumeration(
css::reflection::InvalidTypeNameException, css::uno::RuntimeException)
{
rtl::OUString prefix;
- MapEntry const * mapBegin;
- sal_uInt32 mapSize;
+ rtl::Reference< cppu::unoidl::MapCursor > cursor;
if (moduleName.isEmpty()) {
- mapBegin = mapBegin_;
- mapSize = mapSize_;
+ cursor = provider_->createRootCursor();
} else {
prefix = moduleName + ".";
bool cnst;
- sal_uInt32 off = find(moduleName, &cnst);
+ sal_uInt32 off = provider_->find(moduleName, &cnst);
if (off == 0) {
throw css::reflection::NoSuchTypeNameException(
moduleName, static_cast< cppu::OWeakObject * >(this));
}
- if (cnst || file_->read8(off) != 0) { // module
+ if (cnst) {
throw css::reflection::InvalidTypeNameException(
moduleName, static_cast< cppu::OWeakObject * >(this));
}
- mapSize = file_->read32(off + 1);
- if (8 * mapSize > file_->size - off - 5) { //TODO: overflow
- throw css::uno::DeploymentException(
- "broken UNOIDL file: map offset + size too large",
- css::uno::Reference< css::uno::XInterface >());
+ rtl::Reference< cppu::unoidl::Entity > ent(provider_->getEntity(off));
+ if (ent->getSort() != cppu::unoidl::Entity::SORT_MODULE) {
+ throw css::reflection::InvalidTypeNameException(
+ moduleName, static_cast< cppu::OWeakObject * >(this));
}
- mapBegin = reinterpret_cast< MapEntry const * >(
- static_cast< char const * >(file_->address) + off + 5);
+ cursor = static_cast< cppu::unoidl::ModuleEntity * >(ent.get())->
+ createCursor();
}
return new Enumeration(
- context_, file_, prefix, mapBegin, mapSize, types,
+ context_, prefix, cursor, types,
depth == css::reflection::TypeDescriptionSearchDepth_INFINITE);
}
-sal_uInt32 Provider::find(rtl::OUString const & name, bool * constant) const {
- MapEntry const * mapBegin = mapBegin_;
- sal_uInt32 mapSize = mapSize_;
- bool cgroup = false;
- for (sal_Int32 i = 0;;) {
- sal_Int32 j = name.indexOf('.', i);
- if (j == -1) {
- j = name.getLength();
- }
- sal_Int32 off = findInMap(name, i, j - i, mapBegin, mapSize);
- if (off == 0) {
- return 0;
- }
- if (j == name.getLength()) {
- if (constant != 0) {
- *constant = cgroup;
- }
- return off;
- }
- if (cgroup) {
- return 0;
- //TODO: throw an exception instead here, where the segments of a
- // constant's name are a prefix of the requested name's
- // segments?
- }
- int v = file_->read8(off);
- if (v != 0) { // module
- if ((v & 0x3F) == 7) { // constant group
- cgroup = true;
- } else {
- return 0;
- //TODO: throw an exception instead here, where the segments
- // of a non-module, non-constant-group entity's name are a
- // prefix of the requested name's segments?
- }
- }
- mapSize = file_->read32(off + 1);
- if (8 * mapSize > file_->size - off - 5) { //TODO: overflow
- throw css::uno::DeploymentException(
- "broken UNOIDL file: map offset + size too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- mapBegin = reinterpret_cast< MapEntry const * >(
- static_cast< char const * >(file_->address) + off + 5);
- i = j + 1;
- }
-}
-
-sal_uInt32 Provider::findInMap(
- rtl::OUString const & name, sal_Int32 nameOffset, sal_Int32 nameLength,
- MapEntry const * mapBegin, sal_uInt32 mapSize) const
-{
- if (mapSize == 0) {
- return 0;
- }
- sal_uInt32 n = mapSize / 2;
- MapEntry const * p = mapBegin + n;
- switch (compare(name, nameOffset, nameLength, p)) {
- case COMPARE_LESS:
- return findInMap(name, nameOffset, nameLength, mapBegin, n);
- case COMPARE_GREATER:
- return findInMap(name, nameOffset, nameLength, p + 1, mapSize - n - 1);
- default: // COMPARE_EQUAL
- break;
- }
- sal_uInt32 off = mapBegin[n].data.getUnsigned32();
- if (off == 0) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: map entry data offset is null",
- css::uno::Reference< css::uno::XInterface >());
- }
- return off;
-}
-
-Provider::Compare Provider::compare(
- rtl::OUString const & name, sal_Int32 nameOffset, sal_Int32 nameLength,
- MapEntry const * entry) const
-{
- assert(entry != 0);
- sal_uInt32 off = entry->name.getUnsigned32();
- if (off > file_->size - 1) { // at least a trailing NUL
- throw css::uno::DeploymentException(
- "broken UNOIDL file: string offset too large",
- css::uno::Reference< css::uno::XInterface >());
- }
- assert(nameLength >= 0);
- sal_uInt64 min = std::min(
- static_cast< sal_uInt64 >(nameLength), file_->size - off);
- for (sal_uInt64 i = 0; i != min; ++i) {
- sal_Unicode c1 = name[nameOffset + i];
- sal_Unicode c2 = static_cast< unsigned char const * >(file_->address)[
- off + i];
- if (c1 < c2) {
- return COMPARE_LESS;
- } else if (c1 > c2 || c2 == 0) {
- // ...the "|| c2 == 0" is for the odd case where name erroneously
- // contains NUL characters
- return COMPARE_GREATER;
- }
- }
- if (static_cast< sal_uInt64 >(nameLength) == min) {
- if (file_->size - off == min) {
- throw css::uno::DeploymentException(
- "broken UNOIDL file: string misses trailing NUL",
- css::uno::Reference< css::uno::XInterface >());
- }
- return
- static_cast< unsigned char const * >(file_->address)[off + min] == 0
- ? COMPARE_EQUAL : COMPARE_LESS;
- } else {
- return COMPARE_GREATER;
- }
-}
-
css::uno::Reference< css::container::XHierarchicalNameAccess >
readLegacyRdbFile(
rtl::OUString const & uri,
diff --git a/cppuhelper/source/unoidl.cxx b/cppuhelper/source/unoidl.cxx
new file mode 100644
index 000000000000..b9109af0416f
--- /dev/null
+++ b/cppuhelper/source/unoidl.cxx
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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/.
+ */
+
+#include "sal/config.h"
+
+#include <vector>
+
+#include "cppuhelper/unoidl.hxx"
+#include "rtl/ref.hxx"
+#include "rtl/ustring.hxx"
+
+#include "unoidlprovider.hxx"
+
+namespace cppu { namespace unoidl {
+
+Entity::~Entity() throw () {}
+
+MapCursor::~MapCursor() throw () {}
+
+ModuleEntity::~ModuleEntity() throw () {}
+
+PublishableEntity::~PublishableEntity() throw () {}
+
+EnumTypeEntity::~EnumTypeEntity() throw () {}
+
+PlainStructTypeEntity::~PlainStructTypeEntity() throw () {}
+
+PolymorphicStructTypeTemplateEntity::~PolymorphicStructTypeTemplateEntity()
+ throw ()
+{}
+
+ExceptionTypeEntity::~ExceptionTypeEntity() throw () {}
+
+InterfaceTypeEntity::~InterfaceTypeEntity() throw () {}
+
+TypedefEntity::~TypedefEntity() throw () {}
+
+ConstantGroupEntity::~ConstantGroupEntity() throw () {}
+
+SingleInterfaceBasedServiceEntity::~SingleInterfaceBasedServiceEntity() throw ()
+{}
+
+AccumulationBasedServiceEntity::~AccumulationBasedServiceEntity() throw () {}
+
+InterfaceBasedSingletonEntity::~InterfaceBasedSingletonEntity() throw () {}
+
+ServiceBasedSingletonEntity::~ServiceBasedSingletonEntity() throw () {}
+
+Provider::~Provider() throw () {}
+
+rtl::Reference< Provider > loadProvider(rtl::OUString const & uri) {
+ return new UnoidlProvider(uri);
+}
+
+} }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppuhelper/source/unoidlprovider.cxx b/cppuhelper/source/unoidlprovider.cxx
new file mode 100644
index 000000000000..12b497490c87
--- /dev/null
+++ b/cppuhelper/source/unoidlprovider.cxx
@@ -0,0 +1,1363 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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/.
+ */
+
+#include "sal/config.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cstring>
+#include <vector>
+
+#include "com/sun/star/container/NoSuchElementException.hpp"
+#include "com/sun/star/registry/InvalidRegistryException.hpp"
+#include "com/sun/star/uno/Any.hxx"
+#include "com/sun/star/uno/DeploymentException.hpp"
+#include "com/sun/star/uno/Reference.hxx"
+#include "com/sun/star/uno/XInterface.hpp"
+#include "cppuhelper/unoidl.hxx"
+#include "osl/endian.h"
+#include "osl/file.h"
+#include "rtl/ref.hxx"
+#include "rtl/ustring.hxx"
+#include "sal/log.hxx"
+#include "sal/types.h"
+#include "salhelper/simplereferenceobject.hxx"
+
+#include "unoidlprovider.hxx"
+
+// New binary format:
+//
+// Uses the following definitions:
+//
+// * UInt16: 2-byte value, LSB first
+// * UInt32: 4-byte value, LSB first
+// * UInt64: 8-byte value, LSB first
+// * Offset: UInt32 value, counting bytes from start of file
+// * NUL-Name: zero or more non-NUL US-ASCII bytes followed by a NUL byte
+// * Len-Name: UInt32 number of characters, with 0x80000000 bit 1, followed by
+// that many (- 0x80000000) US-ASCII bytes
+// * Idx-Name: either an Offset (with 0x80000000 bit 0) of a Len-Name, or a
+// Len-Name
+// * Entry: Offset of NUL-Name followed by Offset of payload
+// * Map: zero or more Entries
+//
+// Layout of per-entry payload in the root or a module Map:
+//
+// * kind byte:
+// ** 0: module
+// *** followed by:
+// **** UInt32 number N1 of entries of Map
+// **** N1 * Entry
+// ** otherwise:
+// *** 0x80 bit: 1 if published
+// *** 0x40 bit: 1 if deprecated
+// *** 0x20 bit: flag (may only be 1 for certain kinds, see below)
+// *** remaining bits:
+// **** 1: enum type
+// ***** followed by:
+// ****** UInt32 number N1 of members
+// ****** N1 * tuple of:
+// ******* Offset of Idx-Name
+// ******* UInt32
+// **** 2: plain struct type (with base if flag is 1)
+// ***** followed by:
+// ****** if "with base": Offset of Idx-Name
+// ****** UInt32 number N1 of direct members
+// ****** N1 * tuple of:
+// ******* Offset of Idx-Name name
+// ******* Offset of Idx-Name type
+// **** 3: polymorphic struct type template
+// ***** followed by:
+// ****** UInt32 number N1 of type parameters
+// ****** N1 * Offset of Idx-Name
+// ****** UInt32 number N2 of members
+// ****** N2 * tuple of:
+// ******* kind byte: 0x01 bit is 1 if parameterized type
+// ******* Offset of Idx-Name name
+// ******* Offset of Idx-Name type
+// **** 4: exception type (with base if flag is 1)
+// ***** followed by:
+// ****** if "with base": Offset of Idx-Name
+// ****** UInt32 number N1 of direct members
+// ****** N1 * tuple of:
+// ******* Offset of Idx-Name name
+// ******* Offset of Idx-Name type
+// **** 5: interface type
+// ***** followed by:
+// ****** UInt32 number N1 of direct mandatory bases
+// ****** N1 * Offset of Idx-Name
+// ****** UInt32 number N2 of direct optional bases
+// ****** N2 * Offset of Idx-Name
+// ****** UInt32 number N3 of direct attributes
+// ****** N3 * tuple of:
+// ******* kind byte:
+// ******** 0x02 bit: 1 if read-only
+// ******** 0x01 bit: 1 if bound
+// ******* Offset of Idx-Name name
+// ******* Offset of Idx-Name type
+// ******* UInt32 number N4 of get exceptions
+// ******* N4 * Offset of Idx-Name
+// ******* UInt32 number N5 of set exceptions
+// ******* N5 * Offset of Idx-Name
+// ****** UInt32 number N6 of direct methods
+// ****** N6 * tuple of:
+// ******* Offset of Idx-Name name
+// ******* Offset of Idx-Name return type
+// ******* UInt32 number N7 of parameters
+// ******* N7 * tuple of:
+// ******** direction byte: 0 for in, 1 for out, 2 for in-out
+// ******** Offset of Idx-Name name
+// ******** Offset of Idx-Name type
+// ******* UInt32 number N8 of exceptions
+// ******* N8 * Offset of Idx-Name
+// **** 6: typedef
+// ***** followed by:
+// ****** Offset of Idx-Name
+// **** 7: constant group
+// ***** followed by:
+// ****** UInt32 number N1 of entries of Map
+// ****** N1 * Entry
+// **** 8: single-interface--based service (with default constructor if flag is
+// 1)
+// ***** followed by:
+// ****** Offset of Idx-Name
+// ****** if not "with default constructor":
+// ******* UInt32 number N1 of constructors
+// ******* N1 * tuple of:
+// ******** Offset of Idx-Name
+// ******** UInt32 number N2 of parameters
+// ******** N2 * tuple of
+// ********* kind byte: 0x04 bit is 1 if rest parameter
+// ********* Offset of Idx-Name name
+// ********* Offset of Idx-Name type
+// ******** UInt32 number N3 of exceptions
+// ******** N3 * Offset of Idx-Name
+// **** 9: accumulation-based service
+// ***** followed by:
+// ****** UInt32 number N1 of direct mandatory base services
+// ****** N1 * Offset of Idx-Name
+// ****** UInt32 number N2 of direct optional base services
+// ****** N2 * Offset of Idx-Name
+// ****** UInt32 number N3 of direct mandatory base interfaces
+// ****** N3 * Offset of Idx-Name
+// ****** UInt32 number N4 of direct optional base interfaces
+// ****** N4 * Offset of Idx-Name
+// ****** UInt32 number N5 of direct properties
+// ****** N5 * tuple of:
+// ******* UInt16 kind:
+// ******** 0x0100 bit: 1 if optional
+// ******** 0x0080 bit: 1 if removable
+// ******** 0x0040 bit: 1 if maybedefault
+// ******** 0x0020 bit: 1 if maybeambiguous
+// ******** 0x0010 bit: 1 if readonly
+// ******** 0x0008 bit: 1 if transient
+// ******** 0x0004 bit: 1 if constrained
+// ******** 0x0002 bit: 1 if bound
+// ******** 0x0001 bit: 1 if maybevoid
+// ******* Offset of Idx-Name name
+// ******* Offset of Idx-Name type
+// **** 10: interface-based singleton
+// ***** followed by:
+// ****** Offset of Idx-Name
+// **** 11: service-based singleton
+// ***** followed by:
+// ****** Offset of Idx-Name
+//
+// Layout of per-entry payload in a constant group Map:
+//
+// * kind byte:
+// ** 0x80 bit: 1 if deprecated
+// ** remaining bits:
+// *** 0: BOOLEAN
+// **** followed by value byte, 0 represents false, 1 represents true
+// *** 1: BYTE
+// **** followed by value byte, representing values with two's complement
+// *** 2: SHORT
+// **** followed by UInt16 value, representing values with two's complement
+// *** 3: UNSIGNED SHORT
+// **** followed by UInt16 value
+// *** 4: LONG
+// **** followed by UInt32 value, representing values with two's complement
+// *** 5: UNSIGNED LONG
+// **** followed by UInt32 value
+// *** 6: HYPER
+// **** followed by UInt64 value, representing values with two's complement
+// *** 7: UNSIGNED HYPER
+// **** followed by UInt64 value
+// *** 8: FLOAT
+// **** followed by 4-byte value, representing values in ISO 60599 binary32
+// format, LSB first
+// *** 9: DOUBLE
+// **** followed by 8-byte value, representing values in ISO 60599 binary64
+// format, LSB first
+//
+// Memory layout:
+//
+// * 8 byte header "UNOIDL\0\xFF
+// * Offset of root Map
+// * UInt32 number of entries of root Map
+// ...
+
+namespace {
+
+// sizeof (Memory16) == 2
+struct Memory16 {
+ unsigned char byte[2];
+
+ sal_uInt16 getUnsigned16() const {
+ return static_cast< sal_uInt16 >(byte[0])
+ | (static_cast< sal_uInt16 >(byte[1]) << 8);
+ }
+};
+
+// sizeof (Memory32) == 4
+struct Memory32 {
+ unsigned char byte[4];
+
+ sal_uInt32 getUnsigned32() const {
+ return static_cast< sal_uInt32 >(byte[0])
+ | (static_cast< sal_uInt32 >(byte[1]) << 8)
+ | (static_cast< sal_uInt32 >(byte[2]) << 16)
+ | (static_cast< sal_uInt32 >(byte[3]) << 24);
+ }
+
+ float getIso60599Binary32() const {
+ union {
+ unsigned char buf[4];
+ float f; // assuming float is ISO 60599 binary32
+ } sa;
+#if defined OSL_LITENDIAN
+ sa.buf[0] = byte[0];
+ sa.buf[1] = byte[1];
+ sa.buf[2] = byte[2];
+ sa.buf[3] = byte[3];
+#else
+ sa.buf[0] = byte[3];
+ sa.buf[1] = byte[2];
+ sa.buf[2] = byte[1];
+ sa.buf[3] = byte[0];
+#endif
+ return sa.f;
+ }
+};
+
+// sizeof (Memory64) == 8
+struct Memory64 {
+ unsigned char byte[8];
+
+ sal_uInt64 getUnsigned64() const {
+ return static_cast< sal_uInt64 >(byte[0])
+ | (static_cast< sal_uInt64 >(byte[1]) << 8)
+ | (static_cast< sal_uInt64 >(byte[2]) << 16)
+ | (static_cast< sal_uInt64 >(byte[3]) << 24)
+ | (static_cast< sal_uInt64 >(byte[4]) << 32)
+ | (static_cast< sal_uInt64 >(byte[5]) << 40)
+ | (static_cast< sal_uInt64 >(byte[6]) << 48)
+ | (static_cast< sal_uInt64 >(byte[7]) << 56);
+ }
+
+ double getIso60599Binary64() const {
+ union {
+ unsigned char buf[8];
+ double d; // assuming double is ISO 60599 binary64
+ } sa;
+#if defined OSL_LITENDIAN
+ sa.buf[0] = byte[0];
+ sa.buf[1] = byte[1];
+ sa.buf[2] = byte[2];
+ sa.buf[3] = byte[3];
+ sa.buf[4] = byte[4];
+ sa.buf[5] = byte[5];
+ sa.buf[6] = byte[6];
+ sa.buf[7] = byte[7];
+#else
+ sa.buf[0] = byte[7];
+ sa.buf[1] = byte[6];
+ sa.buf[2] = byte[5];
+ sa.buf[3] = byte[4];
+ sa.buf[4] = byte[3];
+ sa.buf[5] = byte[2];
+ sa.buf[6] = byte[1];
+ sa.buf[7] = byte[0];
+#endif
+ return sa.d;
+ }
+};
+
+}
+
+namespace cppu {
+
+class MappedFile: public salhelper::SimpleReferenceObject {
+public:
+ explicit MappedFile(rtl::OUString const & fileUrl);
+
+ sal_uInt8 read8(sal_uInt32 offset) const;
+
+ sal_uInt16 read16(sal_uInt32 offset) const;
+
+ sal_uInt32 read32(sal_uInt32 offset) const;
+
+ sal_uInt64 read64(sal_uInt32 offset) const;
+
+ float readIso60599Binary32(sal_uInt32 offset) const;
+
+ double readIso60599Binary64(sal_uInt32 offset) const;
+
+ rtl::OUString readNameNul(sal_uInt32 offset) const;
+
+ rtl::OUString readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset = 0)
+ const;
+
+ oslFileHandle handle;
+ sal_uInt64 size;
+ void * address;
+
+private:
+ virtual ~MappedFile();
+
+ sal_uInt8 get8(sal_uInt32 offset) const;
+
+ sal_uInt16 get16(sal_uInt32 offset) const;
+
+ sal_uInt32 get32(sal_uInt32 offset) const;
+
+ sal_uInt64 get64(sal_uInt32 offset) const;
+
+ float getIso60599Binary32(sal_uInt32 offset) const;
+
+ double getIso60599Binary64(sal_uInt32 offset) const;
+};
+
+MappedFile::MappedFile(rtl::OUString const & fileUrl) {
+ oslFileError e = osl_openFile(
+ fileUrl.pData, &handle, osl_File_OpenFlag_Read);
+ switch (e) {
+ case osl_File_E_None:
+ break;
+ case osl_File_E_NOENT:
+ throw css::container::NoSuchElementException(
+ fileUrl, css::uno::Reference< css::uno::XInterface >());
+ default:
+ throw css::uno::RuntimeException(
+ "cannot open " + fileUrl + ": " + rtl::OUString::number(e),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ e = osl_getFileSize(handle, &size);
+ if (e == osl_File_E_None) {
+ e = osl_mapFile(
+ handle, &address, size, 0, osl_File_MapFlag_RandomAccess);
+ }
+ if (e != osl_File_E_None) {
+ oslFileError e2 = osl_closeFile(handle);
+ SAL_WARN_IF(
+ e2 != osl_File_E_None, "cppuhelper",
+ "cannot close " << fileUrl << ": " << +e2);
+ throw css::uno::RuntimeException(
+ "cannot mmap " + fileUrl + ": " + rtl::OUString::number(e),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+}
+
+sal_uInt8 MappedFile::read8(sal_uInt32 offset) const {
+ assert(size >= 8);
+ if (offset > size - 1) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for 8-bit value too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return get8(offset);
+}
+
+sal_uInt16 MappedFile::read16(sal_uInt32 offset) const {
+ assert(size >= 8);
+ if (offset > size - 2) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for 16-bit value too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return get16(offset);
+}
+
+sal_uInt32 MappedFile::read32(sal_uInt32 offset) const {
+ assert(size >= 8);
+ if (offset > size - 4) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for 32-bit value too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return get32(offset);
+}
+
+sal_uInt64 MappedFile::read64(sal_uInt32 offset) const {
+ assert(size >= 8);
+ if (offset > size - 8) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for 64-bit value too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return get64(offset);
+}
+
+float MappedFile::readIso60599Binary32(sal_uInt32 offset) const {
+ assert(size >= 8);
+ if (offset > size - 4) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for 32-bit value too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return getIso60599Binary32(offset);
+}
+
+double MappedFile::readIso60599Binary64(sal_uInt32 offset) const {
+ assert(size >= 8);
+ if (offset > size - 8) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for 64-bit value too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return getIso60599Binary64(offset);
+}
+
+rtl::OUString MappedFile::readNameNul(sal_uInt32 offset) const {
+ if (offset > size) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: offset for string too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ sal_uInt64 end = offset;
+ for (;; ++end) {
+ if (end == size) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: string misses trailing NUL",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ if (static_cast< char const * >(address)[end] == 0) {
+ break;
+ }
+ }
+ if (end - offset > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: string too long",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ rtl::OUString name;
+ if (!rtl_convertStringToUString(
+ &name.pData, static_cast< char const * >(address) + offset,
+ end - offset, RTL_TEXTENCODING_ASCII_US,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
+ {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: name is not ASCII",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return name;
+}
+
+rtl::OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset)
+ const
+{
+ sal_uInt32 len = read32(offset);
+ if ((len & 0x80000000) == 0) {
+ if (newOffset != 0) {
+ *newOffset = offset + 4;
+ }
+ offset = len;
+ len = read32(offset);
+ if ((len & 0x80000000) == 0) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: name length high bit unset",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ len &= ~0x80000000;
+ } else {
+ len &= ~0x80000000;
+ if (newOffset != 0) {
+ *newOffset = offset + 4 + len;
+ }
+ }
+ if (len > SAL_MAX_INT32 || len > size - offset - 4) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: size of name is too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ rtl::OUString name;
+ if (!rtl_convertStringToUString(
+ &name.pData, static_cast< char const * >(address) + offset + 4, len,
+ RTL_TEXTENCODING_ASCII_US,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
+ {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: name is not ASCII",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return name;
+}
+
+MappedFile::~MappedFile() {
+ oslFileError e = osl_unmapMappedFile(handle, address, size);
+ SAL_WARN_IF(e != osl_File_E_None, "cppuhelper", "cannot unmap: " << +e);
+ e = osl_closeFile(handle);
+ SAL_WARN_IF(e != osl_File_E_None, "cppuhelper", "cannot close: " << +e);
+}
+
+sal_uInt8 MappedFile::get8(sal_uInt32 offset) const {
+ assert(size >= 8);
+ assert(offset <= size - 1);
+ return static_cast< char const * >(address)[offset];
+}
+
+sal_uInt16 MappedFile::get16(sal_uInt32 offset) const {
+ assert(size >= 8);
+ assert(offset <= size - 2);
+ return reinterpret_cast< Memory16 const * >(
+ static_cast< char const * >(address) + offset)->getUnsigned16();
+}
+
+sal_uInt32 MappedFile::get32(sal_uInt32 offset) const {
+ assert(size >= 8);
+ assert(offset <= size - 4);
+ return reinterpret_cast< Memory32 const * >(
+ static_cast< char const * >(address) + offset)->getUnsigned32();
+}
+
+sal_uInt64 MappedFile::get64(sal_uInt32 offset) const {
+ assert(size >= 8);
+ assert(offset <= size - 8);
+ return reinterpret_cast< Memory64 const * >(
+ static_cast< char const * >(address) + offset)->getUnsigned64();
+}
+
+float MappedFile::getIso60599Binary32(sal_uInt32 offset) const {
+ assert(size >= 8);
+ assert(offset <= size - 4);
+ return reinterpret_cast< Memory32 const * >(
+ static_cast< char const * >(address) + offset)->getIso60599Binary32();
+}
+
+double MappedFile::getIso60599Binary64(sal_uInt32 offset) const {
+ assert(size >= 8);
+ assert(offset <= size - 8);
+ return reinterpret_cast< Memory64 const * >(
+ static_cast< char const * >(address) + offset)->getIso60599Binary64();
+}
+
+// sizeof (MapEntry) == 8
+struct MapEntry {
+ Memory32 name;
+ Memory32 data;
+};
+
+namespace {
+
+enum Compare { COMPARE_LESS, COMPARE_GREATER, COMPARE_EQUAL };
+
+Compare compare(
+ rtl::Reference< MappedFile > const & file, rtl::OUString const & name,
+ sal_Int32 nameOffset, sal_Int32 nameLength, MapEntry const * entry)
+{
+ assert(file.is());
+ assert(entry != 0);
+ sal_uInt32 off = entry->name.getUnsigned32();
+ if (off > file->size - 1) { // at least a trailing NUL
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: string offset too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ assert(nameLength >= 0);
+ sal_uInt64 min = std::min(
+ static_cast< sal_uInt64 >(nameLength), file->size - off);
+ for (sal_uInt64 i = 0; i != min; ++i) {
+ sal_Unicode c1 = name[nameOffset + i];
+ sal_Unicode c2 = static_cast< unsigned char const * >(file->address)[
+ off + i];
+ if (c1 < c2) {
+ return COMPARE_LESS;
+ } else if (c1 > c2 || c2 == 0) {
+ // ...the "|| c2 == 0" is for the odd case where name erroneously
+ // contains NUL characters
+ return COMPARE_GREATER;
+ }
+ }
+ if (static_cast< sal_uInt64 >(nameLength) == min) {
+ if (file->size - off == min) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: string misses trailing NUL",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return
+ static_cast< unsigned char const * >(file->address)[off + min] == 0
+ ? COMPARE_EQUAL : COMPARE_LESS;
+ } else {
+ return COMPARE_GREATER;
+ }
+}
+
+sal_uInt32 findInMap(
+ rtl::Reference< MappedFile > const & file, MapEntry const * mapBegin,
+ sal_uInt32 mapSize, rtl::OUString const & name, sal_Int32 nameOffset,
+ sal_Int32 nameLength)
+{
+ if (mapSize == 0) {
+ return 0;
+ }
+ sal_uInt32 n = mapSize / 2;
+ MapEntry const * p = mapBegin + n;
+ switch (compare(file, name, nameOffset, nameLength, p)) {
+ case COMPARE_LESS:
+ return findInMap(file, mapBegin, n, name, nameOffset, nameLength);
+ case COMPARE_GREATER:
+ return findInMap(
+ file, p + 1, mapSize - n - 1, name, nameOffset, nameLength);
+ default: // COMPARE_EQUAL
+ break;
+ }
+ sal_uInt32 off = mapBegin[n].data.getUnsigned32();
+ if (off == 0) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: map entry data offset is null",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return off;
+}
+
+css::uno::Any readConstant(
+ rtl::Reference< MappedFile > const & file, sal_uInt32 offset)
+{
+ assert(file.is());
+ int v = file->read8(offset);
+ int type = v & 0x7F;
+ bool deprecated = (v & 0x80) != 0; (void)deprecated;//TODO
+ switch (type) {
+ case 0: // BOOLEAN
+ v = file->read8(offset + 1);
+ switch (v) {
+ case 0:
+ return css::uno::makeAny(false);
+ case 1:
+ return css::uno::makeAny(true);
+ default:
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad boolean constant value "
+ + rtl::OUString::number(v)),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ break;
+ case 1: // BYTE
+ return css::uno::makeAny< sal_Int8 >(file->read8(offset + 1));
+ //TODO: implementation-defined behavior of conversion from sal_uInt8
+ // to sal_Int8 relies on two's complement representation
+ case 2: // SHORT
+ return css::uno::makeAny< sal_Int16 >(file->read16(offset + 1));
+ //TODO: implementation-defined behavior of conversion from
+ // sal_uInt16 to sal_Int16 relies on two's complement representation
+ case 3: // UNSIGNED SHORT
+ return css::uno::makeAny(file->read16(offset + 1));
+ case 4: // LONG
+ return css::uno::makeAny< sal_Int32 >(file->read32(offset + 1));
+ //TODO: implementation-defined behavior of conversion from
+ // sal_uInt32 to sal_Int32 relies on two's complement representation
+ case 5: // UNSIGNED LONG
+ return css::uno::makeAny(file->read32(offset + 1));
+ case 6: // HYPER
+ return css::uno::makeAny< sal_Int64 >(file->read64(offset + 1));
+ //TODO: implementation-defined behavior of conversion from
+ // sal_uInt64 to sal_Int64 relies on two's complement representation
+ case 7: // UNSIGNED HYPER
+ return css::uno::makeAny(file->read64(offset + 1));
+ case 8: // FLOAT
+ return css::uno::makeAny(file->readIso60599Binary32(offset + 1));
+ case 9: // DOUBLE
+ return css::uno::makeAny(file->readIso60599Binary64(offset + 1));
+ default:
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad constant type byte "
+ + rtl::OUString::number(v)),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+}
+
+rtl::Reference< unoidl::Entity > readEntity(
+ rtl::Reference< MappedFile > const & file, sal_uInt32 offset);
+
+class UnoidlCursor: public unoidl::MapCursor {
+public:
+ UnoidlCursor(
+ rtl::Reference< MappedFile > file, MapEntry const * mapBegin,
+ sal_uInt32 mapSize):
+ file_(file), mapIndex_(mapBegin), mapEnd_(mapBegin + mapSize)
+ {}
+
+private:
+ virtual ~UnoidlCursor() throw () {}
+
+ virtual rtl::Reference< unoidl::Entity > getNext(rtl::OUString * name);
+
+ rtl::Reference< MappedFile > file_;
+ MapEntry const * mapIndex_;
+ MapEntry const * mapEnd_;
+};
+
+rtl::Reference< unoidl::Entity > UnoidlCursor::getNext(rtl::OUString * name) {
+ assert(name != 0);
+ rtl::Reference< unoidl::Entity > ent;
+ if (mapIndex_ != mapEnd_) {
+ *name = file_->readNameNul(mapIndex_->name.getUnsigned32());
+ ent = readEntity(file_, mapIndex_->data.getUnsigned32());
+ ++mapIndex_;
+ }
+ return ent;
+}
+
+class UnoidlModuleEntity: public unoidl::ModuleEntity {
+public:
+ UnoidlModuleEntity(
+ rtl::Reference< MappedFile > const & file, sal_uInt32 mapOffset,
+ sal_uInt32 mapSize):
+ file_(file),
+ mapBegin_(
+ reinterpret_cast< MapEntry const * >(
+ static_cast< char const * >(file_->address) + mapOffset)),
+ mapSize_(mapSize)
+ { assert(file.is()); }
+
+private:
+ virtual ~UnoidlModuleEntity() throw () {}
+
+ virtual std::vector< rtl::OUString > getMemberNames() const;
+
+ virtual rtl::Reference< unoidl::MapCursor > createCursor() const
+ { return new UnoidlCursor(file_, mapBegin_, mapSize_); }
+
+ rtl::Reference< MappedFile > file_;
+ MapEntry const * mapBegin_;
+ sal_uInt32 mapSize_;
+};
+
+std::vector< rtl::OUString > UnoidlModuleEntity::getMemberNames() const {
+ std::vector< rtl::OUString > names;
+ for (sal_uInt32 i = 0; i != mapSize_; ++i) {
+ names.push_back(file_->readNameNul(mapBegin_[i].name.getUnsigned32()));
+ }
+ return names;
+}
+
+rtl::Reference< unoidl::Entity > readEntity(
+ rtl::Reference< MappedFile > const & file, sal_uInt32 offset)
+{
+ assert(file.is());
+ int v = file->read8(offset);
+ int type = v & 0x3F;
+ bool published = (v & 0x80) != 0;
+ bool deprecated = (v & 0x40) != 0; (void)deprecated;//TODO
+ bool flag = (v & 0x20) != 0;
+ switch (type) {
+ case 0: // module
+ {
+ if (v != 0) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad module type byte "
+ + rtl::OUString::number(v)),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ sal_uInt32 n = file->read32(offset + 1);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: too many items in module",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ if (offset + 5 + 8 * n > file->size) { //TODO: overflow
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: module map offset + size too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ return new UnoidlModuleEntity(file, offset + 5, n);
+ }
+ case 1: // enum type
+ {
+ sal_uInt32 n = file->read32(offset + 1);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: too many members of enum type",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 5;
+ std::vector< unoidl::EnumTypeEntity::Member > mems;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ rtl::OUString memName(file->readNameLen(offset, &offset));
+ sal_Int32 memValue = static_cast< sal_Int32 >(
+ file->read32(offset));
+ //TODO: implementation-defined behavior of conversion from
+ // sal_uInt32 to sal_Int32 relies on two's complement
+ // representation
+ offset += 4;
+ mems.push_back(
+ unoidl::EnumTypeEntity::Member(memName, memValue));
+ }
+ return new unoidl::EnumTypeEntity(published, mems);
+ }
+ case 2: // plain struct type without base
+ case 2 | 0x20: // plain struct type with base
+ {
+ ++offset;
+ rtl::OUString base;
+ if (flag) {
+ base = file->readNameLen(offset, &offset);
+ if (base.isEmpty()) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: empty base type name of plain"
+ " struct type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ }
+ sal_uInt32 n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct members of plain"
+ " struct type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::PlainStructTypeEntity::Member > mems;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ rtl::OUString memName(file->readNameLen(offset, &offset));
+ rtl::OUString memType(file->readNameLen(offset, &offset));
+ mems.push_back(
+ unoidl::PlainStructTypeEntity::Member(memName, memType));
+ }
+ return new unoidl::PlainStructTypeEntity(published, base, mems);
+ }
+ case 3: // polymorphic struct type template
+ {
+ sal_uInt32 n = file->read32(offset + 1);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many type parameters of"
+ " polymorphic struct type template"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 5;
+ std::vector< rtl::OUString > params;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ params.push_back(file->readNameLen(offset, &offset));
+ }
+ n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many members of polymorphic"
+ " struct type template"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::PolymorphicStructTypeTemplateEntity::Member >
+ mems;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ v = file->read8(offset);
+ ++offset;
+ rtl::OUString memName(file->readNameLen(offset, &offset));
+ rtl::OUString memType(file->readNameLen(offset, &offset));
+ if (v > 1) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad flags "
+ + rtl::OUString::number(v) + " for member " + memName
+ + " of polymorphic struct type template"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ mems.push_back(
+ unoidl::PolymorphicStructTypeTemplateEntity::Member(
+ memName, memType, v == 1));
+ }
+ return new unoidl::PolymorphicStructTypeTemplateEntity(
+ published, params, mems);
+ }
+ case 4: // exception type without base
+ case 4 | 0x20: // exception type with base
+ {
+ ++offset;
+ rtl::OUString base;
+ if (flag) {
+ base = file->readNameLen(offset, &offset);
+ if (base.isEmpty()) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: empty base type name of"
+ " exception type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ }
+ sal_uInt32 n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct members of"
+ " exception type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::ExceptionTypeEntity::Member > mems;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ rtl::OUString memName(file->readNameLen(offset, &offset));
+ rtl::OUString memType(file->readNameLen(offset, &offset));
+ mems.push_back(
+ unoidl::ExceptionTypeEntity::Member(memName, memType));
+ }
+ return new unoidl::ExceptionTypeEntity(published, base, mems);
+ }
+ case 5: // interface type
+ {
+ sal_uInt32 n = file->read32(offset + 1);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct mandatory bases of"
+ " interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 5;
+ std::vector< rtl::OUString > mandBases;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ mandBases.push_back(file->readNameLen(offset, &offset));
+ }
+ n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct optional bases of"
+ " interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< rtl::OUString > optBases;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ optBases.push_back(file->readNameLen(offset, &offset));
+ }
+ sal_uInt32 nAttrs = file->read32(offset);
+ if (nAttrs > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct attributes of"
+ " interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::InterfaceTypeEntity::Attribute > attrs;
+ for (sal_uInt32 i = 0; i != nAttrs; ++i) {
+ v = file->read8(offset);
+ ++offset;
+ rtl::OUString attrName(file->readNameLen(offset, &offset));
+ rtl::OUString attrType(file->readNameLen(offset, &offset));
+ if (v > 0x03) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad flags for direct attribute "
+ + attrName + " of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ std::vector< rtl::OUString > getExcs;
+ sal_uInt32 m = file->read32(offset);
+ if (m > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many getter exceptions for"
+ " direct attribute " + attrName
+ + " of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ for (sal_uInt32 j = 0; j != m; ++j) {
+ getExcs.push_back(file->readNameLen(offset, &offset));
+ }
+ std::vector< rtl::OUString > setExcs;
+ if ((v & 0x02) == 0) {
+ m = file->read32(offset);
+ if (m > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many setter exceptions"
+ " for direct attribute " + attrName
+ + " of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ for (sal_uInt32 j = 0; j != m; ++j) {
+ setExcs.push_back(file->readNameLen(offset, &offset));
+ }
+ }
+ attrs.push_back(
+ unoidl::InterfaceTypeEntity::Attribute(
+ attrName, attrType, (v & 0x01) != 0, (v & 0x02) != 0,
+ getExcs, setExcs));
+ }
+ sal_uInt32 nMeths = file->read32(offset);
+ if (nMeths > SAL_MAX_INT32 - nAttrs) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct attributes and"
+ " methods of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::InterfaceTypeEntity::Method > meths;
+ for (sal_uInt32 i = 0; i != nMeths; ++i) {
+ rtl::OUString methName(file->readNameLen(offset, &offset));
+ rtl::OUString methType(file->readNameLen(offset, &offset));
+ sal_uInt32 m = file->read32(offset);
+ if (m > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many parameters for method "
+ + methName + " of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::InterfaceTypeEntity::Method::Parameter >
+ params;
+ for (sal_uInt32 j = 0; j != m; ++j) {
+ v = file->read8(offset);
+ ++offset;
+ rtl::OUString paramName(
+ file->readNameLen(offset, &offset));
+ rtl::OUString paramType(
+ file->readNameLen(offset, &offset));
+ unoidl::InterfaceTypeEntity::Method::Parameter::Direction
+ dir;
+ switch (v) {
+ case 0:
+ dir = unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_IN;
+ break;
+ case 1:
+ dir = unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_OUT;
+ break;
+ case 2:
+ dir = unoidl::InterfaceTypeEntity::Method::Parameter::
+ DIRECTION_IN_OUT;
+ break;
+ default:
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad direction "
+ + rtl::OUString::number(v) + " of parameter "
+ + paramName + " for method " + methName
+ + " of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ params.push_back(
+ unoidl::InterfaceTypeEntity::Method::Parameter(
+ paramName, paramType, dir));
+ }
+ std::vector< rtl::OUString > excs;
+ m = file->read32(offset);
+ if (m > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many exceptions for method "
+ + methName + " of interface type"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ for (sal_uInt32 j = 0; j != m; ++j) {
+ excs.push_back(file->readNameLen(offset, &offset));
+ }
+ meths.push_back(
+ unoidl::InterfaceTypeEntity::Method(
+ methName, methType, params, excs));
+ }
+ return new unoidl::InterfaceTypeEntity(
+ published, mandBases, optBases, attrs, meths);
+ }
+ case 6: // typedef
+ return new unoidl::TypedefEntity(
+ published, file->readNameLen(offset + 1));
+ case 7: // constant group
+ {
+ sal_uInt32 n = file->read32(offset + 1);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: too many constants in constant group",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ if (offset + 5 + 8 * n > file->size) { //TODO: overflow
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: constant group map offset + size too"
+ " large"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ MapEntry const * p = reinterpret_cast< MapEntry const * >(
+ static_cast< char const * >(file->address) + offset + 5);
+ std::vector< unoidl::ConstantGroupEntity::Member > mems;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ mems.push_back(
+ unoidl::ConstantGroupEntity::Member(
+ file->readNameNul(p[i].name.getUnsigned32()),
+ readConstant(file, p[i].data.getUnsigned32())));
+ }
+ return new unoidl::ConstantGroupEntity(published, mems);
+ }
+ case 8: // single-interface--based service without default constructor
+ case 8 | 0x20: // single-interface--based service with default constructor
+ {
+ rtl::OUString base(file->readNameLen(offset + 1, &offset));
+ std::vector<
+ unoidl::SingleInterfaceBasedServiceEntity::Constructor >
+ ctors;
+ if (flag) {
+ ctors.push_back(
+ unoidl::SingleInterfaceBasedServiceEntity::Constructor());
+ } else {
+ sal_uInt32 n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many constructors of"
+ " single-interface--based service"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ rtl::OUString ctorName(file->readNameLen(offset, &offset));
+ sal_uInt32 m = file->read32(offset);
+ if (m > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many parameters for"
+ " constructor " + ctorName
+ + " of single-interface--based service"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector<
+ unoidl::SingleInterfaceBasedServiceEntity::Constructor::
+ Parameter > params;
+ for (sal_uInt32 j = 0; j != m; ++j) {
+ v = file->read8(offset);
+ ++offset;
+ rtl::OUString paramName(
+ file->readNameLen(offset, &offset));
+ rtl::OUString paramType(
+ file->readNameLen(offset, &offset));
+ bool rest;
+ switch (v) {
+ case 0:
+ rest = false;
+ break;
+ case 0x04:
+ rest = true;
+ break;
+ default:
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad mode "
+ + rtl::OUString::number(v) + " of parameter "
+ + paramName + " for constructor " + ctorName
+ + " of single-interface--based service"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ params.push_back(
+ unoidl::SingleInterfaceBasedServiceEntity::
+ Constructor::Parameter(
+ paramName, paramType, rest));
+ }
+ std::vector< rtl::OUString > excs;
+ m = file->read32(offset);
+ if (m > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many exceptions for"
+ " constructor " + ctorName
+ + " of single-interface--based service"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ for (sal_uInt32 j = 0; j != m; ++j) {
+ excs.push_back(file->readNameLen(offset, &offset));
+ }
+ ctors.push_back(
+ unoidl::SingleInterfaceBasedServiceEntity::Constructor(
+ ctorName, params, excs));
+ }
+ }
+ return new unoidl::SingleInterfaceBasedServiceEntity(
+ published, base, ctors);
+ }
+ case 9: // accumulation-based service
+ {
+ sal_uInt32 n = file->read32(offset + 1);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct mandatory service"
+ " bases of accumulation-based service"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 5;
+ std::vector< rtl::OUString > mandServs;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ mandServs.push_back(file->readNameLen(offset, &offset));
+ }
+ n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct optional service"
+ " bases of accumulation-based servcie"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< rtl::OUString > optServs;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ optServs.push_back(file->readNameLen(offset, &offset));
+ }
+ n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct mandatory interface"
+ " bases of accumulation-based servcie"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< rtl::OUString > mandIfcs;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ mandIfcs.push_back(file->readNameLen(offset, &offset));
+ }
+ n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct optional interface"
+ " bases of accumulation-based servcie"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< rtl::OUString > optIfcs;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ optIfcs.push_back(file->readNameLen(offset, &offset));
+ }
+ n = file->read32(offset);
+ if (n > SAL_MAX_INT32) {
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: too many direct properties of"
+ " accumulation-based servcie"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ offset += 4;
+ std::vector< unoidl::AccumulationBasedServiceEntity::Property >
+ props;
+ for (sal_uInt32 i = 0; i != n; ++i) {
+ sal_uInt16 attrs = file->read16(offset);
+ offset += 2;
+ rtl::OUString propName(file->readNameLen(offset, &offset));
+ rtl::OUString propType(file->readNameLen(offset, &offset));
+ if (attrs > 0x01FF) { // see css.beans.PropertyAttribute
+ throw css::uno::DeploymentException(
+ ("broken UNOIDL file: bad mode "
+ + rtl::OUString::number(v) + " of property " + propName
+ + " for accumulation-based servcie"),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ props.push_back(
+ unoidl::AccumulationBasedServiceEntity::Property(
+ propName, propType,
+ static_cast<
+ unoidl::AccumulationBasedServiceEntity::Property::
+ Attributes >(
+ attrs)));
+ }
+ return new unoidl::AccumulationBasedServiceEntity(
+ published, mandServs, optServs, mandIfcs, optIfcs, props);
+ }
+ case 10: // interface-based singleton
+ return new unoidl::InterfaceBasedSingletonEntity(
+ published, file->readNameLen(offset + 1));
+ case 11: // service-based singleton
+ return new unoidl::ServiceBasedSingletonEntity(
+ published, file->readNameLen(offset + 1));
+ default:
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: bad type byte " + rtl::OUString::number(v),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+}
+
+}
+
+UnoidlProvider::UnoidlProvider(rtl::OUString const & uri):
+ file_(new MappedFile(uri))
+{
+ if (file_->size < 8 || std::memcmp(file_->address, "UNOIDL\0\xFF", 8) != 0)
+ {
+ throw css::registry::InvalidRegistryException(
+ uri, css::uno::Reference< css::uno::XInterface >());
+ }
+ sal_uInt32 off = file_->read32(8);
+ mapSize_ = file_->read32(12);
+ if (off + 8 * mapSize_ > file_->size) { //TODO: overflow
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: root map offset + size too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ mapBegin_ = reinterpret_cast< MapEntry const * >(
+ static_cast< char const * >(file_->address) + off);
+}
+
+rtl::Reference< unoidl::MapCursor > UnoidlProvider::createRootCursor() const {
+ return new UnoidlCursor(file_, mapBegin_, mapSize_);
+}
+
+sal_uInt32 UnoidlProvider::find(rtl::OUString const & name, bool * constant)
+ const
+{
+ MapEntry const * mapBegin = mapBegin_;
+ sal_uInt32 mapSize = mapSize_;
+ bool cgroup = false;
+ for (sal_Int32 i = 0;;) {
+ sal_Int32 j = name.indexOf('.', i);
+ if (j == -1) {
+ j = name.getLength();
+ }
+ sal_Int32 off = findInMap(file_, mapBegin, mapSize, name, i, j - i);
+ if (off == 0) {
+ return 0;
+ }
+ if (j == name.getLength()) {
+ if (constant != 0) {
+ *constant = cgroup;
+ }
+ return off;
+ }
+ if (cgroup) {
+ return 0;
+ //TODO: throw an exception instead here, where the segments of a
+ // constant's name are a prefix of the requested name's
+ // segments?
+ }
+ int v = file_->read8(off);
+ if (v != 0) { // module
+ if ((v & 0x3F) == 7) { // constant group
+ cgroup = true;
+ } else {
+ return 0;
+ //TODO: throw an exception instead here, where the segments
+ // of a non-module, non-constant-group entity's name are a
+ // prefix of the requested name's segments?
+ }
+ }
+ mapSize = file_->read32(off + 1);
+ if (8 * mapSize > file_->size - off - 5) { //TODO: overflow
+ throw css::uno::DeploymentException(
+ "broken UNOIDL file: map offset + size too large",
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ mapBegin = reinterpret_cast< MapEntry const * >(
+ static_cast< char const * >(file_->address) + off + 5);
+ i = j + 1;
+ }
+}
+
+rtl::Reference< unoidl::Entity > UnoidlProvider::getEntity(sal_uInt32 offset)
+ const
+{
+ return readEntity(file_, offset);
+}
+
+css::uno::Any UnoidlProvider::getConstant(sal_uInt32 offset) const {
+ return readConstant(file_, offset);
+}
+
+UnoidlProvider::~UnoidlProvider() throw () {}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppuhelper/source/unoidlprovider.hxx b/cppuhelper/source/unoidlprovider.hxx
new file mode 100644
index 000000000000..45089b9d688b
--- /dev/null
+++ b/cppuhelper/source/unoidlprovider.hxx
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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/.
+ */
+
+#ifndef INCLUDED_CPPUHELPER_SOURCE_UNOIDLPROVIDER_HXX
+#define INCLUDED_CPPUHELPER_SOURCE_UNOIDLPROVIDER_HXX
+
+#include "sal/config.h"
+
+#include "cppuhelper/unoidl.hxx"
+#include "rtl/ref.hxx"
+#include "sal/types.h"
+
+namespace com { namespace sun { namespace star { namespace uno {
+ class Any;
+} } } }
+namespace cppu {
+ class MappedFile;
+ struct MapEntry;
+}
+namespace rtl { class OUString; }
+
+namespace cppu {
+
+class UnoidlProvider: public unoidl::Provider {
+public:
+ explicit UnoidlProvider(rtl::OUString const & uri);
+
+ virtual rtl::Reference< unoidl::MapCursor > createRootCursor() const;
+
+ sal_uInt32 find(rtl::OUString const & name, bool * constant = 0) const;
+
+ rtl::Reference< unoidl::Entity > getEntity(sal_uInt32 offset) const;
+
+ css::uno::Any getConstant(sal_uInt32 offset) const;
+
+private:
+ virtual ~UnoidlProvider() throw ();
+
+ rtl::Reference< MappedFile > file_;
+ MapEntry const * mapBegin_;
+ sal_uInt32 mapSize_;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */