[Libreoffice-commits] core.git: sc/source

Caolán McNamara caolanm at redhat.com
Fri Nov 3 15:54:42 UTC 2017


 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 <caolanm at 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 <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at 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;


More information about the Libreoffice-commits mailing list