diff options
author | Daniel Boelzle <dbo@openoffice.org> | 2001-05-16 07:02:28 +0000 |
---|---|---|
committer | Daniel Boelzle <dbo@openoffice.org> | 2001-05-16 07:02:28 +0000 |
commit | 94008d1cb7a173bc16040c44021dae22cf5724aa (patch) | |
tree | 0fee8fd4b47d7f264ac7af6aee0ba1720ac50dd8 /stoc | |
parent | d7fd8d3539e0e3ed1d11fdbb8c330392bdcac6f7 (diff) |
optimizations
Diffstat (limited to 'stoc')
-rw-r--r-- | stoc/source/registry_tdprovider/base.hxx | 29 | ||||
-rw-r--r-- | stoc/source/registry_tdprovider/tdcomp.cxx | 108 | ||||
-rw-r--r-- | stoc/source/registry_tdprovider/tdef.cxx | 28 | ||||
-rw-r--r-- | stoc/source/registry_tdprovider/tdenum.cxx | 68 | ||||
-rw-r--r-- | stoc/source/registry_tdprovider/tdiface.cxx | 347 |
5 files changed, 313 insertions, 267 deletions
diff --git a/stoc/source/registry_tdprovider/base.hxx b/stoc/source/registry_tdprovider/base.hxx index 71a6dcb4ce21..fb19c08fcf16 100644 --- a/stoc/source/registry_tdprovider/base.hxx +++ b/stoc/source/registry_tdprovider/base.hxx @@ -2,9 +2,9 @@ * * $RCSfile: base.hxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: jsc $ $Date: 2001-03-30 13:46:47 $ + * last change: $Author: dbo $ $Date: 2001-05-16 08:02:28 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -158,8 +158,6 @@ inline Any getRTValue( const RTConstValue & rVal ) //================================================================================================== struct MethodInit { -// WeakReference< XInterfaceMemberTypeDescription > wxMember; - // OUString aTypeName; OUString aMemberName; OUString aReturnTypeName; @@ -169,8 +167,6 @@ struct MethodInit //================================================================================================== struct AttributeInit { -// WeakReference< XInterfaceMemberTypeDescription > wxMember; - // OUString aTypeName; OUString aMemberName; OUString aMemberTypeName; @@ -197,6 +193,7 @@ public: //================================================================================================== class InterfaceTypeDescriptionImpl : public WeakImplHelper1< XInterfaceTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; Sequence< sal_Int8 > _aBytes; @@ -204,10 +201,8 @@ class InterfaceTypeDescriptionImpl : public WeakImplHelper1< XInterfaceTypeDescr Uik _aUik; OUString _aBaseType; - Mutex _aBaseTypeMutex; Reference< XTypeDescription > _xBaseTD; - Mutex _aMembersMutex; sal_Int32 _nBaseOffset; vector< AttributeInit > * _pAttributes; vector< MethodInit > * _pMethods; @@ -231,19 +226,16 @@ public: //================================================================================================== class CompoundTypeDescriptionImpl : public WeakImplHelper1< XCompoundTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; TypeClass _eTypeClass; Sequence< sal_Int8 > _aBytes; OUString _aName; OUString _aBaseType; - Mutex _aBaseTypeMutex; Reference< XTypeDescription > _xBaseTD; - Mutex _aMembersMutex; Sequence< Reference< XTypeDescription > > * _pMembers; - - Mutex _aMemberNamesMutex; Sequence< OUString > * _pMemberNames; public: @@ -274,28 +266,22 @@ public: //================================================================================================== class UnionTypeDescriptionImpl : public WeakImplHelper1< XUnionTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; TypeClass _eTypeClass; Sequence< sal_Int8 > _aBytes; OUString _aName; OUString _aDiscriminantType; - Mutex _aDiscrimantTypeMutex; Reference< XTypeDescription > _xDiscriminantTD; sal_Bool _bInit; -// Mutex _aDefaultTypeMutex; Any _aDefautDisciminant; Reference< XTypeDescription > _xDefaultTD; OUString _aDefaultName; -// Mutex _aMemberDiscriminantsMutex; Sequence< Any > * _pMemberDiscriminants; - - Mutex _aMembersMutex; Sequence< Reference< XTypeDescription > > * _pMembers; - -// Mutex _aMemberNamesMutex; Sequence< OUString > * _pMemberNames; void initMembers() throw(::com::sun::star::uno::RuntimeException); @@ -332,15 +318,14 @@ public: //================================================================================================== class EnumTypeDescriptionImpl : public WeakImplHelper1< XEnumTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; Sequence< sal_Int8 > _aBytes; OUString _aName; sal_Int32 _nDefaultValue; - Mutex _aEnumNamesMutex; Sequence< OUString > * _pEnumNames; - Mutex _aEnumValuesMutex; Sequence< sal_Int32 > * _pEnumValues; public: @@ -369,10 +354,10 @@ public: //================================================================================================== class TypedefTypeDescriptionImpl : public WeakImplHelper1< XIndirectTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; OUString _aName; - Mutex _aRefTDMutex; OUString _aRefName; Reference< XTypeDescription > _xRefTD; diff --git a/stoc/source/registry_tdprovider/tdcomp.cxx b/stoc/source/registry_tdprovider/tdcomp.cxx index 1bc63480ab5a..df1454bf0fd0 100644 --- a/stoc/source/registry_tdprovider/tdcomp.cxx +++ b/stoc/source/registry_tdprovider/tdcomp.cxx @@ -2,9 +2,9 @@ * * $RCSfile: tdcomp.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: jl $ $Date: 2001-03-12 15:36:44 $ + * last change: $Author: dbo $ $Date: 2001-05-16 08:02:28 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -92,20 +92,24 @@ Reference< XTypeDescription > CompoundTypeDescriptionImpl::getBaseType() { if (!_xBaseTD.is() && _aBaseType.getLength()) { - MutexGuard aGuard( _aBaseTypeMutex ); - if (!_xBaseTD.is() && _aBaseType.getLength()) + try { - try - { - if (_xTDMgr->getByHierarchicalName( _aBaseType ) >>= _xBaseTD) - return _xBaseTD; - } - catch (NoSuchElementException &) + Reference< XTypeDescription > xBaseTD; + if (_xTDMgr->getByHierarchicalName( _aBaseType ) >>= xBaseTD) { + MutexGuard aGuard( _aMutex ); + if (! _xBaseTD.is()) + { + _xBaseTD = xBaseTD; + } + return _xBaseTD; } - // never try again, if no base td was found - _aBaseType = OUString(); } + catch (NoSuchElementException &) + { + } + // never try again, if no base td was found + _aBaseType = OUString(); } return _xBaseTD; } @@ -115,35 +119,41 @@ Sequence< Reference< XTypeDescription > > CompoundTypeDescriptionImpl::getMember { if (! _pMembers) { - MutexGuard aGuard( _aMembersMutex ); - if (! _pMembers) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); - Sequence< Reference< XTypeDescription > > * pTempMembers = - new Sequence< Reference< XTypeDescription > >( nFields ); - Reference< XTypeDescription > * pMembers = pTempMembers->getArray(); + sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); + Sequence< Reference< XTypeDescription > > * pTempMembers = + new Sequence< Reference< XTypeDescription > >( nFields ); + Reference< XTypeDescription > * pMembers = pTempMembers->getArray(); - while (nFields--) + while (nFields--) + { + try { - try - { - _xTDMgr->getByHierarchicalName( - aReader.getFieldType( nFields ).replace( '/', '.' ) ) - >>= pMembers[nFields]; - } - catch (NoSuchElementException &) - { - } - OSL_ENSURE( pMembers[nFields].is(), "### compound member unknown!" ); + _xTDMgr->getByHierarchicalName( + aReader.getFieldType( nFields ).replace( '/', '.' ) ) >>= pMembers[nFields]; } + catch (NoSuchElementException &) + { + } + OSL_ENSURE( pMembers[nFields].is(), "### compound member unknown!" ); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pMembers) + { + aGuard.clear(); + delete pTempMembers; + } + else + { _pMembers = pTempMembers; } } + return *_pMembers; } //__________________________________________________________________________________________________ @@ -152,22 +162,28 @@ Sequence< OUString > CompoundTypeDescriptionImpl::getMemberNames() { if (! _pMemberNames) { - MutexGuard aGuard( _aMemberNamesMutex ); - if (! _pMemberNames) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); - Sequence< OUString > * pTempMemberNames = new Sequence< OUString >( nFields ); - OUString * pMemberNames = pTempMemberNames->getArray(); + sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); + Sequence< OUString > * pTempMemberNames = new Sequence< OUString >( nFields ); + OUString * pMemberNames = pTempMemberNames->getArray(); - while (nFields--) - { - pMemberNames[nFields] = aReader.getFieldName( nFields ); - } + while (nFields--) + { + pMemberNames[nFields] = aReader.getFieldName( nFields ); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pMemberNames) + { + aGuard.clear(); + delete pTempMemberNames; + } + else + { _pMemberNames = pTempMemberNames; } } diff --git a/stoc/source/registry_tdprovider/tdef.cxx b/stoc/source/registry_tdprovider/tdef.cxx index bf75f5b116e8..95f29ab9eb10 100644 --- a/stoc/source/registry_tdprovider/tdef.cxx +++ b/stoc/source/registry_tdprovider/tdef.cxx @@ -2,9 +2,9 @@ * * $RCSfile: tdef.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: dbo $ $Date: 2001-03-07 14:48:04 $ + * last change: $Author: dbo $ $Date: 2001-05-16 08:02:28 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -85,20 +85,24 @@ Reference< XTypeDescription > TypedefTypeDescriptionImpl::getReferencedType() { if (!_xRefTD.is() && _aRefName.getLength()) { - MutexGuard aGuard( _aRefTDMutex ); - if (!_xRefTD.is() && _aRefName.getLength()) + try { - try + Reference< XTypeDescription > xRefTD; + if (_xTDMgr->getByHierarchicalName( _aRefName ) >>= xRefTD) { - if (_xTDMgr->getByHierarchicalName( _aRefName ) >>= _xRefTD) - return _xRefTD; + MutexGuard aGuard( _aMutex ); + if (! _xRefTD.is()) + { + _xRefTD = xRefTD; + } + return _xRefTD; } - catch (NoSuchElementException &) - { - } - // never try again, if no base td was found - _aRefName = OUString(); } + catch (NoSuchElementException &) + { + } + // never try again, if no base td was found + _aRefName = OUString(); } return _xRefTD; } diff --git a/stoc/source/registry_tdprovider/tdenum.cxx b/stoc/source/registry_tdprovider/tdenum.cxx index 5d07495a1a72..313fa3d9234b 100644 --- a/stoc/source/registry_tdprovider/tdenum.cxx +++ b/stoc/source/registry_tdprovider/tdenum.cxx @@ -2,9 +2,9 @@ * * $RCSfile: tdenum.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: hr $ $Date: 2000-09-18 15:29:35 $ + * last change: $Author: dbo $ $Date: 2001-05-16 08:02:28 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -98,22 +98,28 @@ Sequence< OUString > EnumTypeDescriptionImpl::getEnumNames() { if (! _pEnumNames) { - MutexGuard aGuard( _aEnumNamesMutex ); - if (! _pEnumNames) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); - Sequence< OUString > * pTempEnumNames = new Sequence< OUString >( nFields ); - OUString * pEnumNames = pTempEnumNames->getArray(); + sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); + Sequence< OUString > * pTempEnumNames = new Sequence< OUString >( nFields ); + OUString * pEnumNames = pTempEnumNames->getArray(); - while (nFields--) - { - pEnumNames[nFields] = aReader.getFieldName( nFields ); - } + while (nFields--) + { + pEnumNames[nFields] = aReader.getFieldName( nFields ); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pEnumNames) + { + aGuard.clear(); + delete pTempEnumNames; + } + else + { _pEnumNames = pTempEnumNames; } } @@ -125,22 +131,28 @@ Sequence< sal_Int32 > EnumTypeDescriptionImpl::getEnumValues() { if (! _pEnumValues) { - MutexGuard aGuard( _aEnumValuesMutex ); - if (! _pEnumValues) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); - Sequence< sal_Int32 > * pTempEnumValues = new Sequence< sal_Int32 >( nFields ); - sal_Int32 * pEnumValues = pTempEnumValues->getArray(); + sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); + Sequence< sal_Int32 > * pTempEnumValues = new Sequence< sal_Int32 >( nFields ); + sal_Int32 * pEnumValues = pTempEnumValues->getArray(); - while (nFields--) - { - pEnumValues[nFields] = getRTValueAsInt32( aReader.getFieldConstValue( nFields ) ); - } + while (nFields--) + { + pEnumValues[nFields] = getRTValueAsInt32( aReader.getFieldConstValue( nFields ) ); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pEnumValues) + { + aGuard.clear(); + delete pTempEnumValues; + } + else + { _pEnumValues = pTempEnumValues; } } diff --git a/stoc/source/registry_tdprovider/tdiface.cxx b/stoc/source/registry_tdprovider/tdiface.cxx index 3711ec795548..78f9034d9f68 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.3 $ + * $Revision: 1.4 $ * - * last change: $Author: jl $ $Date: 2001-03-12 15:36:44 $ + * last change: $Author: dbo $ $Date: 2001-05-16 08:02:28 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -80,11 +80,11 @@ namespace stoc_rdbtdp //================================================================================================== class MethodParameterImpl : public WeakImplHelper1< XMethodParameter > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; OUString _aName; OUString _aTypeName; - Mutex _aTypeMutex; Reference< XTypeDescription > _xType; sal_Bool _bIn; @@ -124,20 +124,24 @@ Reference<XTypeDescription > MethodParameterImpl::getType() { if (!_xType.is() && _aTypeName.getLength()) { - MutexGuard aGuard( _aTypeMutex ); - if (!_xType.is() && _aTypeName.getLength()) + try { - try - { - if (_xTDMgr->getByHierarchicalName( _aTypeName ) >>= _xType) - return _xType; - } - catch (NoSuchElementException &) + Reference< XTypeDescription > xType; + if (_xTDMgr->getByHierarchicalName( _aTypeName ) >>= xType) { + MutexGuard aGuard( _aMutex ); + if (! _xType.is()) + { + _xType = xType; + } + return _xType; } - // never try again, if no td was found - _aTypeName = OUString(); } + catch (NoSuchElementException &) + { + } + // never try again, if no td was found + _aTypeName = OUString(); } return _xType; } @@ -169,20 +173,18 @@ sal_Int32 MethodParameterImpl::getPosition() //================================================================================================== class InterfaceMethodImpl : public WeakImplHelper1< XInterfaceMethodTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; OUString _aTypeName; OUString _aMemberName; OUString _aReturnType; - Mutex _aReturnTypeMutex; Reference< XTypeDescription > _xReturnTD; Sequence< sal_Int8 > _aBytes; sal_uInt16 _nMethodIndex; - Mutex _aParamsMutex; Sequence< Reference< XMethodParameter > > * _pParams; - Mutex _aExcMutex; Sequence< Reference< XTypeDescription > > * _pExceptions; sal_Bool _bIsOneWay; @@ -266,20 +268,24 @@ Reference<XTypeDescription > InterfaceMethodImpl::getReturnType() { if (!_xReturnTD.is() && _aReturnType.getLength()) { - MutexGuard aGuard( _aReturnTypeMutex ); - if (!_xReturnTD.is() && _aReturnType.getLength()) + try { - try - { - if (_xTDMgr->getByHierarchicalName( _aReturnType ) >>= _xReturnTD) - return _xReturnTD; - } - catch (NoSuchElementException &) + Reference< XTypeDescription > xReturnTD; + if (_xTDMgr->getByHierarchicalName( _aReturnType ) >>= xReturnTD) { + MutexGuard aGuard( _aMutex ); + if (! _xReturnTD.is()) + { + _xReturnTD = xReturnTD; + } + return _xReturnTD; } - // never try again, if no td was found - _aReturnType = OUString(); } + catch (NoSuchElementException &) + { + } + // never try again, if no td was found + _aReturnType = OUString(); } return _xReturnTD; } @@ -295,31 +301,37 @@ Sequence<Reference<XMethodParameter > > InterfaceMethodImpl::getParameters() { if (! _pParams) { - MutexGuard aGuard( _aParamsMutex ); - if (! _pParams) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - sal_uInt16 nParams = (sal_uInt16)aReader.getMethodParamCount( _nMethodIndex ); - Sequence< Reference< XMethodParameter > > * pTempParams = - new Sequence< Reference< XMethodParameter > >( nParams ); - Reference< XMethodParameter > * pParams = pTempParams->getArray(); + sal_uInt16 nParams = (sal_uInt16)aReader.getMethodParamCount( _nMethodIndex ); + Sequence< Reference< XMethodParameter > > * pTempParams = + new Sequence< Reference< XMethodParameter > >( nParams ); + Reference< XMethodParameter > * pParams = pTempParams->getArray(); - while (nParams--) - { - RTParamMode eMode = aReader.getMethodParamMode( _nMethodIndex, nParams ); - - pParams[nParams] = new MethodParameterImpl( - _xTDMgr, - aReader.getMethodParamName( _nMethodIndex, nParams ), - aReader.getMethodParamType( _nMethodIndex, nParams ).replace( '/', '.' ), - (eMode == RT_PARAM_IN || eMode == RT_PARAM_INOUT), - (eMode == RT_PARAM_OUT || eMode == RT_PARAM_INOUT), - nParams ); - } + while (nParams--) + { + RTParamMode eMode = aReader.getMethodParamMode( _nMethodIndex, nParams ); + + pParams[nParams] = new MethodParameterImpl( + _xTDMgr, + aReader.getMethodParamName( _nMethodIndex, nParams ), + aReader.getMethodParamType( _nMethodIndex, nParams ).replace( '/', '.' ), + (eMode == RT_PARAM_IN || eMode == RT_PARAM_INOUT), + (eMode == RT_PARAM_OUT || eMode == RT_PARAM_INOUT), + nParams ); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pParams) + { + aGuard.clear(); + delete pTempParams; + } + else + { _pParams = pTempParams; } } @@ -331,32 +343,38 @@ Sequence<Reference<XTypeDescription > > InterfaceMethodImpl::getExceptions() { if (! _pExceptions) { - MutexGuard aGuard( _aExcMutex ); - if (! _pExceptions) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - sal_uInt16 nExc = (sal_uInt16)aReader.getMethodExcCount( _nMethodIndex ); - Sequence< Reference< XTypeDescription > > * pExceptions = - new Sequence< Reference< XTypeDescription > >( nExc ); - Reference< XTypeDescription > * pExc = pExceptions->getArray(); + sal_uInt16 nExc = (sal_uInt16)aReader.getMethodExcCount( _nMethodIndex ); + Sequence< Reference< XTypeDescription > > * pExceptions = + new Sequence< Reference< XTypeDescription > >( nExc ); + Reference< XTypeDescription > * pExc = pExceptions->getArray(); - while (nExc--) + while (nExc--) + { + try { - try - { - OUString aMethodExcName( aReader.getMethodExcType( _nMethodIndex, nExc ) ); - _xTDMgr->getByHierarchicalName( aMethodExcName.replace( '/', '.' ) ) - >>= pExc[ nExc ]; - } - catch (NoSuchElementException &) - { - } - OSL_ENSURE( pExc[nExc].is(), "### exception type unknown!" ); + OUString aMethodExcName( aReader.getMethodExcType( _nMethodIndex, nExc ) ); + _xTDMgr->getByHierarchicalName( aMethodExcName.replace( '/', '.' ) ) + >>= pExc[ nExc ]; } + catch (NoSuchElementException &) + { + } + OSL_ENSURE( pExc[nExc].is(), "### exception type unknown!" ); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pExceptions) + { + aGuard.clear(); + delete pExceptions; + } + else + { _pExceptions = pExceptions; } } @@ -372,13 +390,13 @@ Sequence<Reference<XTypeDescription > > InterfaceMethodImpl::getExceptions() //================================================================================================== class InterfaceAttributeImpl : public WeakImplHelper1< XInterfaceAttributeTypeDescription > { + Mutex _aMutex; Reference< XHierarchicalNameAccess > _xTDMgr; OUString _aTypeName; OUString _aMemberName; OUString _aMemberTypeName; - Mutex _aMemberTypeMutex; Reference< XTypeDescription > _xMemberTD; sal_Bool _bReadOnly; @@ -453,20 +471,24 @@ Reference<XTypeDescription > InterfaceAttributeImpl::getType() { if (!_xMemberTD.is() && _aMemberTypeName.getLength()) { - MutexGuard aGuard( _aMemberTypeMutex ); - if (!_xMemberTD.is() && _aMemberTypeName.getLength()) + try { - try - { - if (_xTDMgr->getByHierarchicalName( _aMemberTypeName ) >>= _xMemberTD) - return _xMemberTD; - } - catch (NoSuchElementException &) + Reference< XTypeDescription > xMemberTD; + if (_xTDMgr->getByHierarchicalName( _aMemberTypeName ) >>= xMemberTD) { + MutexGuard aGuard( _aMutex ); + if (! _xMemberTD.is()) + { + _xMemberTD = xMemberTD; + } + return _xMemberTD; } - // never try again, if no td was found - _aMemberTypeName = OUString(); } + catch (NoSuchElementException &) + { + } + // never try again, if no td was found + _aMemberTypeName = OUString(); } return _xMemberTD; } @@ -524,20 +546,24 @@ Reference< XTypeDescription > InterfaceTypeDescriptionImpl::getBaseType() { if (!_xBaseTD.is() && _aBaseType.getLength()) { - MutexGuard aGuard( _aBaseTypeMutex ); - if (!_xBaseTD.is() && _aBaseType.getLength()) + try { - try - { - if (_xTDMgr->getByHierarchicalName( _aBaseType ) >>= _xBaseTD) - return _xBaseTD; - } - catch (NoSuchElementException &) + Reference< XTypeDescription > xBaseTD; + if (_xTDMgr->getByHierarchicalName( _aBaseType ) >>= xBaseTD) { + MutexGuard aGuard( _aMutex ); + if (! _xBaseTD.is()) + { + _xBaseTD = xBaseTD; + } + return _xBaseTD; } - // never try again, if no base td was found - _aBaseType = OUString(); } + catch (NoSuchElementException &) + { + } + // never try again, if no base td was found + _aBaseType = OUString(); } return _xBaseTD; } @@ -553,72 +579,81 @@ Sequence< Reference< XInterfaceMemberTypeDescription > > InterfaceTypeDescriptio { if (! _pMethods) { - MutexGuard aGuard( _aMembersMutex ); - if (! _pMethods) - { - RegistryTypeReaderLoader aLoader; - RegistryTypeReader aReader( aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), - _aBytes.getLength(), sal_False ); - sal_uInt16 nMethods = (sal_uInt16)aReader.getMethodCount(); - sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); + RegistryTypeReaderLoader aLoader; + RegistryTypeReader aReader( + aLoader, (const sal_uInt8 *)_aBytes.getConstArray(), + _aBytes.getLength(), sal_False ); - vector< AttributeInit > * pAttributes = new vector< AttributeInit >( nFields ); - vector< MethodInit > * pMethods = new vector< MethodInit >( nMethods ); + sal_uInt16 nMethods = (sal_uInt16)aReader.getMethodCount(); + sal_uInt16 nFields = (sal_uInt16)aReader.getFieldCount(); - OUString aInterfaceName( getName() ); + vector< AttributeInit > * pAttributes = new vector< AttributeInit >( nFields ); + vector< MethodInit > * pMethods = new vector< MethodInit >( nMethods ); - // base offsets - _nBaseOffset = 0; + OUString aInterfaceName( getName() ); - Reference< XTypeDescription > xBase( getBaseType(), UNO_QUERY ); - while (xBase.is()) + // 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()) { - 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(); + nBaseOffset = aBaseMembers[aBaseMembers.getLength()-1]->getPosition() +1; + break; } + xBase = xBaseInterface->getBaseType(); + } - // all methods - while (nMethods--) - { - OUString aMemberName( aReader.getMethodName( nMethods ) ); - OUStringBuffer aTypeName( aInterfaceName ); - aTypeName.appendAscii( RTL_CONSTASCII_STRINGPARAM("::") ); - aTypeName.append( aMemberName ); + // all methods + while (nMethods--) + { + OUString aMemberName( aReader.getMethodName( nMethods ) ); + OUStringBuffer aTypeName( aInterfaceName ); + aTypeName.appendAscii( RTL_CONSTASCII_STRINGPARAM("::") ); + aTypeName.append( aMemberName ); - RTMethodMode eMode = aReader.getMethodMode( nMethods ); + RTMethodMode eMode = aReader.getMethodMode( nMethods ); - MethodInit & rInit = pMethods->operator[]( nMethods ); + MethodInit & rInit = pMethods->operator[]( nMethods ); - rInit.aTypeName = aTypeName.makeStringAndClear(); - rInit.aMemberName = aMemberName; - rInit.aReturnTypeName = aReader.getMethodReturnType( nMethods ).replace( '/', '.' ); - rInit.nMethodIndex = nMethods; - rInit.bOneWay = (eMode == RT_MODE_ONEWAY || eMode == RT_MODE_ONEWAY_CONST); - } + rInit.aTypeName = aTypeName.makeStringAndClear(); + rInit.aMemberName = aMemberName; + rInit.aReturnTypeName = aReader.getMethodReturnType( nMethods ).replace( '/', '.' ); + rInit.nMethodIndex = nMethods; + rInit.bOneWay = (eMode == RT_MODE_ONEWAY || eMode == RT_MODE_ONEWAY_CONST); + } - // all fields - while (nFields--) - { - OUString aMemberName( aReader.getFieldName( nFields ) ); - OUString aMemberType( aReader.getFieldType( nFields ).replace( '/', '.' ) ); - OUStringBuffer aTypeName( aInterfaceName ); - aTypeName.appendAscii( RTL_CONSTASCII_STRINGPARAM("::") ); - aTypeName.append( aMemberName ); - - AttributeInit & rInit = pAttributes->operator[]( nFields ); - - rInit.aTypeName = aTypeName.makeStringAndClear(); - rInit.aMemberName = aMemberName; - rInit.aMemberTypeName = aMemberType; - rInit.bReadOnly = (aReader.getFieldAccess( nFields ) == RT_ACCESS_READONLY); - } + // all fields + while (nFields--) + { + OUString aMemberName( aReader.getFieldName( nFields ) ); + OUString aMemberType( aReader.getFieldType( nFields ).replace( '/', '.' ) ); + OUStringBuffer aTypeName( aInterfaceName ); + aTypeName.appendAscii( RTL_CONSTASCII_STRINGPARAM("::") ); + aTypeName.append( aMemberName ); + + AttributeInit & rInit = pAttributes->operator[]( nFields ); + + rInit.aTypeName = aTypeName.makeStringAndClear(); + rInit.aMemberName = aMemberName; + rInit.aMemberTypeName = aMemberType; + rInit.bReadOnly = (aReader.getFieldAccess( nFields ) == RT_ACCESS_READONLY); + } + ClearableMutexGuard aGuard( _aMutex ); + if (_pMethods) + { + aGuard.clear(); + delete pAttributes; + delete pMethods; + } + else + { + _nBaseOffset = nBaseOffset; _pAttributes = pAttributes; _pMethods = pMethods; } @@ -633,24 +668,18 @@ Sequence< Reference< XInterfaceMemberTypeDescription > > InterfaceTypeDescriptio while (nMethods--) { - MethodInit & rInit = _pMethods->operator[]( nMethods ); -/* if (! (pMembers[nAttributes+nMethods] = rInit.wxMember).is()) - { - rInit.wxMember = */pMembers[nAttributes+nMethods] = new InterfaceMethodImpl( - _xTDMgr, rInit.aTypeName, rInit.aMemberName, - rInit.aReturnTypeName, _aBytes, rInit.nMethodIndex, - rInit.bOneWay, _nBaseOffset+nAttributes+nMethods ); -// } + MethodInit const & rInit = _pMethods->operator[]( nMethods ); + pMembers[nAttributes+nMethods] = new InterfaceMethodImpl( + _xTDMgr, rInit.aTypeName, rInit.aMemberName, + rInit.aReturnTypeName, _aBytes, rInit.nMethodIndex, + rInit.bOneWay, _nBaseOffset+nAttributes+nMethods ); } while (nAttributes--) { - AttributeInit & rInit = _pAttributes->operator[]( nAttributes ); -/* if (! (pMembers[nAttributes] = rInit.wxMember).is()) - { - rInit.wxMember = */pMembers[nAttributes] = new InterfaceAttributeImpl( - _xTDMgr, rInit.aTypeName, rInit.aMemberName, rInit.aMemberTypeName, - rInit.bReadOnly, _nBaseOffset+nAttributes ); -// } + AttributeInit const & rInit = _pAttributes->operator[]( nAttributes ); + pMembers[nAttributes] = new InterfaceAttributeImpl( + _xTDMgr, rInit.aTypeName, rInit.aMemberName, rInit.aMemberTypeName, + rInit.bReadOnly, _nBaseOffset+nAttributes ); } return aMembers; |