sw/source/filter/inc/msfilter.hxx | 3 ++- sw/source/filter/ww8/writerhelper.cxx | 13 ++++++++----- sw/source/filter/ww8/ww8par5.cxx | 6 ++++-- 3 files changed, 14 insertions(+), 8 deletions(-)
New commits: commit 4115b4c461fc6f4710e24a2e2b24d99e6bbca565 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Tue Nov 26 15:56:30 2019 +0100 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Wed Nov 27 11:47:03 2019 +0100 sw: WW8 import: fix again asserts on fdo45983-1.doc export to ODT The problem is that we now insert 2 dummy characters at the start of a fieldmark instead of 1, so the checks in RedlineStack::MoveAttrs() were off by 1 and we get the same invalid redline containing the start but not the end of a fieldmark. (regression from 7f2e61f884949ab27bcb7e1a02ece9a5cb4354b9) Change-Id: I9752ca4c3a281539e37ddac4fe811e2f9d7374a6 Reviewed-on: https://gerrit.libreoffice.org/83783 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> (cherry picked from commit 10d72337640677e2d49b522a734728646c9b8e96) Reviewed-on: https://gerrit.libreoffice.org/83812 diff --git a/sw/source/filter/inc/msfilter.hxx b/sw/source/filter/inc/msfilter.hxx index b5fbfdb2e737..f05283e46c51 100644 --- a/sw/source/filter/inc/msfilter.hxx +++ b/sw/source/filter/inc/msfilter.hxx @@ -299,7 +299,8 @@ namespace sw public: explicit RedlineStack(SwDoc &rDoc) : mrDoc(rDoc) {} - void MoveAttrs(const SwPosition& rPos); + enum class MoveAttrsMode { Default, FieldmarkInserted }; + void MoveAttrs(const SwPosition& rPos, MoveAttrsMode eMode = MoveAttrsMode::Default); void open(const SwPosition& rPos, const SfxPoolItem& rAttr); bool close(const SwPosition& rPos, RedlineType eType); void close(const SwPosition& rPos, RedlineType eType, diff --git a/sw/source/filter/ww8/writerhelper.cxx b/sw/source/filter/ww8/writerhelper.cxx index fa56ce68878e..46d1b4411fd1 100644 --- a/sw/source/filter/ww8/writerhelper.cxx +++ b/sw/source/filter/ww8/writerhelper.cxx @@ -738,11 +738,14 @@ namespace sw std::for_each(maStack.begin(), maStack.end(), SetEndIfOpen(rPos)); } - void RedlineStack::MoveAttrs( const SwPosition& rPos ) + void RedlineStack::MoveAttrs(const SwPosition& rPos, MoveAttrsMode const eMode) { size_t nCnt = maStack.size(); + sal_Int32 const nInserted = eMode == MoveAttrsMode::FieldmarkInserted + ? 2 // CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FIELDSEP + : 1; sal_uLong nPosNd = rPos.nNode.GetIndex(); - sal_Int32 nPosCt = rPos.nContent.GetIndex() - 1; + sal_Int32 nPosCt = rPos.nContent.GetIndex() - nInserted; for (size_t i=0; i < nCnt; ++i) { @@ -751,12 +754,12 @@ namespace sw if ((rEntry.m_aMkPos.m_nNode.GetIndex()+1 == nPosNd) && (nPosCt <= rEntry.m_aMkPos.m_nContent)) { - rEntry.m_aMkPos.m_nContent++; + rEntry.m_aMkPos.m_nContent += nInserted; SAL_WARN_IF(rEntry.m_aMkPos.m_nContent > rPos.nNode.GetNodes()[nPosNd]->GetContentNode()->Len(), "sw.ww8", "redline ends after end of line"); if (isPoint) // sigh ... important special case... { - rEntry.m_aPtPos.m_nContent++; + rEntry.m_aPtPos.m_nContent += nInserted; continue; } } @@ -765,7 +768,7 @@ namespace sw if ((rEntry.m_aPtPos.m_nNode.GetIndex()+1 == nPosNd) && (nPosCt < rEntry.m_aPtPos.m_nContent)) { - rEntry.m_aPtPos.m_nContent++; + rEntry.m_aPtPos.m_nContent += nInserted; SAL_WARN_IF(rEntry.m_aPtPos.m_nContent > rPos.nNode.GetNodes()[nPosNd]->GetContentNode()->Len(), "sw.ww8", "redline ends after end of line"); } diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx index e6f31bb0736a..ea0a435371a3 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -542,7 +542,8 @@ sal_uInt16 SwWW8ImplReader::End_Field() if (pFieldmark!=nullptr) { // adapt redline positions to inserted field mark start // dummy char (assume not necessary for end dummy char) - m_xRedlineStack->MoveAttrs(*aFieldPam.Start()); + m_xRedlineStack->MoveAttrs(*aFieldPam.Start(), + RedlineStack::MoveAttrsMode::FieldmarkInserted); const IFieldmark::parameter_map_t& rParametersToAdd = m_aFieldStack.back().getParameters(); pFieldmark->GetParameters()->insert(rParametersToAdd.begin(), rParametersToAdd.end()); } @@ -642,7 +643,8 @@ sal_uInt16 SwWW8ImplReader::End_Field() { // adapt redline positions to inserted field mark start // dummy char (assume not necessary for end dummy char) - m_xRedlineStack->MoveAttrs(*aFieldPam.Start()); + m_xRedlineStack->MoveAttrs(*aFieldPam.Start(), + RedlineStack::MoveAttrsMode::FieldmarkInserted); const IFieldmark::parameter_map_t& rParametersToAdd = m_aFieldStack.back().getParameters(); pFieldmark->GetParameters()->insert(rParametersToAdd.begin(), rParametersToAdd.end()); OUString sFieldId = OUString::number( m_aFieldStack.back().mnFieldId ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits