summaryrefslogtreecommitdiff
path: root/package/source/zippackage/ZipPackageFolder.cxx
diff options
context:
space:
mode:
authorMartin Gallwey <mtg@openoffice.org>2000-12-19 20:55:41 +0000
committerMartin Gallwey <mtg@openoffice.org>2000-12-19 20:55:41 +0000
commit8d831711c6e381660eb19d2d5a0f1b9dd988d589 (patch)
tree11eb80765c878776c6d5638217c6a618dd873ff1 /package/source/zippackage/ZipPackageFolder.cxx
parent14baa97cf80c5c40d4df68d864e2c85e6d9a9125 (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.cxx97
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;