summaryrefslogtreecommitdiff
path: root/stoc
diff options
context:
space:
mode:
authorDaniel Boelzle <dbo@openoffice.org>2001-05-16 07:02:28 +0000
committerDaniel Boelzle <dbo@openoffice.org>2001-05-16 07:02:28 +0000
commit94008d1cb7a173bc16040c44021dae22cf5724aa (patch)
tree0fee8fd4b47d7f264ac7af6aee0ba1720ac50dd8 /stoc
parentd7fd8d3539e0e3ed1d11fdbb8c330392bdcac6f7 (diff)
optimizations
Diffstat (limited to 'stoc')
-rw-r--r--stoc/source/registry_tdprovider/base.hxx29
-rw-r--r--stoc/source/registry_tdprovider/tdcomp.cxx108
-rw-r--r--stoc/source/registry_tdprovider/tdef.cxx28
-rw-r--r--stoc/source/registry_tdprovider/tdenum.cxx68
-rw-r--r--stoc/source/registry_tdprovider/tdiface.cxx347
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;