diff options
author | Joseph Powers <jpowers27@cox.net> | 2011-02-01 22:03:59 -0800 |
---|---|---|
committer | Joseph Powers <jpowers27@cox.net> | 2011-02-01 22:03:59 -0800 |
commit | e043b2117458380e7d680db739cfb3fee7f6f5c1 (patch) | |
tree | 75692664ea69c4c5c65f25f1e2e9931eb0c5bce5 /sot/source/sdstor | |
parent | 957c87b827c2d762c20e17e31d0f26e6695f4cc8 (diff) |
Remove DECLARE_LIST( UCBStorageElementList_Impl, UCBStorageElement_Impl* )
Also:
- Fixed 2 memory leeks: UCBStorage_Impl::Commit & UCBStorage_Impl::Revert
They where erasing the list item but not deleting the object.
- Fixed the code to not skip the element after a removed item.
UCBStorage_Impl::Revert & UCBStorage_Impl::Commit
The code passes smoketest.
Diffstat (limited to 'sot/source/sdstor')
-rw-r--r-- | sot/source/sdstor/ucbstorage.cxx | 119 |
1 files changed, 41 insertions, 78 deletions
diff --git a/sot/source/sdstor/ucbstorage.cxx b/sot/source/sdstor/ucbstorage.cxx index 51d297dd4e31..f1143e8b8a57 100644 --- a/sot/source/sdstor/ucbstorage.cxx +++ b/sot/source/sdstor/ucbstorage.cxx @@ -76,6 +76,8 @@ #include "unostorageholder.hxx" +#include <vector> + using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::uno; @@ -102,8 +104,6 @@ public: FileStreamWrapper_Impl( const String& rName ); virtual ~FileStreamWrapper_Impl(); - //DECLARE_UNO3_AGG_DEFAULTS( FileStreamWrapper_Impl, FileInputStreamWrapper_Base); - virtual void SAL_CALL seek( sal_Int64 _nLocation ) throw ( IllegalArgumentException, IOException, RuntimeException); virtual sal_Int64 SAL_CALL getPosition( ) throw ( IOException, RuntimeException); virtual sal_Int64 SAL_CALL getLength( ) throw ( IOException, RuntimeException); @@ -336,22 +336,6 @@ TYPEINIT1( UCBStorage, BaseStorage ); sal_Int32 GetFormatId_Impl( SvGlobalName aName ) { -// if ( aName == SvGlobalName( SO3_SW_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARWRITER_8; -// if ( aName == SvGlobalName( SO3_SWWEB_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARWRITERWEB_8; -// if ( aName == SvGlobalName( SO3_SWGLOB_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARWRITERGLOB_8; -// if ( aName == SvGlobalName( SO3_SDRAW_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARDRAW_8; -// if ( aName == SvGlobalName( SO3_SIMPRESS_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARIMPRESS_8; -// if ( aName == SvGlobalName( SO3_SC_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARCALC_8; -// if ( aName == SvGlobalName( SO3_SCH_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARCHART_8; -// if ( aName == SvGlobalName( SO3_SM_CLASSID_8 ) ) -// return SOT_FORMATSTR_ID_STARMATH_8; if ( aName == SvGlobalName( SO3_SW_CLASSID_60 ) ) return SOT_FORMATSTR_ID_STARWRITER_60; if ( aName == SvGlobalName( SO3_SWWEB_CLASSID_60 ) ) @@ -425,7 +409,6 @@ SvGlobalName GetClassId_Impl( sal_Int32 nFormat ) case SOT_FORMATSTR_ID_STARMATH_60 : return SvGlobalName( SO3_SM_CLASSID_60 ); default : - //DBG_ERROR( "Unknown UCB storage format!" ); return SvGlobalName(); } } @@ -503,7 +486,7 @@ public: SV_DECL_IMPL_REF( UCBStorageStream_Impl ); struct UCBStorageElement_Impl; -DECLARE_LIST( UCBStorageElementList_Impl, UCBStorageElement_Impl* ) +typedef ::std::vector< UCBStorageElement_Impl* > UCBStorageElementList_Impl; class UCBStorage_Impl : public SvRefBase { @@ -519,7 +502,6 @@ public: ::ucbhelper::Content* m_pContent; // the content that provides the storage elements ::utl::TempFile* m_pTempFile; // temporary file, only for storages on stream SvStream* m_pSource; // original stream, only for storages on a stream - //SvStream* m_pStream; // the corresponding editable stream, only for storage on a stream long m_nError; StreamMode m_nMode; // open mode ( read/write/trunc/nocreate/sharing ) BOOL m_bModified; // only modified elements will be sent to the original content @@ -1990,7 +1972,7 @@ void UCBStorage_Impl::ReadContent() BOOL bIsFolder( xRow->getBoolean(2) ); sal_Int64 nSize = xRow->getLong(4); UCBStorageElement_Impl* pElement = new UCBStorageElement_Impl( aTitle, bIsFolder, (ULONG) nSize ); - m_aChildrenList.Insert( pElement, LIST_APPEND ); + m_aChildrenList.push_back( pElement ); sal_Bool bIsOfficeDocument = m_bIsLinked || ( m_aClassId != SvGlobalName() ); if ( bIsFolder ) @@ -2079,14 +2061,13 @@ void UCBStorage_Impl::SetError( long nError ) sal_Int32 UCBStorage_Impl::GetObjectCount() { - sal_Int32 nCount = m_aChildrenList.Count(); - UCBStorageElement_Impl* pElement = m_aChildrenList.First(); - while ( pElement ) + sal_Int32 nCount = m_aChildrenList.size(); + for ( size_t i = 0; i < m_aChildrenList.size(); ++i ) { + UCBStorageElement_Impl* pElement = m_aChildrenList[ i ]; DBG_ASSERT( !pElement->m_bIsFolder || pElement->m_xStorage.Is(), "Storage should be open!" ); if ( pElement->m_bIsFolder && pElement->m_xStorage.Is() ) nCount += pElement->m_xStorage->GetObjectCount(); - pElement = m_aChildrenList.Next(); } return nCount; @@ -2138,9 +2119,9 @@ void UCBStorage_Impl::SetProps( const Sequence < Sequence < PropertyValue > >& r // the "FullPath" of a child always starts without '/' aPath.Erase(); - UCBStorageElement_Impl* pElement = m_aChildrenList.First(); - while ( pElement ) + for ( size_t i = 0; i < m_aChildrenList.size(); ++i ) { + UCBStorageElement_Impl* pElement = m_aChildrenList[ i ]; DBG_ASSERT( !pElement->m_bIsFolder || pElement->m_xStorage.Is(), "Storage should be open!" ); if ( pElement->m_bIsFolder && pElement->m_xStorage.Is() ) pElement->m_xStorage->SetProps( rSequence, aPath ); @@ -2150,8 +2131,6 @@ void UCBStorage_Impl::SetProps( const Sequence < Sequence < PropertyValue > >& r aElementPath += pElement->m_aName; pElement->SetContentType( Find_Impl( rSequence, aElementPath ) ); } - - pElement = m_aChildrenList.Next(); } if ( m_aContentType.Len() ) @@ -2192,9 +2171,9 @@ void UCBStorage_Impl::GetProps( sal_Int32& nProps, Sequence < Sequence < Propert aPath.Erase(); // now the properties of my elements - UCBStorageElement_Impl* pElement = m_aChildrenList.First(); - while ( pElement ) + for ( size_t i = 0; i < m_aChildrenList.size(); ++i ) { + UCBStorageElement_Impl* pElement = m_aChildrenList[ i ]; DBG_ASSERT( !pElement->m_bIsFolder || pElement->m_xStorage.Is(), "Storage should be open!" ); if ( pElement->m_bIsFolder && pElement->m_xStorage.Is() ) // storages add there properties by themselves ( see above ) @@ -2210,8 +2189,6 @@ void UCBStorage_Impl::GetProps( sal_Int32& nProps, Sequence < Sequence < Propert aProps[1].Value <<= (::rtl::OUString ) aElementPath; rSequence[ nProps++ ] = aProps; } - - pElement = m_aChildrenList.Next(); } } @@ -2233,14 +2210,10 @@ UCBStorage_Impl::~UCBStorage_Impl() } // first delete elements! - UCBStorageElement_Impl* pElement = m_aChildrenList.First(); - while ( pElement ) - { - delete pElement; - pElement = m_aChildrenList.Next(); - } + for ( size_t i = 0, n = m_aChildrenList.size(); i < n; ++i ) + delete m_aChildrenList[ i ]; + m_aChildrenList.clear(); - m_aChildrenList.Clear(); delete m_pContent; delete m_pTempFile; } @@ -2312,7 +2285,6 @@ BOOL UCBStorage_Impl::Insert( ::ucbhelper::Content *pContent ) sal_Int16 UCBStorage_Impl::Commit() { // send all changes to the package - UCBStorageElement_Impl* pElement = m_aChildrenList.First(); sal_Int16 nRet = COMMIT_RESULT_NOTHING_TO_DO; // there is nothing to do if the storage has been opened readonly or if it was opened in transacted mode and no @@ -2322,8 +2294,9 @@ sal_Int16 UCBStorage_Impl::Commit() try { // all errors will be caught in the "catch" statement outside the loop - while ( pElement && nRet ) + for ( size_t i = 0; i < m_aChildrenList.size() && nRet; ++i ) { + UCBStorageElement_Impl* pElement = m_aChildrenList[ i ]; ::ucbhelper::Content* pContent = pElement->GetContent(); BOOL bDeleteContent = FALSE; if ( !pContent && pElement->IsModified() ) @@ -2412,8 +2385,6 @@ sal_Int16 UCBStorage_Impl::Commit() if ( nRet == COMMIT_RESULT_FAILURE ) break; - - pElement = m_aChildrenList.Next(); } } catch ( ContentCreationException& ) @@ -2559,23 +2530,22 @@ sal_Int16 UCBStorage_Impl::Commit() // after successfull root commit all elements names and types are adjusted and all removed elements // are also removed from the lists - UCBStorageElement_Impl* pInnerElement = m_aChildrenList.First(); - BOOL bRet = TRUE; - while ( pInnerElement && bRet ) + for ( size_t i = 0; i < m_aChildrenList.size(); ) { - UCBStorageElement_Impl* pNext = m_aChildrenList.Next(); + UCBStorageElement_Impl* pInnerElement = m_aChildrenList[ i ]; if ( pInnerElement->m_bIsRemoved ) { - // is this correct use of our list class ?! - m_aChildrenList.Remove( pInnerElement ); + UCBStorageElementList_Impl::iterator it = m_aChildrenList.begin(); + ::std::advance( it, i ); + delete *it; + m_aChildrenList.erase( it ); } else { pInnerElement->m_aOriginalName = pInnerElement->m_aName; pInnerElement->m_bIsInserted = FALSE; + ++i; } - - pInnerElement = pNext; } } @@ -2587,14 +2557,16 @@ sal_Int16 UCBStorage_Impl::Commit() BOOL UCBStorage_Impl::Revert() { - UCBStorageElement_Impl* pElement = m_aChildrenList.First(); - BOOL bRet = TRUE; - while ( pElement && bRet ) + for ( size_t i = 0; i < m_aChildrenList.size(); ) { + UCBStorageElement_Impl* pElement = m_aChildrenList[ i ]; pElement->m_bIsRemoved = FALSE; if ( pElement->m_bIsInserted ) { - m_aChildrenList.Remove( pElement ); // correct usage of list ??? + UCBStorageElementList_Impl::iterator it = m_aChildrenList.begin(); + ::std::advance( it, i ); + delete *it; + m_aChildrenList.erase( it ); } else { @@ -2611,12 +2583,10 @@ BOOL UCBStorage_Impl::Revert() pElement->m_aName = pElement->m_aOriginalName; pElement->m_bIsRemoved = FALSE; + ++i; } - - pElement = m_aChildrenList.Next(); } - - return bRet; + return TRUE; } const String& UCBStorage::GetName() const @@ -2703,9 +2673,9 @@ String UCBStorage::GetUserName() void UCBStorage::FillInfoList( SvStorageInfoList* pList ) const { // put information in childrenlist into StorageInfoList - UCBStorageElement_Impl* pElement = pImp->GetChildrenList().First(); - while ( pElement ) + for ( size_t i = 0; i < pImp->GetChildrenList().size(); ++i ) { + UCBStorageElement_Impl* pElement = pImp->GetChildrenList()[ i ]; if ( !pElement->m_bIsRemoved ) { // problem: what about the size of a substorage ?! @@ -2715,8 +2685,6 @@ void UCBStorage::FillInfoList( SvStorageInfoList* pList ) const SvStorageInfo aInfo( pElement->m_aName, nSize, pElement->m_bIsStorage ); pList->Append( aInfo ); } - - pElement = pImp->m_aChildrenList.Next(); } } @@ -2803,15 +2771,13 @@ BOOL UCBStorage::CopyStorageElement_Impl( UCBStorageElement_Impl& rElement, Base UCBStorageElement_Impl* UCBStorage::FindElement_Impl( const String& rName ) const { DBG_ASSERT( rName.Len(), "Name is empty!" ); - UCBStorageElement_Impl* pElement = pImp->GetChildrenList().First(); - while ( pElement ) + for ( size_t i = 0, n = pImp->GetChildrenList().size(); i < n; ++i ) { + UCBStorageElement_Impl* pElement = pImp->GetChildrenList()[ i ]; if ( pElement->m_aName == rName && !pElement->m_bIsRemoved ) - break; - pElement = pImp->m_aChildrenList.Next(); + return pElement; } - - return pElement; + return NULL; } BOOL UCBStorage::CopyTo( BaseStorage* pDestStg ) const @@ -2833,12 +2799,11 @@ BOOL UCBStorage::CopyTo( BaseStorage* pDestStg ) const pDestStg->SetDirty(); BOOL bRet = TRUE; - UCBStorageElement_Impl* pElement = pImp->GetChildrenList().First(); - while ( pElement && bRet ) + for ( size_t i = 0; i < pImp->GetChildrenList().size() && bRet; ++i ) { + UCBStorageElement_Impl* pElement = pImp->GetChildrenList()[ i ]; if ( !pElement->m_bIsRemoved ) bRet = CopyStorageElement_Impl( *pElement, pDestStg, pElement->m_aName ); - pElement = pImp->m_aChildrenList.Next(); } if( !bRet ) @@ -2912,7 +2877,7 @@ BaseStorageStream* UCBStorage::OpenStream( const String& rEleName, StreamMode nM // create a new UCBStorageElement and insert it into the list pElement = new UCBStorageElement_Impl( rEleName ); pElement->m_bIsInserted = TRUE; - pImp->m_aChildrenList.Insert( pElement, LIST_APPEND ); + pImp->m_aChildrenList.push_back( pElement ); } } @@ -2939,7 +2904,6 @@ BaseStorageStream* UCBStorage::OpenStream( const String& rEleName, StreamMode nM { pElement->m_xStream->PrepareCachedForReopen( nMode ); - // DBG_ASSERT( bDirect == pElement->m_xStream->m_bDirect, "Wrong DirectMode!" ); return new UCBStorageStream( pElement->m_xStream ); } } @@ -3014,7 +2978,7 @@ BaseStorage* UCBStorage::OpenStorage_Impl( const String& rEleName, StreamMode nM // Because nothing is known about the element that should be created, an external parameter is needed ! pElement = new UCBStorageElement_Impl( rEleName ); pElement->m_bIsInserted = TRUE; - pImp->m_aChildrenList.Insert( pElement, LIST_APPEND ); + pImp->m_aChildrenList.push_back( pElement ); } if ( !pElement->m_bIsFolder && ( pElement->m_bIsStorage || !bForceUCBStorage ) ) @@ -3065,7 +3029,6 @@ BaseStorage* UCBStorage::OpenStorage_Impl( const String& rEleName, StreamMode nM } else { -// DBG_ASSERT( bDirect == pElement->m_xStorage->m_bDirect, "Wrong DirectMode!" ); return new UCBStorage( pElement->m_xStorage ); } } |