diff --git a/Module_cross_toolset.mk b/Module_cross_toolset.mk index fb475725bb47..e805979e2ef1 100644 --- a/Module_cross_toolset.mk +++ b/Module_cross_toolset.mk @@ -69,6 +69,7 @@ $(eval $(call gb_Module_add_moduledirs,cross_toolset,\ ucbhelper \ udkapi \ udm \ + unoidl \ unoil \ unotest \ unotools \ diff --git a/Module_tail_build.mk b/Module_tail_build.mk index f71a330ad246..eed19e672caf 100644 --- a/Module_tail_build.mk +++ b/Module_tail_build.mk @@ -205,6 +205,7 @@ $(eval $(call gb_Module_add_moduledirs,tail_build,\ UnoControls \ unodevtools \ unoil \ + unoidl \ unotest \ unotools \ unoxml \ diff --git a/Repository.mk b/Repository.mk index 5c1ca3737a0b..c2c0257fb234 100644 --- a/Repository.mk +++ b/Repository.mk @@ -443,6 +443,7 @@ $(eval $(call gb_Helper_register_libraries,PLAINLIBS_URE, \ sal_textenc \ sunjavaplugin \ sunpro5_uno \ + unoidl \ unsafe_uno \ xmlreader \ )) diff --git a/RepositoryModule_ooo.mk b/RepositoryModule_ooo.mk index 236c60a3a5e7..a2fefe78f24f 100644 --- a/RepositoryModule_ooo.mk +++ b/RepositoryModule_ooo.mk @@ -212,6 +212,7 @@ $(eval $(call gb_Module_add_moduledirs,ooo,\ UnoControls \ unodevtools \ unoil \ + unoidl \ unotest \ unotools \ unoxml \ diff --git a/cppuhelper/Library_cppuhelper.mk b/cppuhelper/Library_cppuhelper.mk index 2b849a109ac8..577efbcf942d 100644 --- a/cppuhelper/Library_cppuhelper.mk +++ b/cppuhelper/Library_cppuhelper.mk @@ -45,6 +45,7 @@ $(eval $(call gb_Library_use_libraries,cppuhelper,\ reg \ sal \ salhelper \ + unoidl \ xmlreader \ $(gb_UWINAPI) \ )) @@ -76,8 +77,6 @@ $(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 420eecf2fc47..af5a823c1d49 100644 --- a/cppuhelper/Package_inc.mk +++ b/cppuhelper/Package_inc.mk @@ -77,7 +77,6 @@ $(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/prj/build.lst b/cppuhelper/prj/build.lst index f39e1a458b9c..02d54ffdc36c 100644 --- a/cppuhelper/prj/build.lst +++ b/cppuhelper/prj/build.lst @@ -1,2 +1,2 @@ -ch cppuhelper : BOOST:boost LIBXSLT:libxslt DESKTOP:codemaker cppu offapi registry salhelper xmlreader NULL +ch cppuhelper : BOOST:boost LIBXSLT:libxslt DESKTOP:codemaker cppu offapi registry salhelper unoidl xmlreader NULL ch cppuhelper\prj nmake - all ch_prj NULL diff --git a/cppuhelper/source/typedescriptionprovider.cxx b/cppuhelper/source/typedescriptionprovider.cxx index bf77491ea991..7dbe5e590b88 100644 --- a/cppuhelper/source/typedescriptionprovider.cxx +++ b/cppuhelper/source/typedescriptionprovider.cxx @@ -49,16 +49,16 @@ #include "com/sun/star/uno/XInterface.hpp" #include "cppuhelper/compbase2.hxx" #include "cppuhelper/implbase1.hxx" -#include "cppuhelper/unoidl.hxx" #include "osl/file.hxx" #include "osl/mutex.hxx" #include "rtl/ref.hxx" #include "rtl/ustring.hxx" #include "sal/types.h" +#include "unoidl/unoidl.hxx" +#include "unoidl/unoidlprovider.hxx" #include "paths.hxx" #include "typedescriptionprovider.hxx" -#include "unoidlprovider.hxx" namespace { @@ -108,7 +108,7 @@ public: ModuleDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::ModuleEntity > const & entity): + rtl::Reference< unoidl::ModuleEntity > const & entity): context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -129,20 +129,26 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::ModuleEntity > entity_; + rtl::Reference< unoidl::ModuleEntity > entity_; }; css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > > ModuleDescription::getMembers() throw (css::uno::RuntimeException) { - 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_ + "." + names[i]); + try { + 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_ + "." + names[i]); + } + return s; + } catch (unoidl::FileFormatException & e) { + throw css::uno::DeploymentException( + e.getUri() + ": " + e.getDetail(), + static_cast< cppu::OWeakObject * >(this)); } - return s; } typedef cppu::ImplInheritanceHelper1< @@ -153,7 +159,7 @@ class EnumTypeDescription: public EnumTypeDescription_Base { public: EnumTypeDescription( rtl::OUString const & name, - rtl::Reference< cppu::unoidl::EnumTypeEntity > const & entity): + rtl::Reference< unoidl::EnumTypeEntity > const & entity): EnumTypeDescription_Base(entity->isPublished()), name_(name), entity_(entity) { assert(entity.is()); } @@ -179,7 +185,7 @@ private: throw (css::uno::RuntimeException); rtl::OUString name_; - rtl::Reference< cppu::unoidl::EnumTypeEntity > entity_; + rtl::Reference< unoidl::EnumTypeEntity > entity_; }; css::uno::Sequence< rtl::OUString > EnumTypeDescription::getEnumNames() @@ -215,7 +221,7 @@ public: PlainStructTypeDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::PlainStructTypeEntity > const & entity): + rtl::Reference< unoidl::PlainStructTypeEntity > const & entity): PlainStructTypeDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -259,7 +265,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::PlainStructTypeEntity > entity_; + rtl::Reference< unoidl::PlainStructTypeEntity > entity_; }; css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > > @@ -321,8 +327,8 @@ public: PolymorphicStructTypeTemplateDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::PolymorphicStructTypeTemplateEntity > - const & entity): + rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > const & + entity): PolymorphicStructTypeTemplateDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -362,7 +368,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::PolymorphicStructTypeTemplateEntity > entity_; + rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > entity_; }; css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > > @@ -417,7 +423,7 @@ public: ExceptionTypeDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::ExceptionTypeEntity > const & entity): + rtl::Reference< unoidl::ExceptionTypeEntity > const & entity): ExceptionTypeDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -449,7 +455,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::ExceptionTypeEntity > entity_; + rtl::Reference< unoidl::ExceptionTypeEntity > entity_; }; css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > > @@ -551,7 +557,7 @@ public: AttributeDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - cppu::unoidl::InterfaceTypeEntity::Attribute const & attribute, + unoidl::InterfaceTypeEntity::Attribute const & attribute, sal_Int32 position): context_(context), name_(name), attribute_(attribute), position_(position) @@ -596,7 +602,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - cppu::unoidl::InterfaceTypeEntity::Attribute attribute_; + unoidl::InterfaceTypeEntity::Attribute attribute_; sal_Int32 position_; }; @@ -637,7 +643,7 @@ class MethodParameter: public: MethodParameter( css::uno::Reference< css::uno::XComponentContext > const & context, - cppu::unoidl::InterfaceTypeEntity::Method::Parameter const & parameter, + unoidl::InterfaceTypeEntity::Method::Parameter const & parameter, sal_Int32 position): context_(context), parameter_(parameter), position_(position) {} @@ -655,20 +661,18 @@ private: virtual sal_Bool SAL_CALL isIn() throw (css::uno::RuntimeException) { return (parameter_.direction - == cppu::unoidl::InterfaceTypeEntity::Method::Parameter:: - DIRECTION_IN) + == unoidl::InterfaceTypeEntity::Method::Parameter::DIRECTION_IN) || (parameter_.direction - == cppu::unoidl::InterfaceTypeEntity::Method::Parameter:: + == unoidl::InterfaceTypeEntity::Method::Parameter:: DIRECTION_IN_OUT); } virtual sal_Bool SAL_CALL isOut() throw (css::uno::RuntimeException) { return (parameter_.direction - == cppu::unoidl::InterfaceTypeEntity::Method::Parameter:: - DIRECTION_OUT) + == unoidl::InterfaceTypeEntity::Method::Parameter::DIRECTION_OUT) || (parameter_.direction - == cppu::unoidl::InterfaceTypeEntity::Method::Parameter:: + == unoidl::InterfaceTypeEntity::Method::Parameter:: DIRECTION_IN_OUT); } @@ -676,7 +680,7 @@ private: { return position_; } css::uno::Reference< css::uno::XComponentContext > context_; - cppu::unoidl::InterfaceTypeEntity::Method::Parameter parameter_; + unoidl::InterfaceTypeEntity::Method::Parameter parameter_; sal_Int32 position_; }; @@ -689,8 +693,7 @@ public: MethodDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - cppu::unoidl::InterfaceTypeEntity::Method const & method, - sal_Int32 position): + unoidl::InterfaceTypeEntity::Method const & method, sal_Int32 position): context_(context), name_(name), method_(method), position_(position) {} @@ -730,7 +733,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - cppu::unoidl::InterfaceTypeEntity::Method method_; + unoidl::InterfaceTypeEntity::Method method_; sal_Int32 position_; }; @@ -767,7 +770,7 @@ public: InterfaceTypeDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::InterfaceTypeEntity > const & entity): + rtl::Reference< unoidl::InterfaceTypeEntity > const & entity): InterfaceTypeDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -810,7 +813,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::InterfaceTypeEntity > entity_; + rtl::Reference< unoidl::InterfaceTypeEntity > entity_; }; css::uno::Sequence< @@ -905,7 +908,7 @@ public: ConstantGroupDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::ConstantGroupEntity > const & entity): + rtl::Reference< unoidl::ConstantGroupEntity > const & entity): ConstantGroupDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -927,7 +930,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::ConstantGroupEntity > entity_; + rtl::Reference< unoidl::ConstantGroupEntity > entity_; }; css::uno::Sequence< @@ -955,7 +958,7 @@ public: TypedefDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::TypedefEntity > const & entity): + rtl::Reference< unoidl::TypedefEntity > const & entity): TypedefDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -976,7 +979,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::TypedefEntity > entity_; + rtl::Reference< unoidl::TypedefEntity > entity_; }; class ConstructorParameter: @@ -986,7 +989,7 @@ class ConstructorParameter: public: ConstructorParameter( css::uno::Reference< css::uno::XComponentContext > const & context, - cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter + unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter const & parameter, sal_Int32 position): context_(context), parameter_(parameter), position_(position) @@ -1016,7 +1019,7 @@ private: { return parameter_.rest; } css::uno::Reference< css::uno::XComponentContext > context_; - cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter + unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter parameter_; sal_Int32 position_; }; @@ -1029,7 +1032,7 @@ class ConstructorDescription: public: ConstructorDescription( css::uno::Reference< css::uno::XComponentContext > const & context, - cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor const & + unoidl::SingleInterfaceBasedServiceEntity::Constructor const & constructor): context_(context), constructor_(constructor) {} @@ -1055,7 +1058,7 @@ private: SAL_CALL getExceptions() throw (css::uno::RuntimeException); css::uno::Reference< css::uno::XComponentContext > context_; - cppu::unoidl::SingleInterfaceBasedServiceEntity::Constructor constructor_; + unoidl::SingleInterfaceBasedServiceEntity::Constructor constructor_; }; css::uno::Sequence< css::uno::Reference< css::reflection::XParameter > > @@ -1097,8 +1100,8 @@ public: SingleInterfaceBasedServiceDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::SingleInterfaceBasedServiceEntity > - const & entity): + rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity > const & + entity): SingleInterfaceBasedServiceDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -1176,7 +1179,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::SingleInterfaceBasedServiceEntity > entity_; + rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity > entity_; }; css::uno::Sequence< @@ -1203,8 +1206,7 @@ class PropertyDescription: public: PropertyDescription( css::uno::Reference< css::uno::XComponentContext > const & context, - cppu::unoidl::AccumulationBasedServiceEntity::Property const & - property): + unoidl::AccumulationBasedServiceEntity::Property const & property): context_(context), property_(property) {} @@ -1227,7 +1229,7 @@ private: { return resolve(context_, property_.type); } css::uno::Reference< css::uno::XComponentContext > context_; - cppu::unoidl::AccumulationBasedServiceEntity::Property property_; + unoidl::AccumulationBasedServiceEntity::Property property_; }; typedef cppu::ImplInheritanceHelper1< @@ -1241,7 +1243,7 @@ public: AccumulationBasedServiceDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::AccumulationBasedServiceEntity > const & + rtl::Reference< unoidl::AccumulationBasedServiceEntity > const & entity): AccumulationBasedServiceDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) @@ -1302,7 +1304,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::AccumulationBasedServiceEntity > entity_; + rtl::Reference< unoidl::AccumulationBasedServiceEntity > entity_; }; css::uno::Sequence< @@ -1411,8 +1413,7 @@ public: InterfaceBasedSingletonDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::InterfaceBasedSingletonEntity > const & - entity): + rtl::Reference< unoidl::InterfaceBasedSingletonEntity > const & entity): InterfaceBasedSingletonDescription_Base(entity->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -1444,7 +1445,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::InterfaceBasedSingletonEntity > entity_; + rtl::Reference< unoidl::InterfaceBasedSingletonEntity > entity_; }; typedef cppu::ImplInheritanceHelper1< @@ -1458,8 +1459,7 @@ public: ServiceBasedSingletonDescription( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & name, - rtl::Reference< cppu::unoidl::ServiceBasedSingletonEntity > const & - entity): + rtl::Reference< unoidl::ServiceBasedSingletonEntity > const & entity): ServiceBasedSingletonDescription_Base(entity_->isPublished()), context_(context), name_(name), entity_(entity) { assert(entity.is()); } @@ -1491,7 +1491,7 @@ private: css::uno::Reference< css::uno::XComponentContext > context_; rtl::OUString name_; - rtl::Reference< cppu::unoidl::ServiceBasedSingletonEntity > entity_; + rtl::Reference< unoidl::ServiceBasedSingletonEntity > entity_; }; class Enumeration: @@ -1503,7 +1503,7 @@ public: Enumeration( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & prefix, - rtl::Reference< cppu::unoidl::MapCursor > const & cursor, + rtl::Reference< unoidl::MapCursor > const & cursor, css::uno::Sequence< css::uno::TypeClass > const & types, bool deep): context_(context), types_(types), deep_(deep) { @@ -1536,22 +1536,22 @@ private: struct Position { Position( rtl::OUString const & thePrefix, - rtl::Reference< cppu::unoidl::MapCursor > const & theCursor): + rtl::Reference< unoidl::MapCursor > const & theCursor): prefix(thePrefix), cursor(theCursor) { assert(theCursor.is()); } Position( rtl::OUString const & thePrefix, - rtl::Reference< cppu::unoidl::ConstantGroupEntity > const & + rtl::Reference< unoidl::ConstantGroupEntity > const & theConstantGroup): prefix(thePrefix), constantGroup(theConstantGroup), constantGroupIndex(constantGroup->getMembers().begin()) { assert(theConstantGroup.is()); } rtl::OUString prefix; - rtl::Reference< cppu::unoidl::MapCursor > cursor; - rtl::Reference< cppu::unoidl::ConstantGroupEntity > constantGroup; - std::vector< cppu::unoidl::ConstantGroupEntity::Member >::const_iterator + rtl::Reference< unoidl::MapCursor > cursor; + rtl::Reference< unoidl::ConstantGroupEntity > constantGroup; + std::vector< unoidl::ConstantGroupEntity::Member >::const_iterator constantGroupIndex; }; @@ -1595,87 +1595,93 @@ bool Enumeration::matches(css::uno::TypeClass tc) const { } 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()) { + try { + for (;;) { + assert(!positions_.empty()); + rtl::OUString name; + if (positions_.top().cursor.is()) { // root or module + rtl::Reference< unoidl::Entity > ent( + positions_.top().cursor->getNext(&name)); + if (!ent.is()) { + positions_.pop(); + if (positions_.empty()) { + break; + } + continue; + } + name = positions_.top().prefix + name; + css::uno::TypeClass tc; + switch (ent->getSort()) { + case unoidl::Entity::SORT_MODULE: + tc = css::uno::TypeClass_MODULE; + if (deep_) { + positions_.push( + Position( + name + ".", + static_cast< unoidl::ModuleEntity * >( + ent.get())->createCursor())); + } + break; + case unoidl::Entity::SORT_ENUM_TYPE: + tc = css::uno::TypeClass_ENUM; + break; + case unoidl::Entity::SORT_PLAIN_STRUCT_TYPE: + case unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE: + tc = css::uno::TypeClass_STRUCT; + break; + case unoidl::Entity::SORT_EXCEPTION_TYPE: + tc = css::uno::TypeClass_EXCEPTION; + break; + case unoidl::Entity::SORT_INTERFACE_TYPE: + tc = css::uno::TypeClass_INTERFACE; + break; + case unoidl::Entity::SORT_TYPEDEF: + tc = css::uno::TypeClass_TYPEDEF; + break; + case unoidl::Entity::SORT_CONSTANT_GROUP: + tc = css::uno::TypeClass_CONSTANTS; + if (deep_ && matches(css::uno::TypeClass_CONSTANT)) { + positions_.push( + Position( + name + ".", + static_cast< unoidl::ConstantGroupEntity * >( + ent.get()))); + } + break; + case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE: + case unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE: + tc = css::uno::TypeClass_SERVICE; + break; + case unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON: + case unoidl::Entity::SORT_SERVICE_BASED_SINGLETON: + tc = css::uno::TypeClass_SINGLETON; + break; + default: + for (;;) { std::abort(); } // this cannot happen + } + if (matches(tc)) { + current_ = name; break; } - continue; - } - name = positions_.top().prefix + name; - css::uno::TypeClass tc; - 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())); + } else { // constant group + if (positions_.top().constantGroupIndex + == positions_.top().constantGroup->getMembers().end()) + { + positions_.pop(); + if (positions_.empty()) { + break; + } + continue; } - break; - case cppu::unoidl::Entity::SORT_ENUM_TYPE: - tc = css::uno::TypeClass_ENUM; - break; - case cppu::unoidl::Entity::SORT_PLAIN_STRUCT_TYPE: - case cppu::unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE: - tc = css::uno::TypeClass_STRUCT; - break; - case cppu::unoidl::Entity::SORT_EXCEPTION_TYPE: - tc = css::uno::TypeClass_EXCEPTION; - break; - case cppu::unoidl::Entity::SORT_INTERFACE_TYPE: - tc = css::uno::TypeClass_INTERFACE; - break; - case cppu::unoidl::Entity::SORT_TYPEDEF: - tc = css::uno::TypeClass_TYPEDEF; - break; - 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 cppu::unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE: - case cppu::unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE: - tc = css::uno::TypeClass_SERVICE; - break; - case cppu::unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON: - case cppu::unoidl::Entity::SORT_SERVICE_BASED_SINGLETON: - tc = css::uno::TypeClass_SINGLETON; - break; - default: - for (;;) { std::abort(); } // this cannot happen - } - if (matches(tc)) { - current_ = name; + current_ = positions_.top().prefix + + positions_.top().constantGroupIndex++->name; break; } - } else { // constant group - if (positions_.top().constantGroupIndex - == positions_.top().constantGroup->getMembers().end()) - { - positions_.pop(); - if (positions_.empty()) { - break; - } - continue; - } - current_ = positions_.top().prefix - + positions_.top().constantGroupIndex++->name; - break; } + } catch (unoidl::FileFormatException & e) { + throw css::uno::DeploymentException( + e.getUri() + ": " + e.getDetail(), + static_cast< cppu::OWeakObject * >(this)); } } @@ -1688,11 +1694,12 @@ class Provider: private osl::Mutex, public Provider_Base, private boost::noncopyable { public: + // throws unoidl::FileFormatException, unoidl::NoSuchFileException: Provider( css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & uri): Provider_Base(*static_cast< osl::Mutex * >(this)), context_(context), - provider_(new cppu::UnoidlProvider(uri)) + provider_(new unoidl::UnoidlProvider(uri)) {} using Provider_Base::acquire; @@ -1709,8 +1716,7 @@ private: css::container::NoSuchElementException, css::uno::RuntimeException); virtual sal_Bool SAL_CALL hasByHierarchicalName( - rtl::OUString const & aName) throw (css::uno::RuntimeException) - { return provider_->find(aName) != 0; } + rtl::OUString const & aName) throw (css::uno::RuntimeException); virtual css::uno::Reference< css::reflection::XTypeDescriptionEnumeration > SAL_CALL createTypeDescriptionEnumeration( @@ -1723,117 +1729,169 @@ private: css::uno::RuntimeException); css::uno::Reference< css::uno::XComponentContext > context_; - rtl::Reference< cppu::UnoidlProvider > provider_; + rtl::Reference< unoidl::UnoidlProvider > provider_; }; css::uno::Any Provider::getByHierarchicalName(rtl::OUString const & aName) throw (css::container::NoSuchElementException, css::uno::RuntimeException) { - bool cnst; - sal_uInt32 off = provider_->find(aName, &cnst); - if (off == 0) { - throw css::container::NoSuchElementException( - aName, static_cast< cppu::OWeakObject * >(this)); - } - if (cnst) { - return css::uno::makeAny< - css::uno::Reference< css::reflection::XTypeDescription > >( - new ConstantDescription(aName, provider_->getConstant(off))); - } else { - 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, - 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, - 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, - static_cast< - cppu::unoidl::ServiceBasedSingletonEntity * >( - ent.get()))); - default: - for (;;) { std::abort(); } // this cannot happen + try { + bool cnst; + sal_uInt32 off = provider_->find(aName, &cnst); + if (off == 0) { + throw css::container::NoSuchElementException( + aName, static_cast< cppu::OWeakObject * >(this)); } + if (cnst) { + unoidl::ConstantValue val1(provider_->getConstant(off)); + css::uno::Any val2; + switch (val1.type) { + case unoidl::ConstantValue::TYPE_BOOLEAN: + val2 <<= val1.booleanValue; + break; + case unoidl::ConstantValue::TYPE_BYTE: + val2 <<= val1.byteValue; + break; + case unoidl::ConstantValue::TYPE_SHORT: + val2 <<= val1.shortValue; + break; + case unoidl::ConstantValue::TYPE_UNSIGNED_SHORT: + val2 <<= val1.unsignedShortValue; + break; + case unoidl::ConstantValue::TYPE_LONG: + val2 <<= val1.longValue; + break; + case unoidl::ConstantValue::TYPE_UNSIGNED_LONG: + val2 <<= val1.unsignedLongValue; + break; + case unoidl::ConstantValue::TYPE_HYPER: + val2 <<= val1.hyperValue; + break; + case unoidl::ConstantValue::TYPE_UNSIGNED_HYPER: + val2 <<= val1.unsignedHyperValue; + break; + case unoidl::ConstantValue::TYPE_FLOAT: + val2 <<= val1.floatValue; + break; + case unoidl::ConstantValue::TYPE_DOUBLE: + val2 <<= val1.doubleValue; + break; + default: + for (;;) { std::abort(); } // this cannot happen + } + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new ConstantDescription(aName, val2)); + } else { + rtl::Reference< unoidl::Entity > ent(provider_->getEntity(off)); + switch (ent->getSort()) { + case unoidl::Entity::SORT_MODULE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new ModuleDescription( + context_, aName, + static_cast< unoidl::ModuleEntity * >(ent.get()))); + case unoidl::Entity::SORT_ENUM_TYPE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new EnumTypeDescription( + aName, + static_cast< unoidl::EnumTypeEntity * >( + ent.get()))); + case unoidl::Entity::SORT_PLAIN_STRUCT_TYPE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new PlainStructTypeDescription( + context_, aName, + static_cast< unoidl::PlainStructTypeEntity * >( + ent.get()))); + case unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new PolymorphicStructTypeTemplateDescription( + context_, aName, + static_cast< + unoidl::PolymorphicStructTypeTemplateEntity * >( + ent.get()))); + case unoidl::Entity::SORT_EXCEPTION_TYPE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new ExceptionTypeDescription( + context_, aName, + static_cast< unoidl::ExceptionTypeEntity * >( + ent.get()))); + case unoidl::Entity::SORT_INTERFACE_TYPE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new InterfaceTypeDescription( + context_, aName, + static_cast< unoidl::InterfaceTypeEntity * >( + ent.get()))); + case unoidl::Entity::SORT_TYPEDEF: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new TypedefDescription( + context_, aName, + static_cast< unoidl::TypedefEntity * >(ent.get()))); + case unoidl::Entity::SORT_CONSTANT_GROUP: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new ConstantGroupDescription( + context_, aName, + static_cast< unoidl::ConstantGroupEntity * >( + ent.get()))); + case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new SingleInterfaceBasedServiceDescription( + context_, aName, + static_cast< + unoidl::SingleInterfaceBasedServiceEntity * >( + ent.get()))); + case unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new AccumulationBasedServiceDescription( + context_, aName, + static_cast< + unoidl::AccumulationBasedServiceEntity * >( + ent.get()))); + case unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new InterfaceBasedSingletonDescription( + context_, aName, + static_cast< + unoidl::InterfaceBasedSingletonEntity * >( + ent.get()))); + case unoidl::Entity::SORT_SERVICE_BASED_SINGLETON: + return css::uno::makeAny< + css::uno::Reference< css::reflection::XTypeDescription > >( + new ServiceBasedSingletonDescription( + context_, aName, + static_cast< + unoidl::ServiceBasedSingletonEntity * >( + ent.get()))); + default: + for (;;) { std::abort(); } // this cannot happen + } + } + } catch (unoidl::FileFormatException & e) { + throw css::uno::DeploymentException( + e.getUri() + ": " + e.getDetail(), + static_cast< cppu::OWeakObject * >(this)); + } +} + +sal_Bool Provider::hasByHierarchicalName( + rtl::OUString const & aName) throw (css::uno::RuntimeException) +{ + try { + return provider_->find(aName) != 0; + } catch (unoidl::FileFormatException & e) { + throw css::uno::DeploymentException( + e.getUri() + ": " + e.getDetail(), + static_cast< cppu::OWeakObject * >(this)); } } @@ -1846,33 +1904,39 @@ Provider::createTypeDescriptionEnumeration( css::reflection::NoSuchTypeNameException, css::reflection::InvalidTypeNameException, css::uno::RuntimeException) { - rtl::OUString prefix; - rtl::Reference< cppu::unoidl::MapCursor > cursor; - if (moduleName.isEmpty()) { - cursor = provider_->createRootCursor(); - } else { - prefix = moduleName + "."; - bool cnst; - sal_uInt32 off = provider_->find(moduleName, &cnst); - if (off == 0) { - throw css::reflection::NoSuchTypeNameException( - moduleName, static_cast< cppu::OWeakObject * >(this)); + try { + rtl::OUString prefix; + rtl::Reference< unoidl::MapCursor > cursor; + if (moduleName.isEmpty()) { + cursor = provider_->createRootCursor(); + } else { + prefix = moduleName + "."; + bool cnst; + sal_uInt32 off = provider_->find(moduleName, &cnst); + if (off == 0) { + throw css::reflection::NoSuchTypeNameException( + moduleName, static_cast< cppu::OWeakObject * >(this)); + } + if (cnst) { + throw css::reflection::InvalidTypeNameException( + moduleName, static_cast< cppu::OWeakObject * >(this)); + } + rtl::Reference< unoidl::Entity > ent(provider_->getEntity(off)); + if (ent->getSort() != unoidl::Entity::SORT_MODULE) { + throw css::reflection::InvalidTypeNameException( + moduleName, static_cast< cppu::OWeakObject * >(this)); + } + cursor = static_cast< unoidl::ModuleEntity * >(ent.get())-> + createCursor(); } - if (cnst) { - throw css::reflection::InvalidTypeNameException( - moduleName, static_cast< cppu::OWeakObject * >(this)); - } - 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)); - } - cursor = static_cast< cppu::unoidl::ModuleEntity * >(ent.get())-> - createCursor(); + return new Enumeration( + context_, prefix, cursor, types, + depth == css::reflection::TypeDescriptionSearchDepth_INFINITE); + } catch (unoidl::FileFormatException & e) { + throw css::uno::DeploymentException( + e.getUri() + ": " + e.getDetail(), + static_cast< cppu::OWeakObject * >(this)); } - return new Enumeration( - context_, prefix, cursor, types, - depth == css::reflection::TypeDescriptionSearchDepth_INFINITE); } css::uno::Reference< css::container::XHierarchicalNameAccess > @@ -1916,7 +1980,7 @@ void readRdbFile( css::uno::Reference< css::container::XHierarchicalNameAccess > prov; try { prov = new Provider(context, uri); - } catch (css::container::NoSuchElementException &) { + } catch (unoidl::NoSuchFileException &) { if (optional) { SAL_INFO("cppuhelper", "Ignored optional " << uri); return; @@ -1924,7 +1988,7 @@ void readRdbFile( throw css::uno::DeploymentException( uri + ": no such file", css::uno::Reference< css::uno::XInterface >()); - } catch (css::registry::InvalidRegistryException &) { + } catch (unoidl::FileFormatException &) { prov = readLegacyRdbFile(uri, serviceManager, context); } assert(prov.is()); diff --git a/cppuhelper/source/unoidlprovider.hxx b/cppuhelper/source/unoidlprovider.hxx deleted file mode 100644 index 45089b9d688b..000000000000 --- a/cppuhelper/source/unoidlprovider.hxx +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- 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: */ diff --git a/sal/inc/sal/log-areas.dox b/sal/inc/sal/log-areas.dox index 647bf8d11e1d..384f211dd915 100644 --- a/sal/inc/sal/log-areas.dox +++ b/sal/inc/sal/log-areas.dox @@ -290,6 +290,7 @@ certain functionality. @li @c svg @li @c svx @li @c ucbhelper +@li @c unoidl @li @c xmlhelp @li @c xmloff @li @c xmlreader diff --git a/scp2/source/ooo/ure.scp b/scp2/source/ooo/ure.scp index ea409f373e79..c24225c00203 100755 --- a/scp2/source/ooo/ure.scp +++ b/scp2/source/ooo/ure.scp @@ -277,6 +277,13 @@ File gid_File_Dl_Store End +File gid_File_Dl_Unoidl + LIB_FILE_BODY; + Dir = SCP2_URE_DL_DIR; + Name = SCP2_URE_DL_NORMAL("unoidl"); + Styles = (PACKED); +End + File gid_File_Dl_Xmlreader LIB_FILE_BODY; Dir = SCP2_URE_DL_DIR; @@ -998,6 +1005,7 @@ Module gid_Module_Root_Ure_Hidden gid_Unixlink_File_Dl_Rmcxt, gid_File_Dl_Store, gid_Unixlink_File_Dl_Store, + gid_File_Dl_Unoidl, gid_File_Dl_Xmlreader, gid_File_Dl_Jvmaccess, gid_Unixlink_File_Dl_Jvmaccess, diff --git a/unoidl/Library_unoidl.mk b/unoidl/Library_unoidl.mk new file mode 100644 index 000000000000..8a7a668299e7 --- /dev/null +++ b/unoidl/Library_unoidl.mk @@ -0,0 +1,26 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# 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/. +# + +$(eval $(call gb_Library_Library,unoidl)) + +$(eval $(call gb_Library_add_defs,unoidl,-DLO_DLLIMPLEMENTATION_UNOIDL)) + +$(eval $(call gb_Library_add_exception_objects,unoidl, \ + unoidl/source/unoidl \ + unoidl/source/unoidlprovider \ +)) + +$(eval $(call gb_Library_use_libraries,unoidl, \ + sal \ + salhelper \ +)) + +$(eval $(call gb_Library_use_package,unoidl,unoidl_inc)) + +# vim: set noet sw=4 ts=4: diff --git a/unoidl/Makefile b/unoidl/Makefile new file mode 100644 index 000000000000..0997e628485b --- /dev/null +++ b/unoidl/Makefile @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# 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/. +# + +module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) + +include $(module_directory)/../solenv/gbuild/partial_build.mk + +# vim: set noet sw=4 ts=4: diff --git a/unoidl/Module_unoidl.mk b/unoidl/Module_unoidl.mk new file mode 100644 index 000000000000..7017b80a897c --- /dev/null +++ b/unoidl/Module_unoidl.mk @@ -0,0 +1,17 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# 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/. +# + +$(eval $(call gb_Module_Module,unoidl)) + +$(eval $(call gb_Module_add_targets,unoidl, \ + Library_unoidl \ + Package_inc \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/unoidl/Package_inc.mk b/unoidl/Package_inc.mk new file mode 100644 index 000000000000..563ae365d07c --- /dev/null +++ b/unoidl/Package_inc.mk @@ -0,0 +1,16 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# 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/. +# + +$(eval $(call gb_Package_Package,unoidl_inc,$(SRCDIR)/unoidl/inc/unoidl)) + +$(eval $(call gb_Package_add_file,unoidl_inc,inc/unoidl/detail/dllapi.hxx,detail/dllapi.hxx)) +$(eval $(call gb_Package_add_file,unoidl_inc,inc/unoidl/unoidl.hxx,unoidl.hxx)) +$(eval $(call gb_Package_add_file,unoidl_inc,inc/unoidl/unoidlprovider.hxx,unoidlprovider.hxx)) + +# vim: set noet sw=4 ts=4: diff --git a/unoidl/inc/unoidl/detail/dllapi.hxx b/unoidl/inc/unoidl/detail/dllapi.hxx new file mode 100644 index 000000000000..ad011ad4eb77 --- /dev/null +++ b/unoidl/inc/unoidl/detail/dllapi.hxx @@ -0,0 +1,26 @@ +/* -*- 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_UNOIDL_DETAIL_DLLAPI_HXX +#define INCLUDED_UNOIDL_DETAIL_DLLAPI_HXX + +#include "sal/config.h" + +#include "sal/types.h" + +#if defined LO_DLLIMPLEMENTATION_UNOIDL +#define LO_DLLPUBLIC_UNOIDL SAL_DLLPUBLIC_EXPORT +#else +#define LO_DLLPUBLIC_UNOIDL SAL_DLLPUBLIC_IMPORT +#endif + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unoidl/inc/unoidl/detail/unoidldllapi.hxx b/unoidl/inc/unoidl/detail/unoidldllapi.hxx new file mode 100644 index 000000000000..cfb1e90fd488 --- /dev/null +++ b/unoidl/inc/unoidl/detail/unoidldllapi.hxx @@ -0,0 +1,26 @@ +/* -*- 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_UNOIDL_DETAIL_UNOIDLDLLAPI_HXX +#define INCLUDED_UNOIDL_DETAIL_UNOIDLDLLAPI_HXX + +#include "sal/config.h" + +#include "sal/types.h" + +#if defined LO_DLLIMPLEMENTATION_UNOIDL +#define LO_DLLPUBLIC_UNOIDL SAL_DLLPUBLIC_EXPORT +#else +#define LO_DLLPUBLIC_UNOIDL SAL_DLLPUBLIC_IMPORT +#endif + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cppuhelper/inc/cppuhelper/unoidl.hxx b/unoidl/inc/unoidl/unoidl.hxx similarity index 75% rename from cppuhelper/inc/cppuhelper/unoidl.hxx rename to unoidl/inc/unoidl/unoidl.hxx index 589f8462063a..372ed3889ade 100644 --- a/cppuhelper/inc/cppuhelper/unoidl.hxx +++ b/unoidl/inc/unoidl/unoidl.hxx @@ -7,38 +7,71 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef INCLUDED_CPPUHELPER_UNOIDL_HXX -#define INCLUDED_CPPUHELPER_UNOIDL_HXX +#ifndef INCLUDED_UNOIDL_UNOIDL_HXX +#define INCLUDED_UNOIDL_UNOIDL_HXX #include "sal/config.h" #include #include -#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" +#include "unoidl/detail/dllapi.hxx" -namespace cppu { namespace unoidl { +namespace unoidl { -class CPPUHELPER_DLLPUBLIC Entity: public salhelper::SimpleReferenceObject { +class LO_DLLPUBLIC_UNOIDL NoSuchFileException { +public: + SAL_DLLPRIVATE NoSuchFileException(rtl::OUString const & uri): uri_(uri) {} + + SAL_DLLPRIVATE NoSuchFileException(NoSuchFileException const & other): + uri_(other.uri_) {} + + virtual SAL_DLLPRIVATE ~NoSuchFileException() throw (); + + rtl::OUString getUri() const { return uri_; } + +private: + void operator =(NoSuchFileException) SAL_DELETED_FUNCTION; + + rtl::OUString uri_; +}; + +class LO_DLLPUBLIC_UNOIDL FileFormatException { +public: + SAL_DLLPRIVATE FileFormatException( + rtl::OUString const & uri, rtl::OUString const & detail): + uri_(uri), detail_(detail) + {} + + SAL_DLLPRIVATE FileFormatException(FileFormatException const & other): + uri_(other.uri_), detail_(other.detail_) + {} + + virtual SAL_DLLPRIVATE ~FileFormatException() throw (); + + rtl::OUString getUri() const { return uri_; } + + rtl::OUString getDetail() const { return detail_; } + +private: + void operator =(FileFormatException) SAL_DELETED_FUNCTION; + + rtl::OUString uri_; + rtl::OUString detail_; +}; + +class LO_DLLPUBLIC_UNOIDL 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_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_; } @@ -52,8 +85,9 @@ private: Sort sort_; }; -class CPPUHELPER_DLLPUBLIC MapCursor: public salhelper::SimpleReferenceObject { +class LO_DLLPUBLIC_UNOIDL MapCursor: public salhelper::SimpleReferenceObject { public: + // throws FileFormatException: virtual rtl::Reference< Entity > getNext(rtl::OUString * name) = 0; protected: @@ -62,10 +96,12 @@ protected: virtual SAL_DLLPRIVATE ~MapCursor() throw(); }; -class CPPUHELPER_DLLPUBLIC ModuleEntity: public Entity { +class LO_DLLPUBLIC_UNOIDL ModuleEntity: public Entity { public: + // throws FileFormatException: virtual std::vector< rtl::OUString > getMemberNames() const = 0; + // throws FileFormatException: virtual rtl::Reference< MapCursor > createCursor() const = 0; protected: @@ -74,7 +110,7 @@ protected: virtual SAL_DLLPRIVATE ~ModuleEntity() throw (); }; -class CPPUHELPER_DLLPUBLIC PublishableEntity: public Entity { +class LO_DLLPUBLIC_UNOIDL PublishableEntity: public Entity { public: bool isPublished() const { return published_; } @@ -89,7 +125,7 @@ private: bool published_; }; -class CPPUHELPER_DLLPUBLIC EnumTypeEntity: public PublishableEntity { +class LO_DLLPUBLIC_UNOIDL EnumTypeEntity: public PublishableEntity { public: struct Member { Member(rtl::OUString const & theName, sal_Int32 theValue): @@ -114,7 +150,7 @@ private: std::vector< Member > members_; }; -class CPPUHELPER_DLLPUBLIC PlainStructTypeEntity: public PublishableEntity { +class LO_DLLPUBLIC_UNOIDL PlainStructTypeEntity: public PublishableEntity { public: struct Member { Member(rtl::OUString const & theName, rtl::OUString const & theType): @@ -145,7 +181,7 @@ private: std::vector< Member > directMembers_; }; -class CPPUHELPER_DLLPUBLIC PolymorphicStructTypeTemplateEntity: +class LO_DLLPUBLIC_UNOIDL PolymorphicStructTypeTemplateEntity: public PublishableEntity { public: @@ -182,7 +218,7 @@ private: std::vector< Member > members_; }; -class CPPUHELPER_DLLPUBLIC ExceptionTypeEntity: public PublishableEntity { +class LO_DLLPUBLIC_UNOIDL ExceptionTypeEntity: public PublishableEntity { public: struct Member { Member(rtl::OUString const & theName, rtl::OUString const & theType): @@ -213,7 +249,7 @@ private: std::vector< Member > directMembers_; }; -class CPPUHELPER_DLLPUBLIC InterfaceTypeEntity: public PublishableEntity { +class LO_DLLPUBLIC_UNOIDL InterfaceTypeEntity: public PublishableEntity { public: struct Attribute { Attribute( @@ -306,7 +342,7 @@ private: std::vector< Method > directMethods_; }; -class CPPUHELPER_DLLPUBLIC TypedefEntity: public PublishableEntity { +class LO_DLLPUBLIC_UNOIDL TypedefEntity: public PublishableEntity { public: SAL_DLLPRIVATE TypedefEntity(bool published, rtl::OUString const & type): PublishableEntity(SORT_TYPEDEF, published), type_(type) @@ -320,16 +356,69 @@ private: rtl::OUString type_; }; -class CPPUHELPER_DLLPUBLIC ConstantGroupEntity: public PublishableEntity { +struct LO_DLLPUBLIC_UNOIDL ConstantValue { + enum Type { + TYPE_BOOLEAN, TYPE_BYTE, TYPE_SHORT, TYPE_UNSIGNED_SHORT, TYPE_LONG, + TYPE_UNSIGNED_LONG, TYPE_HYPER, TYPE_UNSIGNED_HYPER, TYPE_FLOAT, + TYPE_DOUBLE }; + + explicit ConstantValue(bool value): type(TYPE_BOOLEAN), booleanValue(value) + {} + + explicit ConstantValue(sal_Int8 value): type(TYPE_BYTE), byteValue(value) {} + + explicit ConstantValue(sal_Int16 value): type(TYPE_SHORT), shortValue(value) + {} + + explicit ConstantValue(sal_uInt16 value): + type(TYPE_UNSIGNED_SHORT), unsignedShortValue(value) + {} + + explicit ConstantValue(sal_Int32 value): type(TYPE_LONG), longValue(value) + {} + + explicit ConstantValue(sal_uInt32 value): + type(TYPE_UNSIGNED_LONG), unsignedLongValue(value) + {} + + explicit ConstantValue(sal_Int64 value): type(TYPE_HYPER), hyperValue(value) + {} + + explicit ConstantValue(sal_uInt64 value): + type(TYPE_UNSIGNED_HYPER), unsignedHyperValue(value) + {} + + explicit ConstantValue(float value): type(TYPE_FLOAT), floatValue(value) {} + + explicit ConstantValue(double value): type(TYPE_DOUBLE), doubleValue(value) + {} + + Type type; + + union { + bool booleanValue; + sal_Int8 byteValue; + sal_Int16 shortValue; + sal_uInt16 unsignedShortValue; + sal_Int32 longValue; + sal_uInt32 unsignedLongValue; + sal_Int64 hyperValue; + sal_uInt64 unsignedHyperValue; + float floatValue; + double doubleValue; + }; +}; + +class LO_DLLPUBLIC_UNOIDL ConstantGroupEntity: public PublishableEntity { public: struct Member { - Member(rtl::OUString const & theName, css::uno::Any const & theValue): + Member(rtl::OUString const & theName, ConstantValue const & theValue): name(theName), value(theValue) {} rtl::OUString name; - css::uno::Any value; + ConstantValue value; }; SAL_DLLPRIVATE ConstantGroupEntity( @@ -345,7 +434,7 @@ private: std::vector< Member > members_; }; -class CPPUHELPER_DLLPUBLIC SingleInterfaceBasedServiceEntity: +class LO_DLLPUBLIC_UNOIDL SingleInterfaceBasedServiceEntity: public PublishableEntity { public: @@ -402,7 +491,7 @@ private: std::vector< Constructor > constructors_; }; -class CPPUHELPER_DLLPUBLIC AccumulationBasedServiceEntity: +class LO_DLLPUBLIC_UNOIDL AccumulationBasedServiceEntity: public PublishableEntity { public: @@ -473,7 +562,7 @@ private: std::vector< Property > directProperties_; }; -class CPPUHELPER_DLLPUBLIC InterfaceBasedSingletonEntity: +class LO_DLLPUBLIC_UNOIDL InterfaceBasedSingletonEntity: public PublishableEntity { public: @@ -491,7 +580,7 @@ private: rtl::OUString base_; }; -class CPPUHELPER_DLLPUBLIC ServiceBasedSingletonEntity: public PublishableEntity +class LO_DLLPUBLIC_UNOIDL ServiceBasedSingletonEntity: public PublishableEntity { public: SAL_DLLPRIVATE ServiceBasedSingletonEntity( @@ -507,8 +596,9 @@ private: rtl::OUString base_; }; -class CPPUHELPER_DLLPUBLIC Provider: public salhelper::SimpleReferenceObject { +class LO_DLLPUBLIC_UNOIDL Provider: public salhelper::SimpleReferenceObject { public: + // throws FileFormatException: virtual rtl::Reference< MapCursor > createRootCursor() const = 0; protected: @@ -517,10 +607,11 @@ protected: virtual SAL_DLLPRIVATE ~Provider() throw (); }; -CPPUHELPER_DLLPUBLIC rtl::Reference< Provider > loadProvider( +// throws FileFormatException, NoSuchFileException: +LO_DLLPUBLIC_UNOIDL rtl::Reference< Provider > loadProvider( rtl::OUString const & uri); -} } +} #endif diff --git a/unoidl/inc/unoidl/unoidlprovider.hxx b/unoidl/inc/unoidl/unoidlprovider.hxx new file mode 100644 index 000000000000..07388a604034 --- /dev/null +++ b/unoidl/inc/unoidl/unoidlprovider.hxx @@ -0,0 +1,57 @@ +/* -*- 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_UNOIDL_UNOIDLPROVIDER_HXX +#define INCLUDED_UNOIDL_UNOIDLPROVIDER_HXX + +#include "sal/config.h" + +#include "rtl/ref.hxx" +#include "sal/types.h" +#include "unoidl/detail/dllapi.hxx" +#include "unoidl/unoidl.hxx" + +namespace rtl { class OUString; } +namespace unoidl { namespace detail { + class MappedFile; + struct MapEntry; +} } + +namespace unoidl { + +class LO_DLLPUBLIC_UNOIDL UnoidlProvider: public Provider { +public: + // throws FileFormatException, NoSuchFileException: + explicit UnoidlProvider(rtl::OUString const & uri); + + // throws FileFormatException: + virtual rtl::Reference< MapCursor > createRootCursor() const; + + // throws FileFormatException: + sal_uInt32 find(rtl::OUString const & name, bool * constant = 0) const; + + // throws FileFormatException: + rtl::Reference< Entity > getEntity(sal_uInt32 offset) const; + + // throws FileFormatException: + ConstantValue getConstant(sal_uInt32 offset) const; + +private: + virtual SAL_DLLPRIVATE ~UnoidlProvider() throw (); + + rtl::Reference< detail::MappedFile > file_; + detail::MapEntry const * mapBegin_; + sal_uInt32 mapSize_; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unoidl/prj/build.lst b/unoidl/prj/build.lst new file mode 100644 index 000000000000..32409d2a0b63 --- /dev/null +++ b/unoidl/prj/build.lst @@ -0,0 +1,2 @@ +un unoidl: sal salhelper NULL +un unoidl\prj nmake - all un_prj NULL diff --git a/unoidl/prj/d.lst b/unoidl/prj/d.lst new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/cppuhelper/source/unoidl.cxx b/unoidl/source/unoidl.cxx similarity index 84% rename from cppuhelper/source/unoidl.cxx rename to unoidl/source/unoidl.cxx index b9109af0416f..f34eee0ae7a6 100644 --- a/cppuhelper/source/unoidl.cxx +++ b/unoidl/source/unoidl.cxx @@ -11,13 +11,16 @@ #include -#include "cppuhelper/unoidl.hxx" #include "rtl/ref.hxx" #include "rtl/ustring.hxx" +#include "unoidl/unoidl.hxx" +#include "unoidl/unoidlprovider.hxx" -#include "unoidlprovider.hxx" +namespace unoidl { -namespace cppu { namespace unoidl { +NoSuchFileException::~NoSuchFileException() throw () {} + +FileFormatException::~FileFormatException() throw () {} Entity::~Entity() throw () {} @@ -54,10 +57,10 @@ ServiceBasedSingletonEntity::~ServiceBasedSingletonEntity() throw () {} Provider::~Provider() throw () {} -rtl::Reference< Provider > loadProvider(rtl::OUString const & uri) { +rtl::Reference< Provider > loadProvider(OUString const & uri) { return new UnoidlProvider(uri); } -} } +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cppuhelper/source/unoidlprovider.cxx b/unoidl/source/unoidlprovider.cxx similarity index 58% rename from cppuhelper/source/unoidlprovider.cxx rename to unoidl/source/unoidlprovider.cxx index 12b497490c87..03daf5aac222 100644 --- a/cppuhelper/source/unoidlprovider.cxx +++ b/unoidl/source/unoidlprovider.cxx @@ -14,13 +14,6 @@ #include #include -#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" @@ -28,8 +21,8 @@ #include "sal/log.hxx" #include "sal/types.h" #include "salhelper/simplereferenceobject.hxx" - -#include "unoidlprovider.hxx" +#include "unoidl/unoidl.hxx" +#include "unoidl/unoidlprovider.hxx" // New binary format: // @@ -292,11 +285,13 @@ struct Memory64 { } -namespace cppu { +namespace unoidl { + +namespace detail { class MappedFile: public salhelper::SimpleReferenceObject { public: - explicit MappedFile(rtl::OUString const & fileUrl); + explicit MappedFile(OUString const & fileUrl); sal_uInt8 read8(sal_uInt32 offset) const; @@ -310,11 +305,11 @@ public: double readIso60599Binary64(sal_uInt32 offset) const; - rtl::OUString readNameNul(sal_uInt32 offset) const; + OUString readNameNul(sal_uInt32 offset) const; - rtl::OUString readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset = 0) - const; + OUString readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset = 0) const; + OUString uri; oslFileHandle handle; sal_uInt64 size; void * address; @@ -335,19 +330,15 @@ private: double getIso60599Binary64(sal_uInt32 offset) const; }; -MappedFile::MappedFile(rtl::OUString const & fileUrl) { - oslFileError e = osl_openFile( - fileUrl.pData, &handle, osl_File_OpenFlag_Read); +MappedFile::MappedFile(OUString const & fileUrl): uri(fileUrl) { + oslFileError e = osl_openFile(uri.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 >()); + throw NoSuchFileException(uri); default: - throw css::uno::RuntimeException( - "cannot open " + fileUrl + ": " + rtl::OUString::number(e), - css::uno::Reference< css::uno::XInterface >()); + throw FileFormatException(uri, "cannot open: " + OUString::number(e)); } e = osl_getFileSize(handle, &size); if (e == osl_File_E_None) { @@ -357,20 +348,17 @@ MappedFile::MappedFile(rtl::OUString const & fileUrl) { 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 >()); + e2 != osl_File_E_None, "unoidl", + "cannot close " << uri << ": " << +e2); + throw FileFormatException(uri, "cannot mmap: " + OUString::number(e)); } } 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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for 8-bit value too large"); } return get8(offset); } @@ -378,9 +366,8 @@ sal_uInt8 MappedFile::read8(sal_uInt32 offset) const { 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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for 16-bit value too large"); } return get16(offset); } @@ -388,9 +375,8 @@ sal_uInt16 MappedFile::read16(sal_uInt32 offset) const { 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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for 32-bit value too large"); } return get32(offset); } @@ -398,9 +384,8 @@ sal_uInt32 MappedFile::read32(sal_uInt32 offset) const { 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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for 64-bit value too large"); } return get64(offset); } @@ -408,9 +393,8 @@ sal_uInt64 MappedFile::read64(sal_uInt32 offset) const { 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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for 32-bit value too large"); } return getIso60599Binary32(offset); } @@ -418,36 +402,31 @@ float MappedFile::readIso60599Binary32(sal_uInt32 offset) const { 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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for 64-bit value too large"); } return getIso60599Binary64(offset); } -rtl::OUString MappedFile::readNameNul(sal_uInt32 offset) const { +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 >()); + throw FileFormatException( + uri, "UNOIDL format: offset for string too large"); } 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 >()); + throw FileFormatException( + uri, "UNOIDL format: string misses trailing NUL"); } 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 >()); + throw FileFormatException(uri, "UNOIDL format: string too long"); } - rtl::OUString name; + OUString name; if (!rtl_convertStringToUString( &name.pData, static_cast< char const * >(address) + offset, end - offset, RTL_TEXTENCODING_ASCII_US, @@ -455,14 +434,12 @@ rtl::OUString MappedFile::readNameNul(sal_uInt32 offset) const { | 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 >()); + throw FileFormatException(uri, "UNOIDL format: name is not ASCII"); } return name; } -rtl::OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset) +OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset) const { sal_uInt32 len = read32(offset); @@ -473,9 +450,8 @@ rtl::OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset) 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 >()); + throw FileFormatException( + uri, "UNOIDL format: name length high bit unset"); } len &= ~0x80000000; } else { @@ -485,11 +461,10 @@ rtl::OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset) } } 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 >()); + throw FileFormatException( + uri, "UNOIDL format: size of name is too large"); } - rtl::OUString name; + OUString name; if (!rtl_convertStringToUString( &name.pData, static_cast< char const * >(address) + offset + 4, len, RTL_TEXTENCODING_ASCII_US, @@ -497,18 +472,16 @@ rtl::OUString MappedFile::readNameLen(sal_uInt32 offset, sal_uInt32 * newOffset) | 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 >()); + throw FileFormatException(uri, "UNOIDL format: name is not ASCII"); } return name; } MappedFile::~MappedFile() { oslFileError e = osl_unmapMappedFile(handle, address, size); - SAL_WARN_IF(e != osl_File_E_None, "cppuhelper", "cannot unmap: " << +e); + SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot unmap: " << +e); e = osl_closeFile(handle); - SAL_WARN_IF(e != osl_File_E_None, "cppuhelper", "cannot close: " << +e); + SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot close: " << +e); } sal_uInt8 MappedFile::get8(sal_uInt32 offset) const { @@ -558,21 +531,22 @@ struct MapEntry { 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) + rtl::Reference< detail::MappedFile > const & file, OUString const & name, + sal_Int32 nameOffset, sal_Int32 nameLength, detail::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 >()); + throw FileFormatException( + file->uri, "UNOIDL format: string offset too large"); } assert(nameLength >= 0); sal_uInt64 min = std::min( @@ -591,9 +565,8 @@ Compare compare( } 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 >()); + throw FileFormatException( + file->uri, "UNOIDL format: string misses trailing NUL"); } return static_cast< unsigned char const * >(file->address)[off + min] == 0 @@ -604,15 +577,15 @@ Compare compare( } sal_uInt32 findInMap( - rtl::Reference< MappedFile > const & file, MapEntry const * mapBegin, - sal_uInt32 mapSize, rtl::OUString const & name, sal_Int32 nameOffset, - sal_Int32 nameLength) + rtl::Reference< detail::MappedFile > const & file, + detail::MapEntry const * mapBegin, sal_uInt32 mapSize, + OUString const & name, sal_Int32 nameOffset, sal_Int32 nameLength) { if (mapSize == 0) { return 0; } sal_uInt32 n = mapSize / 2; - MapEntry const * p = mapBegin + n; + detail::MapEntry const * p = mapBegin + n; switch (compare(file, name, nameOffset, nameLength, p)) { case COMPARE_LESS: return findInMap(file, mapBegin, n, name, nameOffset, nameLength); @@ -624,15 +597,14 @@ sal_uInt32 findInMap( } 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 >()); + throw FileFormatException( + file->uri, "UNOIDL format: map entry data offset is null"); } return off; } -css::uno::Any readConstant( - rtl::Reference< MappedFile > const & file, sal_uInt32 offset) +ConstantValue readConstant( + rtl::Reference< detail::MappedFile > const & file, sal_uInt32 offset) { assert(file.is()); int v = file->read8(offset); @@ -643,74 +615,75 @@ css::uno::Any readConstant( v = file->read8(offset + 1); switch (v) { case 0: - return css::uno::makeAny(false); + return ConstantValue(false); case 1: - return css::uno::makeAny(true); + return ConstantValue(true); default: - throw css::uno::DeploymentException( - ("broken UNOIDL file: bad boolean constant value " - + rtl::OUString::number(v)), - css::uno::Reference< css::uno::XInterface >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: bad boolean constant value " + + OUString::number(v))); } - break; case 1: // BYTE - return css::uno::makeAny< sal_Int8 >(file->read8(offset + 1)); + return ConstantValue(static_cast< 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)); + return ConstantValue( + static_cast< 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)); + return ConstantValue(file->read16(offset + 1)); case 4: // LONG - return css::uno::makeAny< sal_Int32 >(file->read32(offset + 1)); + return ConstantValue( + static_cast< 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)); + return ConstantValue(file->read32(offset + 1)); case 6: // HYPER - return css::uno::makeAny< sal_Int64 >(file->read64(offset + 1)); + return ConstantValue( + static_cast< 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)); + return ConstantValue(file->read64(offset + 1)); case 8: // FLOAT - return css::uno::makeAny(file->readIso60599Binary32(offset + 1)); + return ConstantValue(file->readIso60599Binary32(offset + 1)); case 9: // DOUBLE - return css::uno::makeAny(file->readIso60599Binary64(offset + 1)); + return ConstantValue(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 >()); + throw FileFormatException( + file->uri, + "UNOIDL format: bad constant type byte " + OUString::number(v)); } } -rtl::Reference< unoidl::Entity > readEntity( - rtl::Reference< MappedFile > const & file, sal_uInt32 offset); +rtl::Reference< Entity > readEntity( + rtl::Reference< detail::MappedFile > const & file, sal_uInt32 offset); -class UnoidlCursor: public unoidl::MapCursor { +class UnoidlCursor: public MapCursor { public: UnoidlCursor( - rtl::Reference< MappedFile > file, MapEntry const * mapBegin, - sal_uInt32 mapSize): + rtl::Reference< detail::MappedFile > file, + detail::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); + virtual rtl::Reference< Entity > getNext(OUString * name); - rtl::Reference< MappedFile > file_; - MapEntry const * mapIndex_; - MapEntry const * mapEnd_; + rtl::Reference< detail::MappedFile > file_; + detail::MapEntry const * mapIndex_; + detail::MapEntry const * mapEnd_; }; -rtl::Reference< unoidl::Entity > UnoidlCursor::getNext(rtl::OUString * name) { +rtl::Reference< Entity > UnoidlCursor::getNext(OUString * name) { assert(name != 0); - rtl::Reference< unoidl::Entity > ent; + rtl::Reference< Entity > ent; if (mapIndex_ != mapEnd_) { *name = file_->readNameNul(mapIndex_->name.getUnsigned32()); ent = readEntity(file_, mapIndex_->data.getUnsigned32()); @@ -719,14 +692,14 @@ rtl::Reference< unoidl::Entity > UnoidlCursor::getNext(rtl::OUString * name) { return ent; } -class UnoidlModuleEntity: public unoidl::ModuleEntity { +class UnoidlModuleEntity: public ModuleEntity { public: UnoidlModuleEntity( - rtl::Reference< MappedFile > const & file, sal_uInt32 mapOffset, + rtl::Reference< detail::MappedFile > const & file, sal_uInt32 mapOffset, sal_uInt32 mapSize): file_(file), mapBegin_( - reinterpret_cast< MapEntry const * >( + reinterpret_cast< detail::MapEntry const * >( static_cast< char const * >(file_->address) + mapOffset)), mapSize_(mapSize) { assert(file.is()); } @@ -734,26 +707,26 @@ public: private: virtual ~UnoidlModuleEntity() throw () {} - virtual std::vector< rtl::OUString > getMemberNames() const; + virtual std::vector< OUString > getMemberNames() const; - virtual rtl::Reference< unoidl::MapCursor > createCursor() const + virtual rtl::Reference< MapCursor > createCursor() const { return new UnoidlCursor(file_, mapBegin_, mapSize_); } - rtl::Reference< MappedFile > file_; - MapEntry const * mapBegin_; + rtl::Reference< detail::MappedFile > file_; + detail::MapEntry const * mapBegin_; sal_uInt32 mapSize_; }; -std::vector< rtl::OUString > UnoidlModuleEntity::getMemberNames() const { - std::vector< rtl::OUString > names; +std::vector< OUString > UnoidlModuleEntity::getMemberNames() const { + std::vector< 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) +rtl::Reference< Entity > readEntity( + rtl::Reference< detail::MappedFile > const & file, sal_uInt32 offset) { assert(file.is()); int v = file->read8(offset); @@ -765,21 +738,20 @@ rtl::Reference< unoidl::Entity > readEntity( 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: bad module type byte " + + OUString::number(v))); } 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 >()); + throw FileFormatException( + file->uri, "UNOIDL format: too many items in module"); } 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 >()); + throw FileFormatException( + file->uri, + "UNOIDL format: module map offset + size too large"); } return new UnoidlModuleEntity(file, offset + 5, n); } @@ -787,198 +759,191 @@ rtl::Reference< unoidl::Entity > readEntity( { 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 >()); + throw FileFormatException( + file->uri, "UNOIDL format: too many members of enum type"); } offset += 5; - std::vector< unoidl::EnumTypeEntity::Member > mems; + std::vector< EnumTypeEntity::Member > mems; for (sal_uInt32 i = 0; i != n; ++i) { - rtl::OUString memName(file->readNameLen(offset, &offset)); + 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)); + mems.push_back(EnumTypeEntity::Member(memName, memValue)); } - return new unoidl::EnumTypeEntity(published, mems); + return new EnumTypeEntity(published, mems); } case 2: // plain struct type without base case 2 | 0x20: // plain struct type with base { ++offset; - rtl::OUString base; + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: empty base type name of plain struct" + " type")); } } 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct members of plain struct" + " type")); } offset += 4; - std::vector< unoidl::PlainStructTypeEntity::Member > mems; + std::vector< 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)); + OUString memName(file->readNameLen(offset, &offset)); + OUString memType(file->readNameLen(offset, &offset)); + mems.push_back(PlainStructTypeEntity::Member(memName, memType)); } - return new unoidl::PlainStructTypeEntity(published, base, mems); + return new 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many type parameters of polymorphic" + " struct type template")); } offset += 5; - std::vector< rtl::OUString > params; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many members of polymorphic struct" + " type template")); } offset += 4; - std::vector< unoidl::PolymorphicStructTypeTemplateEntity::Member > - mems; + std::vector< 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)); + OUString memName(file->readNameLen(offset, &offset)); + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: bad flags " + OUString::number(v) + + " for member " + memName + + " of polymorphic struct type template")); } mems.push_back( - unoidl::PolymorphicStructTypeTemplateEntity::Member( + PolymorphicStructTypeTemplateEntity::Member( memName, memType, v == 1)); } - return new unoidl::PolymorphicStructTypeTemplateEntity( + return new PolymorphicStructTypeTemplateEntity( published, params, mems); } case 4: // exception type without base case 4 | 0x20: // exception type with base { ++offset; - rtl::OUString base; + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: empty base type name of exception" + " type")); } } 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 >()); + throw FileFormatException( + file->uri, + "UNOIDL format: too many direct members of exception type"); } offset += 4; - std::vector< unoidl::ExceptionTypeEntity::Member > mems; + std::vector< 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)); + OUString memName(file->readNameLen(offset, &offset)); + OUString memType(file->readNameLen(offset, &offset)); + mems.push_back(ExceptionTypeEntity::Member(memName, memType)); } - return new unoidl::ExceptionTypeEntity(published, base, mems); + return new 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct mandatory bases of" + " interface type")); } offset += 5; - std::vector< rtl::OUString > mandBases; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct optional bases of" + " interface type")); } offset += 4; - std::vector< rtl::OUString > optBases; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct attributes of interface" + " type")); } offset += 4; - std::vector< unoidl::InterfaceTypeEntity::Attribute > attrs; + std::vector< 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)); + OUString attrName(file->readNameLen(offset, &offset)); + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: bad flags for direct attribute " + + attrName + " of interface type")); } - std::vector< rtl::OUString > getExcs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many getter exceptions for direct" + " attribute " + attrName + " of interface type")); } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { getExcs.push_back(file->readNameLen(offset, &offset)); } - std::vector< rtl::OUString > setExcs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many setter exceptions for" + " direct attribute " + attrName + + " of interface type")); } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { @@ -986,153 +951,145 @@ rtl::Reference< unoidl::Entity > readEntity( } } attrs.push_back( - unoidl::InterfaceTypeEntity::Attribute( + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct attributes and methods of" + " interface type")); } offset += 4; - std::vector< unoidl::InterfaceTypeEntity::Method > meths; + std::vector< 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)); + OUString methName(file->readNameLen(offset, &offset)); + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many parameters for method " + + methName + " of interface type")); } offset += 4; - std::vector< unoidl::InterfaceTypeEntity::Method::Parameter > - params; + std::vector< 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; + OUString paramName(file->readNameLen(offset, &offset)); + OUString paramType(file->readNameLen(offset, &offset)); + InterfaceTypeEntity::Method::Parameter::Direction dir; switch (v) { case 0: - dir = unoidl::InterfaceTypeEntity::Method::Parameter:: + dir = InterfaceTypeEntity::Method::Parameter:: DIRECTION_IN; break; case 1: - dir = unoidl::InterfaceTypeEntity::Method::Parameter:: + dir = InterfaceTypeEntity::Method::Parameter:: DIRECTION_OUT; break; case 2: - dir = unoidl::InterfaceTypeEntity::Method::Parameter:: + dir = InterfaceTypeEntity::Method::Parameter:: DIRECTION_IN_OUT; break; default: - throw css::uno::DeploymentException( - ("broken UNOIDL file: bad direction " - + rtl::OUString::number(v) + " of parameter " + throw FileFormatException( + file->uri, + ("UNOIDL format: bad direction " + + OUString::number(v) + " of parameter " + paramName + " for method " + methName - + " of interface type"), - css::uno::Reference< css::uno::XInterface >()); + + " of interface type")); } params.push_back( - unoidl::InterfaceTypeEntity::Method::Parameter( + InterfaceTypeEntity::Method::Parameter( paramName, paramType, dir)); } - std::vector< rtl::OUString > excs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many exceptions for method " + + methName + " of interface type")); } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { excs.push_back(file->readNameLen(offset, &offset)); } meths.push_back( - unoidl::InterfaceTypeEntity::Method( + InterfaceTypeEntity::Method( methName, methType, params, excs)); } - return new unoidl::InterfaceTypeEntity( + return new InterfaceTypeEntity( published, mandBases, optBases, attrs, meths); } case 6: // typedef - return new unoidl::TypedefEntity( - published, file->readNameLen(offset + 1)); + return new 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 >()); + throw FileFormatException( + file->uri, + "UNOIDL format: too many constants in constant group"); } 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: constant group map offset + size too" + " large")); } - MapEntry const * p = reinterpret_cast< MapEntry const * >( - static_cast< char const * >(file->address) + offset + 5); - std::vector< unoidl::ConstantGroupEntity::Member > mems; + detail::MapEntry const * p + = reinterpret_cast< detail::MapEntry const * >( + static_cast< char const * >(file->address) + offset + 5); + std::vector< ConstantGroupEntity::Member > mems; for (sal_uInt32 i = 0; i != n; ++i) { mems.push_back( - unoidl::ConstantGroupEntity::Member( + ConstantGroupEntity::Member( file->readNameNul(p[i].name.getUnsigned32()), readConstant(file, p[i].data.getUnsigned32()))); } - return new unoidl::ConstantGroupEntity(published, mems); + return new 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; + OUString base(file->readNameLen(offset + 1, &offset)); + std::vector< SingleInterfaceBasedServiceEntity::Constructor > ctors; if (flag) { ctors.push_back( - unoidl::SingleInterfaceBasedServiceEntity::Constructor()); + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many constructors of" + " single-interface--based service")); } offset += 4; for (sal_uInt32 i = 0; i != n; ++i) { - rtl::OUString ctorName(file->readNameLen(offset, &offset)); + 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" + throw FileFormatException( + file->uri, + ("UNOIDL format: too many parameters for" " constructor " + ctorName - + " of single-interface--based service"), - css::uno::Reference< css::uno::XInterface >()); + + " of single-interface--based service")); } offset += 4; std::vector< - unoidl::SingleInterfaceBasedServiceEntity::Constructor:: + 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)); + OUString paramName(file->readNameLen(offset, &offset)); + OUString paramType(file->readNameLen(offset, &offset)); bool rest; switch (v) { case 0: @@ -1142,164 +1099,160 @@ rtl::Reference< unoidl::Entity > readEntity( rest = true; break; default: - throw css::uno::DeploymentException( - ("broken UNOIDL file: bad mode " - + rtl::OUString::number(v) + " of parameter " + throw FileFormatException( + file->uri, + ("UNOIDL format: bad mode " + + OUString::number(v) + " of parameter " + paramName + " for constructor " + ctorName - + " of single-interface--based service"), - css::uno::Reference< css::uno::XInterface >()); + + " of single-interface--based service")); } params.push_back( - unoidl::SingleInterfaceBasedServiceEntity:: - Constructor::Parameter( + SingleInterfaceBasedServiceEntity::Constructor:: + Parameter( paramName, paramType, rest)); } - std::vector< rtl::OUString > excs; + std::vector< OUString > excs; m = file->read32(offset); if (m > SAL_MAX_INT32) { - throw css::uno::DeploymentException( - ("broken UNOIDL file: too many exceptions for" + throw FileFormatException( + file->uri, + ("UNOIDL format: too many exceptions for" " constructor " + ctorName - + " of single-interface--based service"), - css::uno::Reference< css::uno::XInterface >()); + + " of single-interface--based service")); } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { excs.push_back(file->readNameLen(offset, &offset)); } ctors.push_back( - unoidl::SingleInterfaceBasedServiceEntity::Constructor( + SingleInterfaceBasedServiceEntity::Constructor( ctorName, params, excs)); } } - return new unoidl::SingleInterfaceBasedServiceEntity( + return new 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct mandatory service bases of" + " accumulation-based service")); } offset += 5; - std::vector< rtl::OUString > mandServs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct optional service bases of" + " accumulation-based service")); } offset += 4; - std::vector< rtl::OUString > optServs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct mandatory interface bases" + " of accumulation-based service")); } offset += 4; - std::vector< rtl::OUString > mandIfcs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct optional interface bases" + " of accumulation-based service")); } offset += 4; - std::vector< rtl::OUString > optIfcs; + std::vector< 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: too many direct properties of" + " accumulation-based service")); } offset += 4; - std::vector< unoidl::AccumulationBasedServiceEntity::Property > - props; + std::vector< 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)); + OUString propName(file->readNameLen(offset, &offset)); + 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 >()); + throw FileFormatException( + file->uri, + ("UNOIDL format: bad mode " + OUString::number(v) + + " of property " + propName + + " for accumulation-based servcie")); } props.push_back( - unoidl::AccumulationBasedServiceEntity::Property( + AccumulationBasedServiceEntity::Property( propName, propType, static_cast< - unoidl::AccumulationBasedServiceEntity::Property:: + AccumulationBasedServiceEntity::Property:: Attributes >( attrs))); } - return new unoidl::AccumulationBasedServiceEntity( + return new AccumulationBasedServiceEntity( published, mandServs, optServs, mandIfcs, optIfcs, props); } case 10: // interface-based singleton - return new unoidl::InterfaceBasedSingletonEntity( + return new InterfaceBasedSingletonEntity( published, file->readNameLen(offset + 1)); case 11: // service-based singleton - return new unoidl::ServiceBasedSingletonEntity( + return new 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 >()); + throw FileFormatException( + file->uri, "UNOIDL format: bad type byte " + OUString::number(v)); } } } -UnoidlProvider::UnoidlProvider(rtl::OUString const & uri): - file_(new MappedFile(uri)) +UnoidlProvider::UnoidlProvider(OUString const & uri): + file_(new detail::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 >()); + throw FileFormatException( + file_->uri, + "UNOIDL format: does not begin with magic UNOIDL\\0\\xFF"); } 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 >()); + throw FileFormatException( + file_->uri, "UNOIDL format: root map offset + size too large"); } - mapBegin_ = reinterpret_cast< MapEntry const * >( + mapBegin_ = reinterpret_cast< detail::MapEntry const * >( static_cast< char const * >(file_->address) + off); } -rtl::Reference< unoidl::MapCursor > UnoidlProvider::createRootCursor() const { +rtl::Reference< 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 UnoidlProvider::find(OUString const & name, bool * constant) const { + detail::MapEntry const * mapBegin = mapBegin_; sal_uInt32 mapSize = mapSize_; bool cgroup = false; for (sal_Int32 i = 0;;) { @@ -1336,23 +1289,20 @@ sal_uInt32 UnoidlProvider::find(rtl::OUString const & name, bool * constant) } 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 >()); + throw FileFormatException( + file_->uri, "UNOIDL format: map offset + size too large"); } - mapBegin = reinterpret_cast< MapEntry const * >( + mapBegin = reinterpret_cast< detail::MapEntry const * >( static_cast< char const * >(file_->address) + off + 5); i = j + 1; } } -rtl::Reference< unoidl::Entity > UnoidlProvider::getEntity(sal_uInt32 offset) - const -{ +rtl::Reference< Entity > UnoidlProvider::getEntity(sal_uInt32 offset) const { return readEntity(file_, offset); } -css::uno::Any UnoidlProvider::getConstant(sal_uInt32 offset) const { +ConstantValue UnoidlProvider::getConstant(sal_uInt32 offset) const { return readConstant(file_, offset); } diff --git a/ure/source/README b/ure/source/README index 04368d7c3b1a..345a3e7742aa 100644 --- a/ure/source/README +++ b/ure/source/README @@ -50,6 +50,7 @@ Linux x86, Solaris x86, and Solaris SPARC: /opt/openoffice.org/ure/lib/unorc [private] /opt/openoffice.org/ure/lib/libreg.so.3 [private] /opt/openoffice.org/ure/lib/libstore.so.3 [private] +/opt/openoffice.org/ure/lib/libunoidl.so [private] /opt/openoffice.org/ure/lib/libxmlreader.so [private] /opt/openoffice.org/ure/lib/libjvmaccessgcc3.so.3 [private; Linux x86 only] /opt/openoffice.org/ure/lib/libjvmaccessC52.so.3 [private; Solaris only] @@ -110,6 +111,7 @@ Program Files\URE\bin\libxml2.dll [external] Program Files\URE\bin\uno.ini [private] Program Files\URE\bin\reg3.dll [private] Program Files\URE\bin\store3.dll [private] +Program Files\URE\bin\unoidl.dll [private] Program Files\URE\bin\xmlreader.dll [private] Program Files\URE\bin\jvmaccess3MSC.dll [private] Program Files\URE\bin\jvmfwk3.dll [private]