diff options
author | Martin Gallwey <mtg@openoffice.org> | 2000-12-19 20:55:41 +0000 |
---|---|---|
committer | Martin Gallwey <mtg@openoffice.org> | 2000-12-19 20:55:41 +0000 |
commit | 8d831711c6e381660eb19d2d5a0f1b9dd988d589 (patch) | |
tree | 11eb80765c878776c6d5638217c6a618dd873ff1 /package/source/zippackage/ZipPackageFolder.cxx | |
parent | 14baa97cf80c5c40d4df68d864e2c85e6d9a9125 (diff) |
many optimisations and memory leaks due to circular references fixed! An altogether amazing commit...tell your friends
Diffstat (limited to 'package/source/zippackage/ZipPackageFolder.cxx')
-rw-r--r-- | package/source/zippackage/ZipPackageFolder.cxx | 97 |
1 files changed, 65 insertions, 32 deletions
diff --git a/package/source/zippackage/ZipPackageFolder.cxx b/package/source/zippackage/ZipPackageFolder.cxx index 32e4fbdb201a..3c03f25d8dcd 100644 --- a/package/source/zippackage/ZipPackageFolder.cxx +++ b/package/source/zippackage/ZipPackageFolder.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackageFolder.cxx,v $ * - * $Revision: 1.21 $ + * $Revision: 1.22 $ * - * last change: $Author: mtg $ $Date: 2000-12-13 17:00:47 $ + * last change: $Author: mtg $ $Date: 2000-12-19 21:55:41 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -54,7 +54,7 @@ * * All Rights Reserved. * - * Contributor(s): _______________________________________ + * Contributor(s): Martin Gallwey (gallwey@sun.com) * * ************************************************************************/ @@ -64,6 +64,7 @@ using namespace com::sun::star::package::ZipConstants; using namespace com::sun::star; +using namespace cppu; using namespace rtl; ZipPackageFolder::ZipPackageFolder (void) @@ -100,42 +101,41 @@ void ZipPackageFolder::copyZipEntry( com::sun::star::package::ZipEntry &rDest, c uno::Any SAL_CALL ZipPackageFolder::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) { - // Ask for my own supported interfaces ... - uno::Any aReturn ( ::cppu::queryInterface ( rType , - static_cast< container::XNamed* > ( this ) , - static_cast< container::XChild* > ( this ) , - static_cast< container::XNameContainer* > ( this ) , - static_cast< container::XEnumerationAccess* > ( this ) , - static_cast< lang::XUnoTunnel* > ( this ) , - static_cast< beans::XPropertySet* > ( this ) ) ) ; - - // If searched interface supported by this class ... - if ( aReturn.hasValue () == sal_True ) - { - // ... return this information. - return aReturn ; - } - else - { - // Else; ... ask baseclass for interfaces! - return ZipPackageEntry::queryInterface ( rType ) ; - } + // cppu::queryInterface is an inline template so it's fast + // unfortunately, it always creates an Any...we should be able to optimise + // this with a class static containing supported interfaces + // ...will research this further ...mtg 15/12/00 + return ::cppu::queryInterface ( rType , + // OWeakObject interfaces + reinterpret_cast< uno::XInterface* > ( this ) , + static_cast< uno::XWeak* > ( this ) , + // ZipPackageEntry interfaces + static_cast< container::XNamed* > ( this ) , + static_cast< container::XChild* > ( this ) , + static_cast< lang::XUnoTunnel* > ( this ) , + // my own interfaces + static_cast< container::XNameContainer* > ( this ) , + static_cast< container::XEnumerationAccess* > ( this ) , + static_cast< beans::XPropertySet* > ( this ) ); + } + void SAL_CALL ZipPackageFolder::acquire( ) throw() { - ZipPackageEntry::acquire(); + OWeakObject::acquire(); } void SAL_CALL ZipPackageFolder::release( ) throw() { - ZipPackageEntry::release(); + OWeakObject::release(); } + // XNameContainer void SAL_CALL ZipPackageFolder::insertByName( const ::rtl::OUString& aName, const uno::Any& aElement ) throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException) { - OUString sName; + static OUString sName; if (aName.indexOf('/', 0 ) == 0) sName = aName.copy(1, aName.getLength()); else @@ -165,7 +165,7 @@ void SAL_CALL ZipPackageFolder::insertByName( const ::rtl::OUString& aName, cons void SAL_CALL ZipPackageFolder::removeByName( const ::rtl::OUString& Name ) throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) { - OUString sName; + static OUString sName; if (Name.indexOf('/', 0 ) == 0) sName = Name.copy(1, Name.getLength()); else @@ -196,7 +196,7 @@ uno::Any SAL_CALL ZipPackageFolder::getByName( const ::rtl::OUString& aName ) throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) { uno::Any aAny; - OUString sName; + static OUString sName; if (aName.indexOf('/', 0 ) == 0) sName = aName.copy(1, aName.getLength()); else @@ -220,7 +220,7 @@ uno::Sequence< ::rtl::OUString > SAL_CALL ZipPackageFolder::getElementNames( ) sal_Bool SAL_CALL ZipPackageFolder::hasByName( const ::rtl::OUString& aName ) throw(uno::RuntimeException) { - OUString sName; + static OUString sName; if (aName.indexOf('/', 0 ) == 0) sName = aName.copy(1, aName.getLength()); else @@ -231,7 +231,7 @@ sal_Bool SAL_CALL ZipPackageFolder::hasByName( const ::rtl::OUString& aName ) void SAL_CALL ZipPackageFolder::replaceByName( const ::rtl::OUString& aName, const uno::Any& aElement ) throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) { - OUString sName; + static OUString sName; if (aName.indexOf('/', 0 ) == 0) sName = aName.copy(1, aName.getLength()); else @@ -261,15 +261,14 @@ void SAL_CALL ZipPackageFolder::setPropertyValue( const ::rtl::OUString& aProper uno::Any SAL_CALL ZipPackageFolder::getPropertyValue( const ::rtl::OUString& PropertyName ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { + uno::Any aAny; if (PropertyName == OUString::createFromAscii("MediaType")) { - uno::Any aAny; aAny <<= sMediaType; return aAny; } else if (PropertyName == OUString::createFromAscii("Size")) { - uno::Any aAny; aAny <<= aEntry.nSize; return aAny; } @@ -499,6 +498,40 @@ void ZipPackageFolder::saveContents(rtl::OUString &rPath, std::vector < Manifest } } } + +void ZipPackageFolder::releaseUpwardRef( void ) +{ + uno::Reference < lang::XUnoTunnel > xTunnel; + ZipPackageFolder *pFolder = NULL; + ZipPackageStream *pStream = NULL; + sal_Bool bIsFolder; + TunnelHash::const_iterator aCI = aContents.begin(); + + for (;aCI!=aContents.end();aCI++) + { + xTunnel = uno::Reference < lang::XUnoTunnel> ((*aCI).second, uno::UNO_QUERY); + sal_Int64 nTest=0; + if ((nTest = xTunnel->getSomething(ZipPackageFolder::getUnoTunnelImplementationId())) != 0) + { + pFolder = reinterpret_cast < ZipPackageFolder* > ( nTest ); + bIsFolder = sal_True; + } + else + { + nTest = xTunnel->getSomething(ZipPackageStream::getUnoTunnelImplementationId()); + pStream = reinterpret_cast < ZipPackageStream* > ( nTest ); + bIsFolder = sal_False; + } + + if (bIsFolder) + { + pFolder->releaseUpwardRef(); + pFolder->clearParent(); + } + else + pStream->clearParent(); + } +} void ZipPackageFolder::updateReferences( ZipFile * pNewZipFile) { uno::Reference < lang::XUnoTunnel > xTunnel; |