diff options
author | Armin Le Grand <alg@apache.org> | 2012-06-29 11:39:59 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-05-13 20:38:19 +0100 |
commit | 72e54b69601dc44932d4a3c9882d24d2380ae3b7 (patch) | |
tree | db36225f46e419198994713a2a9d25bcf1d50833 /sw | |
parent | a85f5b1ee0ccf5e1999f5452ce162e251191dd98 (diff) |
Resolves: #i120106# implement a SwPosFlyFrms which avoids memory leaks
Use boost::shared_ptr and stl tools to implement a SwPosFlyFrms which can be
used and handed over by value and cleans up it's content to avoid memory leaks.
Found by: Chao Huang
Patch by: Chao Huang, alg
Review by: Chao Huang, alg
(cherry picked from commit c26f80aa1ba65b63e313dce9c6d7e40ab8efede6)
Conflicts:
sw/inc/doc.hxx
sw/inc/flypos.hxx
sw/source/core/doc/doclay.cxx
sw/source/core/layout/flypos.cxx
sw/source/core/unocore/unoobj2.cxx
sw/source/filter/html/htmlfly.cxx
sw/source/filter/ww8/writerhelper.cxx
Change-Id: If610457654b1056d799d4336cd249815f7878a96
Fix build breaker from i120106
Patch by: Chao Huang
Suggested by: alg
(cherry picked from commit 880aadbeba4e31049d5b7f0a34323553fb6249fb)
Conflicts:
sw/source/filter/ww8/writerhelper.cxx
Change-Id: I516fcb6ee69944c54cc9eb76c069eb8b28749050
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/doc.hxx | 4 | ||||
-rw-r--r-- | sw/inc/flypos.hxx | 15 | ||||
-rw-r--r-- | sw/source/core/doc/doclay.cxx | 22 | ||||
-rw-r--r-- | sw/source/core/layout/flypos.cxx | 28 | ||||
-rw-r--r-- | sw/source/core/unocore/unoobj2.cxx | 18 | ||||
-rw-r--r-- | sw/source/filter/html/htmlfly.cxx | 10 | ||||
-rw-r--r-- | sw/source/filter/ww8/writerhelper.cxx | 19 |
7 files changed, 55 insertions, 61 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index d1956b84b921..f0b97f068010 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -53,6 +53,7 @@ class SwList; #include <swatrset.hxx> #include <toxe.hxx> // enums #include <flyenum.hxx> +#include <flypos.hxx> #include <itabenum.hxx> #include <swdbdata.hxx> #include <chcmprse.hxx> @@ -143,7 +144,6 @@ class SwNodes; class SwNumRule; class SwNumRuleTbl; class SwPageDesc; -class SwPosFlyFrms; class SwPagePreViewPrtData; class SwRedline; class SwRedlineTbl; @@ -1048,7 +1048,7 @@ public: have to be surrounded completely by ::com::sun::star::awt::Selection. ( Start < Pos < End ) !!! (Required for Writers.) */ - void GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, const SwPaM* = 0, + SwPosFlyFrms GetAllFlyFmts( const SwPaM* = 0, bool bDrawAlso = false, bool bAsCharAlso = false ) const; diff --git a/sw/inc/flypos.hxx b/sw/inc/flypos.hxx index fadc98c43312..e7b9fa010267 100644 --- a/sw/inc/flypos.hxx +++ b/sw/inc/flypos.hxx @@ -19,8 +19,8 @@ #ifndef _FLYPOS_HXX #define _FLYPOS_HXX - #include <swdllapi.h> +#include <boost/shared_ptr.hpp> #include <set> class SwFrmFmt; @@ -37,16 +37,19 @@ public: SwPosFlyFrm( const SwNodeIndex& , const SwFrmFmt*, sal_uInt16 nArrPos ); virtual ~SwPosFlyFrm(); ///< Virtual for Writer (DLL !!) - /// Operators for sort array. - sal_Bool operator==( const SwPosFlyFrm& ); - sal_Bool operator<( const SwPosFlyFrm& ); - const SwFrmFmt& GetFmt() const { return *pFrmFmt; } const SwNodeIndex& GetNdIndex() const { return *pNdIdx; } sal_uInt32 GetOrdNum() const { return nOrdNum; } }; -class SwPosFlyFrms : public std::multiset<SwPosFlyFrm*> {}; +// define needed classes to safely handle an array of allocated SwPosFlyFrm(s). +// SwPosFlyFrms can be handled by value (as return value), only refcounts to +// contained SwPosFlyFrm* will be copied. When releasing the last SwPosFlyFrmPtr +// instance the allocated instance will be freed. The array is sorted by +// GetNdIndex by using a ::std::set container. +typedef ::boost::shared_ptr< SwPosFlyFrm > SwPosFlyFrmPtr; +struct SwPosFlyFrmCmp { bool operator()(const SwPosFlyFrmPtr& rA, const SwPosFlyFrmPtr& rB) const; }; +typedef ::std::set< SwPosFlyFrmPtr, SwPosFlyFrmCmp > SwPosFlyFrms; #endif // _FLYPOS_HXX diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx index b3920de82fe5..b320e79779e3 100644 --- a/sw/source/core/doc/doclay.cxx +++ b/sw/source/core/doc/doclay.cxx @@ -1002,11 +1002,10 @@ static bool lcl_TstFlyRange( const SwPaM* pPam, const SwPosition* pFlyPos, return bOk; } -void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, - const SwPaM* pCmpRange, bool bDrawAlso, +SwPosFlyFrms SwDoc::GetAllFlyFmts( const SwPaM* pCmpRange, bool bDrawAlso, bool bAsCharAlso ) const { - SwPosFlyFrm *pFPos = 0; + SwPosFlyFrms aRetval; SwFrmFmt *pFly; // collect all anchored somehow to paragraphs @@ -1028,8 +1027,7 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, if( pCmpRange && !lcl_TstFlyRange( pCmpRange, pAPos, rAnchor.GetAnchorId() )) continue; // not a valid FlyFrame - pFPos = new SwPosFlyFrm( pAPos->nNode, pFly, rPosFlyFmts.size() ); - rPosFlyFmts.insert( pFPos ); + aRetval.insert(SwPosFlyFrmPtr(new SwPosFlyFrm(pAPos->nNode, pFly, aRetval.size()))); } } } @@ -1037,9 +1035,10 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, // If we don't have a layout we can't get page anchored FlyFrames. // Also, page anchored FlyFrames are only returned if no range is specified. if( !GetCurrentViewShell() || pCmpRange ) //swmod 071108//swmod 071225 - return; + { + return aRetval; + } - pFPos = 0; SwPageFrm *pPage = (SwPageFrm*)GetCurrentLayout()->GetLower(); //swmod 080218 while( pPage ) { @@ -1077,18 +1076,15 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, if ( pCntntFrm ) { SwNodeIndex aIdx( *pCntntFrm->GetNode() ); - pFPos = new SwPosFlyFrm( aIdx, pFly, rPosFlyFmts.size() ); + aRetval.insert(SwPosFlyFrmPtr(new SwPosFlyFrm(aIdx, pFly, aRetval.size()))); } } - if ( pFPos ) - { - rPosFlyFmts.insert( pFPos ); - pFPos = 0; - } } } pPage = (SwPageFrm*)pPage->GetNext(); } + + return aRetval; } /* #i6447# changed behaviour if lcl_CpyAttr: diff --git a/sw/source/core/layout/flypos.cxx b/sw/source/core/layout/flypos.cxx index 44e2aa8decc7..7a5f807758e0 100644 --- a/sw/source/core/layout/flypos.cxx +++ b/sw/source/core/layout/flypos.cxx @@ -31,6 +31,17 @@ #include "ndindex.hxx" #include "switerator.hxx" +bool SwPosFlyFrmCmp::operator()(const SwPosFlyFrmPtr& rA, const SwPosFlyFrmPtr& rB) const +{ + if(rA->GetNdIndex() == rB->GetNdIndex()) + { + // In this case, the order number decides! + return rA->GetOrdNum() < rB->GetOrdNum(); + } + + return rA->GetNdIndex() < rB->GetNdIndex(); +} + SwPosFlyFrm::SwPosFlyFrm( const SwNodeIndex& rIdx, const SwFrmFmt* pFmt, sal_uInt16 nArrPos ) : pFrmFmt( pFmt ), pNdIdx( (SwNodeIndex*) &rIdx ) @@ -81,21 +92,4 @@ SwPosFlyFrm::~SwPosFlyFrm() } } -sal_Bool SwPosFlyFrm::operator==( const SwPosFlyFrm& ) -{ - return sal_False; // FlyFrames can sit at the same position -} - -sal_Bool SwPosFlyFrm::operator<( const SwPosFlyFrm& rPosFly ) -{ - if( pNdIdx->GetIndex() == rPosFly.pNdIdx->GetIndex() ) - { - // In this case, the order number decides! - return nOrdNum < rPosFly.nOrdNum; - } - return pNdIdx->GetIndex() < rPosFly.pNdIdx->GetIndex(); -} - - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx index aa71134fc797..7b46c17edac1 100644 --- a/sw/source/core/unocore/unoobj2.cxx +++ b/sw/source/core/unocore/unoobj2.cxx @@ -1874,21 +1874,19 @@ SwXParaFrameEnumeration::SwXParaFrameEnumeration( { if (PARAFRAME_PORTION_TEXTRANGE == eParaFrameMode) { - SwPosFlyFrms aFlyFrms; //get all frames that are bound at paragraph or at character - rPaM.GetDoc()->GetAllFlyFmts(aFlyFrms, m_pImpl->GetCursor(), false, true); - for(SwPosFlyFrms::iterator it = aFlyFrms.begin(); it != aFlyFrms.end(); ++it) + SwPosFlyFrms aFlyFrms(rPaM.GetDoc()->GetAllFlyFmts(m_pImpl->GetCursor(), false, true)); + + for(SwPosFlyFrms::const_iterator aIter(aFlyFrms.begin()); aIter != aFlyFrms.end(); aIter++) { - SwPosFlyFrm* pPosFly = *it; - SwFrmFmt *const pFrmFmt = - const_cast<SwFrmFmt*>(&pPosFly->GetFmt()); + SwFrmFmt *const pFrmFmt = const_cast<SwFrmFmt*>(&((*aIter)->GetFmt())); + // create SwDepend for frame and insert into array - SwDepend *const pNewDepend = - new SwDepend(m_pImpl.get(), pFrmFmt); - m_pImpl->m_Frames.push_back( - ::boost::shared_ptr<SwDepend>(pNewDepend) ); + SwDepend *const pNewDepend = new SwDepend(m_pImpl.get(), pFrmFmt); + m_pImpl->m_Frames.push_back(::boost::shared_ptr<SwDepend>(pNewDepend)); } } + lcl_FillFrame(*m_pImpl.get(), *m_pImpl->GetCursor(), m_pImpl->m_Frames); } } diff --git a/sw/source/filter/html/htmlfly.cxx b/sw/source/filter/html/htmlfly.cxx index a5ae153a7e0a..47426ef81804 100644 --- a/sw/source/filter/html/htmlfly.cxx +++ b/sw/source/filter/html/htmlfly.cxx @@ -301,12 +301,11 @@ void SwHTMLWriter::CollectFlyFrms() OSL_ENSURE( HTML_CFG_MAX+1 == MAX_BROWSERS, "number of browser configurations has changed" ); - SwPosFlyFrms aFlyPos; - pDoc->GetAllFlyFmts( aFlyPos, bWriteAll ? 0 : pCurPam, true ); + SwPosFlyFrms aFlyPos(pDoc->GetAllFlyFmts(bWriteAll ? 0 : pCurPam, true)); - for(SwPosFlyFrms::iterator it = aFlyPos.begin(); it != aFlyPos.end(); ++it) + for(SwPosFlyFrms::const_iterator aIter(aFlyPos.begin()); aIter != aFlyPos.end(); ++aIter) { - const SwFrmFmt& rFrmFmt = (*it)->GetFmt(); + const SwFrmFmt& rFrmFmt = (*aIter)->GetFmt(); const SdrObject *pSdrObj = 0; const SwPosition *pAPos; const SwCntntNode *pACNd; @@ -356,8 +355,7 @@ void SwHTMLWriter::CollectFlyFrms() if( !pHTMLPosFlyFrms ) pHTMLPosFlyFrms = new SwHTMLPosFlyFrms; - SwHTMLPosFlyFrm *pNew = - new SwHTMLPosFlyFrm( **it, pSdrObj, nMode ); + SwHTMLPosFlyFrm *pNew = new SwHTMLPosFlyFrm(**aIter, pSdrObj, nMode); pHTMLPosFlyFrms->insert( pNew ); } } diff --git a/sw/source/filter/ww8/writerhelper.cxx b/sw/source/filter/ww8/writerhelper.cxx index d903255a557c..228bc59ff5a5 100644 --- a/sw/source/filter/ww8/writerhelper.cxx +++ b/sw/source/filter/ww8/writerhelper.cxx @@ -118,16 +118,24 @@ namespace sw::Frames SwPosFlyFrmsToFrames(const SwPosFlyFrms &rFlys) { sw::Frames aRet; - for(SwPosFlyFrms::const_reverse_iterator it = rFlys.rbegin(); it != rFlys.rend(); ++it) + + for(SwPosFlyFrms::const_iterator aIter(rFlys.begin()); aIter != rFlys.end(); ++aIter) { - const SwFrmFmt &rEntry = (*it)->GetFmt(); + const SwFrmFmt &rEntry = (*aIter)->GetFmt(); + if (const SwPosition* pAnchor = rEntry.GetAnchor().GetCntntAnchor()) + { aRet.push_back(sw::Frame(rEntry, *pAnchor)); + } else { - SwPosition aPos((*it)->GetNdIndex()); + SwPosition aPos((*aIter)->GetNdIndex()); + if (SwTxtNode* pTxtNd = aPos.nNode.GetNode().GetTxtNode()) + { aPos.nContent.Assign(pTxtNd, 0); + } + aRet.push_back(sw::Frame(rEntry, aPos)); } } @@ -514,11 +522,8 @@ namespace sw */ Frames GetFrames(const SwDoc &rDoc, SwPaM *pPaM /*, bool bAll*/) { - SwPosFlyFrms aFlys; - rDoc.GetAllFlyFmts(aFlys, pPaM, true); + SwPosFlyFrms aFlys(rDoc.GetAllFlyFmts(pPaM, true)); sw::Frames aRet(SwPosFlyFrmsToFrames(aFlys)); - for(SwPosFlyFrms::const_reverse_iterator it = aFlys.rbegin(); it != aFlys.rend(); ++it) - delete *it; return aRet; } |