sc/source/filter/html/htmlpars.cxx | 180 +++++++++++++++---------------------- sc/source/filter/inc/eeparser.hxx | 8 - sc/source/filter/inc/htmlpars.hxx | 12 +- sc/source/filter/rtf/eeimpars.cxx | 16 +-- sc/source/filter/rtf/rtfparse.cxx | 39 +++----- 5 files changed, 111 insertions(+), 144 deletions(-)
New commits: commit 45780815b2ae9d07a249a7d84d332c8b402317a5 Author: Caolán McNamara <caol...@redhat.com> Date: Fri Nov 3 10:49:38 2017 +0000 ofz: fix leak Change-Id: I5984a8b7ef2d978c118d4e65e686027b1e510bd9 Reviewed-on: https://gerrit.libreoffice.org/44251 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/sc/source/filter/html/htmlpars.cxx b/sc/source/filter/html/htmlpars.cxx index 054a22685345..5cbbf7a299bc 100644 --- a/sc/source/filter/html/htmlpars.cxx +++ b/sc/source/filter/html/htmlpars.cxx @@ -229,18 +229,6 @@ ScHTMLLayoutParser::~ScHTMLLayoutParser() { ScHTMLTableStackEntry* pS = aTableStack.top(); aTableStack.pop(); - - bool found = false; - for (ScEEParseEntry* p : maList) - { - if ( pS->pCellEntry == p ) - { - found = true; - break; - } - } - if ( !found ) - delete pS->pCellEntry; if ( pS->pLocalColOffset != pLocalColOffset ) delete pS->pLocalColOffset; delete pS; @@ -313,12 +301,12 @@ void ScHTMLLayoutParser::NewActEntry( ScEEParseEntry* pE ) { if ( !pE->aSel.HasRange() ) { // Completely empty, following text ends up in the same paragraph! - pActEntry->aSel.nStartPara = pE->aSel.nEndPara; - pActEntry->aSel.nStartPos = pE->aSel.nEndPos; + mxActEntry->aSel.nStartPara = pE->aSel.nEndPara; + mxActEntry->aSel.nStartPos = pE->aSel.nEndPos; } } - pActEntry->aSel.nEndPara = pActEntry->aSel.nStartPara; - pActEntry->aSel.nEndPos = pActEntry->aSel.nStartPos; + mxActEntry->aSel.nEndPara = mxActEntry->aSel.nStartPara; + mxActEntry->aSel.nEndPos = mxActEntry->aSel.nStartPos; } void ScHTMLLayoutParser::EntryEnd( ScEEParseEntry* pE, const ESelection& rSel ) @@ -491,7 +479,7 @@ void ScHTMLLayoutParser::Adjust() SCROW nCurRow = 0; sal_uInt16 nPageWidth = (sal_uInt16) aPageSize.Width(); InnerMap* pTab = nullptr; - for (ScEEParseEntry* pE : maList) + for (auto& pE : maList) { if ( pE->nTab < nTab ) { // Table finished @@ -590,7 +578,7 @@ void ScHTMLLayoutParser::Adjust() // Real column (void)SeekOffset( &maColOffset, pE->nOffset, &pE->nCol, nOffsetTolerance ); SCCOL nColBeforeSkip = pE->nCol; - SkipLocked( pE, false ); + SkipLocked(pE.get(), false); if ( pE->nCol != nColBeforeSkip ) { SCCOL nCount = (SCCOL)maColOffset.size(); @@ -645,7 +633,6 @@ sal_uInt16 ScHTMLLayoutParser::GetWidth( ScEEParseEntry* pE ) void ScHTMLLayoutParser::SetWidths() { - ScEEParseEntry* pE; SCCOL nCol; if ( !nTableWidth ) nTableWidth = (sal_uInt16) aPageSize.Width(); @@ -664,7 +651,7 @@ void ScHTMLLayoutParser::SetWidths() nTableWidth = (sal_uInt16)(pLocalColOffset->back() - pLocalColOffset->front()); for ( size_t i = nFirstTableCell, nListSize = maList.size(); i < nListSize; ++i ) { - pE = maList[ i ]; + auto& pE = maList[ i ]; if ( pE->nTab == nTable ) { pE->nOffset = (sal_uInt16) (*pLocalColOffset)[pE->nCol - nColCntStart]; @@ -684,7 +671,7 @@ void ScHTMLLayoutParser::SetWidths() pOffsets[0] = nColOffsetStart; for ( size_t i = nFirstTableCell, nListSize = maList.size(); i < nListSize; ++i ) { - pE = maList[ i ]; + auto& pE = maList[ i ]; if ( pE->nTab == nTable && pE->nWidth ) { nCol = pE->nCol - nColCntStart; @@ -755,7 +742,7 @@ void ScHTMLLayoutParser::SetWidths() for ( size_t i = nFirstTableCell, nListSize = maList.size(); i < nListSize; ++i ) { - pE = maList[ i ]; + auto& pE = maList[ i ]; if ( pE->nTab == nTable ) { nCol = pE->nCol - nColCntStart; @@ -780,12 +767,12 @@ void ScHTMLLayoutParser::SetWidths() } for ( size_t i = nFirstTableCell, nListSize = maList.size(); i < nListSize; ++i ) { - pE = maList[ i ]; + auto& pE = maList[ i ]; if ( pE->nTab == nTable ) { if ( !pE->nWidth ) { - pE->nWidth = GetWidth( pE ); + pE->nWidth = GetWidth(pE.get()); OSL_ENSURE( pE->nWidth, "SetWidths: pE->nWidth == 0" ); } MakeCol( &maColOffset, pE->nOffset, pE->nWidth, nOffsetTolerance, nOffsetTolerance ); @@ -827,30 +814,19 @@ void ScHTMLLayoutParser::CloseEntry( const HtmlImportInfo* pInfo ) if ( bTabInTabCell ) { // From the stack in TableOff bTabInTabCell = false; - bool found = false; - for (ScEEParseEntry* p : maList) - { - if ( pActEntry == p ) - { - found = true; - break; - } - } - if ( !found ) - delete pActEntry; - NewActEntry( maList.back() ); // New free flying pActEntry + NewActEntry(maList.back().get()); // New free flying mxActEntry return ; } - if ( pActEntry->nTab == 0 ) - pActEntry->nWidth = (sal_uInt16) aPageSize.Width(); - Colonize( pActEntry ); - nColCnt = pActEntry->nCol + pActEntry->nColOverlap; + if (mxActEntry->nTab == 0) + mxActEntry->nWidth = (sal_uInt16) aPageSize.Width(); + Colonize(mxActEntry.get()); + nColCnt = mxActEntry->nCol + mxActEntry->nColOverlap; if ( nMaxCol < nColCnt ) nMaxCol = nColCnt; // TableStack MaxCol if ( nColMax < nColCnt ) nColMax = nColCnt; // Global MaxCol for ScEEParser GetDimensions! - EntryEnd( pActEntry, pInfo->aSelection ); - ESelection& rSel = pActEntry->aSel; + EntryEnd(mxActEntry.get(), pInfo->aSelection); + ESelection& rSel = mxActEntry->aSel; while ( rSel.nStartPara < rSel.nEndPara && pEdit->GetTextLen( rSel.nStartPara ) == 0 ) { // Strip preceding empty paragraphs @@ -867,9 +843,9 @@ void ScHTMLLayoutParser::CloseEntry( const HtmlImportInfo* pInfo ) rSel.nEndPara = rSel.nStartPara; } if ( rSel.HasRange() ) - pActEntry->aItemSet.Put( SfxBoolItem( ATTR_LINEBREAK, true ) ); - maList.push_back( pActEntry ); - NewActEntry( pActEntry ); // New free flying pActEntry + mxActEntry->aItemSet.Put( SfxBoolItem( ATTR_LINEBREAK, true ) ); + maList.push_back(mxActEntry); + NewActEntry(mxActEntry.get()); // New free flying mxActEntry } IMPL_LINK( ScHTMLLayoutParser, HTMLImportHdl, HtmlImportInfo&, rInfo, void ) @@ -957,12 +933,12 @@ void ScHTMLLayoutParser::TableDataOn( HtmlImportInfo* pInfo ) { case HtmlOptionId::COLSPAN: { - pActEntry->nColOverlap = ( SCCOL ) rOption.GetString().toInt32(); + mxActEntry->nColOverlap = (SCCOL)rOption.GetString().toInt32(); } break; case HtmlOptionId::ROWSPAN: { - pActEntry->nRowOverlap = ( SCROW ) rOption.GetString().toInt32(); + mxActEntry->nRowOverlap = (SCROW)rOption.GetString().toInt32(); } break; case HtmlOptionId::ALIGN: @@ -979,7 +955,7 @@ void ScHTMLLayoutParser::TableDataOn( HtmlImportInfo* pInfo ) else eVal = SvxCellHorJustify::Standard; if ( eVal != SvxCellHorJustify::Standard ) - pActEntry->aItemSet.Put( SvxHorJustifyItem( eVal, ATTR_HOR_JUSTIFY) ); + mxActEntry->aItemSet.Put(SvxHorJustifyItem(eVal, ATTR_HOR_JUSTIFY)); } break; case HtmlOptionId::VALIGN: @@ -994,41 +970,41 @@ void ScHTMLLayoutParser::TableDataOn( HtmlImportInfo* pInfo ) eVal = SvxCellVerJustify::Bottom; else eVal = SvxCellVerJustify::Standard; - pActEntry->aItemSet.Put( SvxVerJustifyItem( eVal, ATTR_VER_JUSTIFY) ); + mxActEntry->aItemSet.Put(SvxVerJustifyItem(eVal, ATTR_VER_JUSTIFY)); } break; case HtmlOptionId::WIDTH: { - pActEntry->nWidth = GetWidthPixel( rOption ); + mxActEntry->nWidth = GetWidthPixel(rOption); } break; case HtmlOptionId::BGCOLOR: { Color aColor; rOption.GetColor( aColor ); - pActEntry->aItemSet.Put( - SvxBrushItem( aColor, ATTR_BACKGROUND ) ); + mxActEntry->aItemSet.Put(SvxBrushItem(aColor, ATTR_BACKGROUND)); } break; case HtmlOptionId::SDVAL: { - pActEntry->pValStr.reset( new OUString( rOption.GetString() ) ); + mxActEntry->pValStr.reset(new OUString(rOption.GetString())); } break; case HtmlOptionId::SDNUM: { - pActEntry->pNumStr.reset( new OUString( rOption.GetString() ) ); + mxActEntry->pNumStr.reset(new OUString(rOption.GetString())); } break; default: break; } } - pActEntry->nCol = nColCnt; - pActEntry->nRow = nRowCnt; - pActEntry->nTab = nTable; + + mxActEntry->nCol = nColCnt; + mxActEntry->nRow = nRowCnt; + mxActEntry->nTab = nTable; if ( bHorJustifyCenterTH ) - pActEntry->aItemSet.Put( + mxActEntry->aItemSet.Put( SvxHorJustifyItem( SvxCellHorJustify::Center, ATTR_HOR_JUSTIFY) ); } @@ -1057,14 +1033,14 @@ void ScHTMLLayoutParser::TableOn( HtmlImportInfo* pInfo ) if ( ++nTableLevel > 1 ) { // Table in Table sal_uInt16 nTmpColOffset = nColOffset; // Will be changed in Colonize() - Colonize( pActEntry ); + Colonize(mxActEntry.get()); aTableStack.push( new ScHTMLTableStackEntry( - pActEntry, xLockedList, pLocalColOffset, nFirstTableCell, + mxActEntry, xLockedList, pLocalColOffset, nFirstTableCell, nRowCnt, nColCntStart, nMaxCol, nTable, nTableWidth, nColOffset, nColOffsetStart, bFirstRow ) ); sal_uInt16 nLastWidth = nTableWidth; - nTableWidth = GetWidth( pActEntry ); + nTableWidth = GetWidth(mxActEntry.get()); if ( nTableWidth == nLastWidth && nMaxCol - nColCntStart > 1 ) { // There must be more than one, so this one cannot be enough nTableWidth = nLastWidth / static_cast<sal_uInt16>((nMaxCol - nColCntStart)); @@ -1106,22 +1082,19 @@ void ScHTMLLayoutParser::TableOn( HtmlImportInfo* pInfo ) nColOffsetStart = nColOffset; } - ScEEParseEntry* pE = nullptr; - if (maList.size()) - pE = maList.back(); - NewActEntry( pE ); // New free flying pActEntry + NewActEntry(!maList.empty() ? maList.back().get() : nullptr); // New free flying mxActEntry xLockedList = new ScRangeList; } else { // Simple table at the document level - EntryEnd( pActEntry, pInfo->aSelection ); - if ( pActEntry->aSel.HasRange() ) + EntryEnd(mxActEntry.get(), pInfo->aSelection); + if (mxActEntry->aSel.HasRange()) { // Flying text left CloseEntry( pInfo ); NextRow( pInfo ); } aTableStack.push( new ScHTMLTableStackEntry( - pActEntry, xLockedList, pLocalColOffset, nFirstTableCell, + mxActEntry, xLockedList, pLocalColOffset, nFirstTableCell, nRowCnt, nColCntStart, nMaxCol, nTable, nTableWidth, nColOffset, nColOffsetStart, bFirstRow ) ); @@ -1179,7 +1152,7 @@ void ScHTMLLayoutParser::TableOff( const HtmlImportInfo* pInfo ) ScHTMLTableStackEntry* pS = aTableStack.top(); aTableStack.pop(); - ScEEParseEntry* pE = pS->pCellEntry; + auto& pE = pS->xCellEntry; SCROW nRows = nRowCnt - pS->nRowCnt; if ( nRows > 1 ) { // Insert size of table at this position @@ -1295,10 +1268,9 @@ void ScHTMLLayoutParser::TableOff( const HtmlImportInfo* pInfo ) xLockedList = pS->xLockedList; delete pLocalColOffset; pLocalColOffset = pS->pLocalColOffset; - delete pActEntry; - // pActEntry is kept around if a table is started in the same row + // mxActEntry is kept around if a table is started in the same row // (anything's possible in HTML); will be deleted by CloseEntry - pActEntry = pE; + mxActEntry = pE; delete pS; } bTabInTabCell = true; @@ -1322,8 +1294,8 @@ void ScHTMLLayoutParser::TableOff( const HtmlImportInfo* pInfo ) void ScHTMLLayoutParser::Image( HtmlImportInfo* pInfo ) { - pActEntry->maImageList.push_back( o3tl::make_unique<ScHTMLImage>() ); - ScHTMLImage* pImage = pActEntry->maImageList.back().get(); + mxActEntry->maImageList.push_back(o3tl::make_unique<ScHTMLImage>()); + ScHTMLImage* pImage = mxActEntry->maImageList.back().get(); const HTMLOptions& rOptions = static_cast<HTMLParser*>(pInfo->pParser)->GetOptions(); for (const auto & rOption : rOptions) { @@ -1336,12 +1308,12 @@ void ScHTMLLayoutParser::Image( HtmlImportInfo* pInfo ) break; case HtmlOptionId::ALT: { - if ( !pActEntry->bHasGraphic ) + if (!mxActEntry->bHasGraphic) { // ALT text only if not any image loaded - if (!pActEntry->aAltText.isEmpty()) - pActEntry->aAltText += "; "; + if (!mxActEntry->aAltText.isEmpty()) + mxActEntry->aAltText += "; "; - pActEntry->aAltText += rOption.GetString(); + mxActEntry->aAltText += rOption.GetString(); } } break; @@ -1383,10 +1355,10 @@ void ScHTMLLayoutParser::Image( HtmlImportInfo* pInfo ) delete pGraphic; return ; // Bad luck } - if ( !pActEntry->bHasGraphic ) + if (!mxActEntry->bHasGraphic) { // discard any ALT text in this cell if we have any image - pActEntry->bHasGraphic = true; - (pActEntry->aAltText).clear(); + mxActEntry->bHasGraphic = true; + mxActEntry->aAltText.clear(); } pImage->aFilterName = rFilter.GetImportFormatName( nFormat ); pImage->pGraphic.reset( pGraphic ); @@ -1396,20 +1368,20 @@ void ScHTMLLayoutParser::Image( HtmlImportInfo* pInfo ) pImage->aSize = pDefaultDev->LogicToPixel( pGraphic->GetPrefSize(), pGraphic->GetPrefMapMode() ); } - if ( pActEntry->maImageList.size() > 0 ) + if (mxActEntry->maImageList.size() > 0) { long nWidth = 0; - for (std::unique_ptr<ScHTMLImage> & pI : pActEntry->maImageList) + for (std::unique_ptr<ScHTMLImage> & pI : mxActEntry->maImageList) { if ( pI->nDir & nHorizontal ) nWidth += pI->aSize.Width() + 2 * pI->aSpace.X(); else nWidth = 0; } - if ( pActEntry->nWidth + if ( mxActEntry->nWidth && (nWidth + pImage->aSize.Width() + 2 * pImage->aSpace.X() - >= pActEntry->nWidth) ) - pActEntry->maImageList.back()->nDir = nVertical; + >= mxActEntry->nWidth) ) + mxActEntry->maImageList.back()->nDir = nVertical; } } @@ -1453,13 +1425,13 @@ void ScHTMLLayoutParser::AnchorOn( HtmlImportInfo* pInfo ) for (const auto & rOption : rOptions) { if( rOption.GetToken() == HtmlOptionId::NAME ) - pActEntry->pName.reset( new OUString(rOption.GetString()) ); + mxActEntry->pName.reset(new OUString(rOption.GetString())); } } bool ScHTMLLayoutParser::IsAtBeginningOfText( const HtmlImportInfo* pInfo ) { - ESelection& rSel = pActEntry->aSel; + ESelection& rSel = mxActEntry->aSel; return rSel.nStartPara == rSel.nEndPara && rSel.nStartPara <= pInfo->aSelection.nEndPara && pEdit->GetTextLen( rSel.nStartPara ) == 0; @@ -1490,7 +1462,7 @@ void ScHTMLLayoutParser::FontOn( HtmlImportInfo* pInfo ) aFontName += aFName; } if ( !aFontName.isEmpty() ) - pActEntry->aItemSet.Put( SvxFontItem( FAMILY_DONTKNOW, + mxActEntry->aItemSet.Put( SvxFontItem( FAMILY_DONTKNOW, aFontName, EMPTY_OUSTRING, PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, ATTR_FONT ) ); } @@ -1502,7 +1474,7 @@ void ScHTMLLayoutParser::FontOn( HtmlImportInfo* pInfo ) nSize = 1; else if ( nSize > SC_HTML_FONTSIZES ) nSize = SC_HTML_FONTSIZES; - pActEntry->aItemSet.Put( SvxFontHeightItem( + mxActEntry->aItemSet.Put( SvxFontHeightItem( maFontHeights[nSize-1], 100, ATTR_FONT_HEIGHT ) ); } break; @@ -1510,7 +1482,7 @@ void ScHTMLLayoutParser::FontOn( HtmlImportInfo* pInfo ) { Color aColor; rOption.GetColor( aColor ); - pActEntry->aItemSet.Put( SvxColorItem( aColor, ATTR_FONT_COLOR ) ); + mxActEntry->aItemSet.Put( SvxColorItem( aColor, ATTR_FONT_COLOR ) ); } break; default: break; @@ -1568,7 +1540,7 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) if ( bInCell ) CloseEntry( pInfo ); // Do not set bInCell to true, TableDataOn does that - pActEntry->aItemSet.Put( + mxActEntry->aItemSet.Put( SvxWeightItem( WEIGHT_BOLD, ATTR_FONT_WEIGHT) ); SAL_FALLTHROUGH; } @@ -1605,8 +1577,8 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) break; case HtmlTokenId::PARABREAK_OFF: { // We continue vertically after an image - if ( pActEntry->maImageList.size() > 0 ) - pActEntry->maImageList.back()->nDir = nVertical; + if (mxActEntry->maImageList.size() > 0) + mxActEntry->maImageList.back()->nDir = nVertical; } break; case HtmlTokenId::ANCHOR_ON: @@ -1623,7 +1595,7 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) { // TODO: Remember current font size and increase by 1 if ( IsAtBeginningOfText( pInfo ) ) - pActEntry->aItemSet.Put( SvxFontHeightItem( + mxActEntry->aItemSet.Put( SvxFontHeightItem( maFontHeights[3], 100, ATTR_FONT_HEIGHT ) ); } break; @@ -1631,7 +1603,7 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) { // TODO: Remember current font size and decrease by 1 if ( IsAtBeginningOfText( pInfo ) ) - pActEntry->aItemSet.Put( SvxFontHeightItem( + mxActEntry->aItemSet.Put( SvxFontHeightItem( maFontHeights[0], 100, ATTR_FONT_HEIGHT ) ); } break; @@ -1639,7 +1611,7 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) case HtmlTokenId::STRONG_ON : { if ( IsAtBeginningOfText( pInfo ) ) - pActEntry->aItemSet.Put( SvxWeightItem( WEIGHT_BOLD, + mxActEntry->aItemSet.Put( SvxWeightItem( WEIGHT_BOLD, ATTR_FONT_WEIGHT ) ); } break; @@ -1652,7 +1624,7 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) case HtmlTokenId::VARIABLE_ON : { if ( IsAtBeginningOfText( pInfo ) ) - pActEntry->aItemSet.Put( SvxPostureItem( ITALIC_NORMAL, + mxActEntry->aItemSet.Put( SvxPostureItem( ITALIC_NORMAL, ATTR_FONT_POSTURE ) ); } break; @@ -1660,9 +1632,9 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) { if ( IsAtBeginningOfText( pInfo ) ) { - pActEntry->aItemSet.Put( SvxWeightItem( WEIGHT_BOLD, + mxActEntry->aItemSet.Put( SvxWeightItem( WEIGHT_BOLD, ATTR_FONT_WEIGHT ) ); - pActEntry->aItemSet.Put( SvxPostureItem( ITALIC_NORMAL, + mxActEntry->aItemSet.Put( SvxPostureItem( ITALIC_NORMAL, ATTR_FONT_POSTURE ) ); } } @@ -1670,7 +1642,7 @@ void ScHTMLLayoutParser::ProcToken( HtmlImportInfo* pInfo ) case HtmlTokenId::UNDERLINE_ON : { if ( IsAtBeginningOfText( pInfo ) ) - pActEntry->aItemSet.Put( SvxUnderlineItem( LINESTYLE_SINGLE, + mxActEntry->aItemSet.Put( SvxUnderlineItem( LINESTYLE_SINGLE, ATTR_FONT_UNDERLINE ) ); } break; @@ -1906,7 +1878,7 @@ ScHTMLTable::ScHTMLTable( ScHTMLTable& rParentTable, const HtmlImportInfo& rInfo ScHTMLTable::ScHTMLTable( SfxItemPool& rPool, EditEngine& rEditEngine, - std::vector< ScEEParseEntry* >& rEEParseList, + std::vector<std::shared_ptr<ScEEParseEntry>>& rEEParseList, ScHTMLTableId& rnUnusedId, ScHTMLParser* pParser ) : mpParentTable( nullptr ), @@ -2347,7 +2319,7 @@ void ScHTMLTable::ImplPushEntryToVector( ScHTMLEntryVector& rEntryVector, ScHTML // HTML entry list does not own the entries rEntryVector.push_back( rxEntry.get() ); // mrEEParseList (reference to member of ScEEParser) owns the entries - mrEEParseList.push_back( rxEntry.release() ); + mrEEParseList.push_back(std::shared_ptr<ScEEParseEntry>(rxEntry.release())); } bool ScHTMLTable::PushEntry( ScHTMLEntryPtr& rxEntry ) @@ -2784,7 +2756,7 @@ void ScHTMLTable::RecalcDocPos( const ScHTMLPos& rBasePos ) ScHTMLGlobalTable::ScHTMLGlobalTable( SfxItemPool& rPool, EditEngine& rEditEngine, - std::vector< ScEEParseEntry* >& rEEParseVector, + std::vector<std::shared_ptr<ScEEParseEntry>>& rEEParseVector, ScHTMLTableId& rnUnusedId, ScHTMLParser* pParser ) : diff --git a/sc/source/filter/inc/eeparser.hxx b/sc/source/filter/inc/eeparser.hxx index 37125ae4b2ca..9419e5e850e9 100644 --- a/sc/source/filter/inc/eeparser.hxx +++ b/sc/source/filter/inc/eeparser.hxx @@ -101,8 +101,8 @@ protected: EditEngine* pEdit; SfxItemPool* pPool; SfxItemPool* pDocPool; - ::std::vector< ScEEParseEntry* > maList; - ScEEParseEntry* pActEntry; + std::vector<std::shared_ptr<ScEEParseEntry>> maList; + std::shared_ptr<ScEEParseEntry> mxActEntry; ColWidthsMap maColWidths; int nRtfLastToken; SCCOL nColCnt; @@ -124,8 +124,8 @@ public: { nCols = nColMax; nRows = nRowMax; } size_t ListSize() const{ return maList.size(); } - ScEEParseEntry* ListEntry( size_t index ) { return maList[ index ]; } - const ScEEParseEntry* ListEntry( size_t index ) const { return maList[ index ]; } + ScEEParseEntry* ListEntry( size_t index ) { return maList[index].get(); } + const ScEEParseEntry* ListEntry( size_t index ) const { return maList[index].get(); } }; #endif diff --git a/sc/source/filter/inc/htmlpars.hxx b/sc/source/filter/inc/htmlpars.hxx index 5e318aac6115..46bd7d7de699 100644 --- a/sc/source/filter/inc/htmlpars.hxx +++ b/sc/source/filter/inc/htmlpars.hxx @@ -98,7 +98,7 @@ typedef o3tl::sorted_vector<sal_uLong> ScHTMLColOffset; struct ScHTMLTableStackEntry { ScRangeListRef xLockedList; - ScEEParseEntry* pCellEntry; + std::shared_ptr<ScEEParseEntry> xCellEntry; ScHTMLColOffset* pLocalColOffset; sal_uLong nFirstTableCell; SCROW nRowCnt; @@ -109,14 +109,14 @@ struct ScHTMLTableStackEntry sal_uInt16 nColOffset; sal_uInt16 nColOffsetStart; bool bFirstRow; - ScHTMLTableStackEntry( ScEEParseEntry* pE, + ScHTMLTableStackEntry( std::shared_ptr<ScEEParseEntry>& rE, const ScRangeListRef& rL, ScHTMLColOffset* pTO, sal_uLong nFTC, SCROW nRow, SCCOL nStart, SCCOL nMax, sal_uInt16 nTab, sal_uInt16 nTW, sal_uInt16 nCO, sal_uInt16 nCOS, bool bFR ) - : xLockedList( rL ), pCellEntry( pE ), + : xLockedList( rL ), xCellEntry(rE), pLocalColOffset( pTO ), nFirstTableCell( nFTC ), nRowCnt( nRow ), @@ -427,7 +427,7 @@ protected: explicit ScHTMLTable( SfxItemPool& rPool, EditEngine& rEditEngine, - ::std::vector< ScEEParseEntry* >& rEEParseList, + std::vector<std::shared_ptr<ScEEParseEntry>>& rEEParseList, ScHTMLTableId& rnUnusedId, ScHTMLParser* pParser ); /** Fills all empty cells in this and nested tables with dummy parse entries. */ @@ -526,7 +526,7 @@ private: ScRangeList maVMergedCells; /// List of all vertically merged cells. ScRangeList maUsedCells; /// List of all used cells. EditEngine& mrEditEngine; /// Edit engine (from ScEEParser). - ::std::vector< ScEEParseEntry* >& mrEEParseList; /// List that owns the parse entries (from ScEEParser). + std::vector<std::shared_ptr<ScEEParseEntry>>& mrEEParseList; /// List that owns the parse entries (from ScEEParser). ScHTMLEntryMap maEntryMap; /// List of entries for each cell. ScHTMLEntryVector* mpCurrEntryVector; /// Current entry vector from map for faster access. ScHTMLEntryPtr mxCurrEntry; /// Working entry, not yet inserted in a list. @@ -549,7 +549,7 @@ public: explicit ScHTMLGlobalTable( SfxItemPool& rPool, EditEngine& rEditEngine, - ::std::vector< ScEEParseEntry* >& rEEParseList, + std::vector<std::shared_ptr<ScEEParseEntry>>& rEEParseList, ScHTMLTableId& rnUnusedId, ScHTMLParser* pParser ); virtual ~ScHTMLGlobalTable() override; diff --git a/sc/source/filter/rtf/eeimpars.cxx b/sc/source/filter/rtf/eeimpars.cxx index 0680767a042f..f84cc987ef8d 100644 --- a/sc/source/filter/rtf/eeimpars.cxx +++ b/sc/source/filter/rtf/eeimpars.cxx @@ -625,12 +625,8 @@ ScEEParser::ScEEParser( EditEngine* pEditP ) : ScEEParser::~ScEEParser() { - delete pActEntry; - while ( !maList.empty() ) - { - delete maList.back(); - maList.pop_back(); - } + mxActEntry.reset(); + maList.clear(); // Don't delete Pool until the lists have been deleted pPool->SetSecondaryPool( nullptr ); @@ -639,10 +635,10 @@ ScEEParser::~ScEEParser() } void ScEEParser::NewActEntry( const ScEEParseEntry* pE ) -{ // New free-flying pActEntry - pActEntry = new ScEEParseEntry( pPool ); - pActEntry->aSel.nStartPara = (pE ? pE->aSel.nEndPara + 1 : 0); - pActEntry->aSel.nStartPos = 0; +{ // New free-flying mxActEntry + mxActEntry.reset(new ScEEParseEntry(pPool)); + mxActEntry->aSel.nStartPara = (pE ? pE->aSel.nEndPara + 1 : 0); + mxActEntry->aSel.nStartPos = 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/rtf/rtfparse.cxx b/sc/source/filter/rtf/rtfparse.cxx index 49ad81fcb518..1b091aa6234a 100644 --- a/sc/source/filter/rtf/rtfparse.cxx +++ b/sc/source/filter/rtf/rtfparse.cxx @@ -64,7 +64,7 @@ ErrCode ScRTFParser::Read( SvStream& rStream, const OUString& rBaseURL ) { if ( !maList.empty() ) { - ScEEParseEntry* pE = maList.back(); + auto& pE = maList.back(); if ( // Completely empty ( pE->aSel.nStartPara == pE->aSel.nEndPara && pE->aSel.nStartPos == pE->aSel.nEndPos @@ -128,10 +128,9 @@ void ScRTFParser::ColAdjust() if ( nStartAdjust != (sal_uLong)~0 ) { SCCOL nCol = 0; - ScEEParseEntry* pE; - for ( size_t i = nStartAdjust, nListSize = maList.size(); i < nListSize; ++ i ) + for (size_t i = nStartAdjust, nListSize = maList.size(); i < nListSize; ++i) { - pE = maList[ i ]; + auto& pE = maList[i]; if ( pE->nCol == 0 ) nCol = 0; pE->nCol = nCol; @@ -333,28 +332,28 @@ void ScRTFParser::ProcToken( RtfImportInfo* pInfo ) pActDefault = pInsDefault; if ( pActDefault->nColOverlap > 0 ) { // Not merged with preceding - pActEntry->nCol = pActDefault->nCol; - pActEntry->nColOverlap = pActDefault->nColOverlap; - pActEntry->nTwips = pActDefault->nTwips; - pActEntry->nRow = nRowCnt; - pActEntry->aItemSet.Set( pActDefault->aItemSet ); - EntryEnd( pActEntry, pInfo->aSelection ); + mxActEntry->nCol = pActDefault->nCol; + mxActEntry->nColOverlap = pActDefault->nColOverlap; + mxActEntry->nTwips = pActDefault->nTwips; + mxActEntry->nRow = nRowCnt; + mxActEntry->aItemSet.Set(pActDefault->aItemSet); + EntryEnd(mxActEntry.get(), pInfo->aSelection); if ( nStartAdjust == (sal_uLong)~0 ) nStartAdjust = maList.size(); - maList.push_back( pActEntry ); - NewActEntry( pActEntry ); // New free-flying pActEntry + maList.push_back(mxActEntry); + NewActEntry(mxActEntry.get()); // New free-flying mxActEntry } else { // Assign current Twips to MergeCell if ( !maList.empty() ) { - ScEEParseEntry* pE = maList.back(); + auto& pE = maList.back(); pE->nTwips = pActDefault->nTwips; } - // Adjust selection of free-flying pActEntry + // Adjust selection of free-flying mxActEntry // Paragraph -1 due to separated text in EditEngine during parsing - pActEntry->aSel.nStartPara = pInfo->aSelection.nEndPara - 1; + mxActEntry->aSel.nStartPara = pInfo->aSelection.nEndPara - 1; } pActDefault = nullptr; @@ -375,11 +374,11 @@ void ScRTFParser::ProcToken( RtfImportInfo* pInfo ) if ( !pActDefault ) { // text not in table ColAdjust(); // close the processing table - pActEntry->nCol = 0; - pActEntry->nRow = nRowCnt; - EntryEnd( pActEntry, pInfo->aSelection ); - maList.push_back( pActEntry ); - NewActEntry( pActEntry ); // new pActEntry + mxActEntry->nCol = 0; + mxActEntry->nRow = nRowCnt; + EntryEnd(mxActEntry.get(), pInfo->aSelection); + maList.push_back(mxActEntry); + NewActEntry(mxActEntry.get()); // new mxActEntry NextRow(); } nRtfLastToken = pInfo->nToken;
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits