summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Deller <luke@deller.id.au>2013-05-23 02:05:36 +1000
committerMiklos Vajna <vmiklos@suse.cz>2013-05-27 15:44:13 +0200
commitb571605129426a1bf8eb7c9e9927785f8a9a5305 (patch)
tree28721538330ce79eed2bf30e01ca2ea21303ad97
parent92dc9cb50d2d7ebff6fb591d265589ef5f22dc1b (diff)
fix fdo#64872 infinite loop saving as doc
When loading from odt, table cells which are covered (due to merging of cells) are replaced with an empty cell by SwXMLTableContext::ReplaceWithEmptyCell. However if there is a sequence of cells covered from above then their replacements are accidentally inserted in reverse order, which produces this infinite loop problem when saving as doc. The reverse ordering in SwXMLTableContext::ReplaceWithEmptyCell was because the insert position came from SwXMLTableContext::GetPrevStartNode which was very careful to skip previous covered cells. However those cells have already been replaced with an empty cell so they should not be skipped. Change-Id: I6a022cd1490afa181dbc3e4b2d6ed4af3077b363 Signed-off-by: Miklos Vajna <vmiklos@suse.cz>
-rw-r--r--sw/source/filter/ww8/wrtw8sty.cxx2
-rw-r--r--sw/source/filter/xml/xmltbli.cxx26
2 files changed, 7 insertions, 21 deletions
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index 36ee09bd5784..f5370ea91ac2 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -531,7 +531,7 @@ void MSWordStyles::OutputStyle( SwFmt* pFmt, sal_uInt16 nPos )
// (It must be the English word regardless of language settings)
if ( nPos == 0 ) {
assert( pFmt->GetPoolFmtId() == RES_POOLCOLL_STANDARD );
- aName = OUString("Normal");
+ aName = rtl::OUString("Normal");
} else if (aName.EqualsIgnoreCaseAscii("Normal")) {
// If LO has a style named "Normal"(!) rename it to something unique
aName.InsertAscii("LO-" , 0);
diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx
index 6cd2cdcde522..50d5e9964d1b 100644
--- a/sw/source/filter/xml/xmltbli.cxx
+++ b/sw/source/filter/xml/xmltbli.cxx
@@ -1807,29 +1807,15 @@ const SwStartNode *SwXMLTableContext::GetPrevStartNode( sal_uInt32 nRow,
// The last cell is the right one here.
pPrevCell = GetCell( pRows->size()-1U, GetColumnCount()-1UL );
}
- else if( 0UL == nRow )
+ else if( nCol > 0UL )
{
- // There are no vertically merged cells within the first row, so the
- // previous cell is the right one always.
- if( nCol > 0UL )
- pPrevCell = GetCell( nRow, nCol-1UL );
+ // The previous cell in this row.
+ pPrevCell = GetCell( nRow, nCol-1UL );
}
- else
+ else if( nRow > 0UL )
{
- // If there is a previous cell in the current row that is not spanned
- // from the previous row, its the right one.
- const SwXMLTableRow_Impl *pPrevRow = &(*pRows)[(sal_uInt16)nRow-1U];
- sal_uInt32 i = nCol;
- while( !pPrevCell && i > 0UL )
- {
- i--;
- if( 1UL == pPrevRow->GetCell( i )->GetRowSpan() )
- pPrevCell = GetCell( nRow, i );
- }
-
- // Otherwise, the last cell from the previous row is the right one.
- if( !pPrevCell )
- pPrevCell = pPrevRow->GetCell( GetColumnCount()-1UL );
+ // The last cell from the previous row.
+ pPrevCell = GetCell( nRow-1UL, GetColumnCount()-1UL );
}
const SwStartNode *pSttNd = 0;