diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-02-03 11:04:03 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-02-03 11:04:03 +0000 |
commit | 4adc2f2671c52c2ee6b91c8ab86e142d2163c658 (patch) | |
tree | 1e81a81498f44354421da623358789b8d4968aea /stoc | |
parent | 9666f66ccb8069ace7d98e7de4ad61b0a7a29a56 (diff) |
INTEGRATION: CWS sb10 (1.6.80); FILE MERGED
2003/12/10 09:40:04 sb 1.6.80.1: #114000# Adapted to multiple-inheritance interface types.
Diffstat (limited to 'stoc')
-rw-r--r-- | stoc/source/registry_tdprovider/tdiface.cxx | 133 |
1 files changed, 91 insertions, 42 deletions
diff --git a/stoc/source/registry_tdprovider/tdiface.cxx b/stoc/source/registry_tdprovider/tdiface.cxx index bb1aed6bf55a..85ad85c7f61b 100644 --- a/stoc/source/registry_tdprovider/tdiface.cxx +++ b/stoc/source/registry_tdprovider/tdiface.cxx @@ -2,9 +2,9 @@ * * $RCSfile: tdiface.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: kso $ $Date: 2002-11-11 08:35:48 $ + * last change: $Author: hr $ $Date: 2004-02-03 12:04:03 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -75,6 +75,8 @@ #include "base.hxx" #endif +#include <set> + namespace stoc_rdbtdp { @@ -516,15 +518,56 @@ Reference<XTypeDescription > InterfaceAttributeImpl::getType() //################################################################################################## //################################################################################################## +namespace { + +class BaseOffset { +public: + BaseOffset(Reference< XInterfaceTypeDescription2 > const & desc); + + sal_Int32 get() const { return offset; } + +private: + void calculateBases(Reference< XInterfaceTypeDescription2 > const & desc); + + void calculate(Reference< XInterfaceTypeDescription2 > const & desc); + + std::set< rtl::OUString > set; + sal_Int32 offset; +}; + +BaseOffset::BaseOffset(Reference< XInterfaceTypeDescription2 > const & desc) { + offset = 0; + calculateBases(desc); +} + +void BaseOffset::calculateBases( + Reference< XInterfaceTypeDescription2 > const & desc) +{ + Sequence< Reference < XInterfaceTypeDescription2 > > bases( + desc->getBaseTypes()); + for (sal_Int32 i = 0; i < bases.getLength(); ++i) { + calculate(bases[i]); + } +} + +void BaseOffset::calculate(Reference< XInterfaceTypeDescription2 > const & desc) +{ + if (set.insert(desc->getName()).second) { + calculateBases(desc); + offset += desc->getMembers().getLength(); + } +} + +} //__________________________________________________________________________________________________ InterfaceTypeDescriptionImpl::InterfaceTypeDescriptionImpl( const Reference< XHierarchicalNameAccess > & xTDMgr, - const OUString & rName, const OUString & rBaseType, + const OUString & rName, const Sequence< OUString > & rBaseTypes, const RTUik & rUik, const Sequence< sal_Int8 > & rBytes ) : _xTDMgr( xTDMgr ) , _aName( rName ) - , _aBaseType( rBaseType ) + , _aBaseTypes( rBaseTypes ) , _aBytes( rBytes ) , _pAttributes( 0 ) , _pMethods( 0 ) @@ -559,33 +602,15 @@ OUString InterfaceTypeDescriptionImpl::getName() return _aName; } -// XInterfaceTypeDescription +// XInterfaceTypeDescription2 //__________________________________________________________________________________________________ Reference< XTypeDescription > InterfaceTypeDescriptionImpl::getBaseType() throw(::com::sun::star::uno::RuntimeException) { - if (!_xBaseTD.is() && _aBaseType.getLength()) - { - try - { - Reference< XTypeDescription > xBaseTD; - if (_xTDMgr->getByHierarchicalName( _aBaseType ) >>= xBaseTD) - { - MutexGuard aGuard( _aMutex ); - if (! _xBaseTD.is()) - { - _xBaseTD = xBaseTD; - } - return _xBaseTD; - } - } - catch (NoSuchElementException &) - { - } - // never try again, if no base td was found - _aBaseType = OUString(); - } - return _xBaseTD; + Sequence< Reference< XInterfaceTypeDescription2 > > aBaseTypes( + getBaseTypes()); + return aBaseTypes.getLength() >= 1 + ? Reference< XTypeDescription >(aBaseTypes[0], UNO_QUERY) : 0; } //__________________________________________________________________________________________________ Uik SAL_CALL InterfaceTypeDescriptionImpl::getUik() @@ -612,21 +637,7 @@ Sequence< Reference< XInterfaceMemberTypeDescription > > InterfaceTypeDescriptio OUString aInterfaceName( getName() ); - // base offsets - sal_Int32 nBaseOffset = 0; - - Reference< XTypeDescription > xBase( getBaseType(), UNO_QUERY ); - while (xBase.is()) - { - Reference< XInterfaceTypeDescription > xBaseInterface( xBase, UNO_QUERY ); - Sequence< Reference< XInterfaceMemberTypeDescription > > aBaseMembers( xBaseInterface->getMembers() ); - if (aBaseMembers.getLength()) - { - nBaseOffset = aBaseMembers[aBaseMembers.getLength()-1]->getPosition() +1; - break; - } - xBase = xBaseInterface->getBaseType(); - } + sal_Int32 nBaseOffset = BaseOffset(this).get(); // all methods while (nMethods--) @@ -704,6 +715,44 @@ Sequence< Reference< XInterfaceMemberTypeDescription > > InterfaceTypeDescriptio return aMembers; } +//__________________________________________________________________________________________________ +Sequence< Reference< XInterfaceTypeDescription2 > > InterfaceTypeDescriptionImpl::getBaseTypes() + throw(::com::sun::star::uno::RuntimeException) +{ + if (_xBaseTDs.getLength() == 0 && _aBaseTypes.getLength() != 0) + { + try + { + Sequence< Reference< XInterfaceTypeDescription2 > > xBaseTDs( + _aBaseTypes.getLength()); + bool bSuccess = true; + for (sal_Int32 i = 0; i < _aBaseTypes.getLength(); ++i) + { + if (!(_xTDMgr->getByHierarchicalName( _aBaseTypes[i] ) + >>= xBaseTDs[i])) + { + bSuccess = false; + break; + } + } + if (bSuccess) + { + MutexGuard aGuard( _aMutex ); + if (_xBaseTDs.getLength() == 0) + { + _xBaseTDs = xBaseTDs; + } + return _xBaseTDs; + } + } + catch (NoSuchElementException &) + { + } + // never try again, if no base tds were found + _aBaseTypes.realloc(0); + } + return _xBaseTDs; +} } |