[Libreoffice-commits] core.git: Branch 'libreoffice-4-2-1' - sw/qa writerfilter/source

Michael Stahl mstahl at redhat.com
Tue Feb 18 14:06:16 CET 2014


 sw/qa/extras/rtfimport/data/rhbz1065629.rtf    |   81 +++++++++++++++++++++++++
 sw/qa/extras/rtfimport/rtfimport.cxx           |   19 +++++
 writerfilter/source/rtftok/rtfdocumentimpl.cxx |   14 ++++
 writerfilter/source/rtftok/rtfdocumentimpl.hxx |    1 
 4 files changed, 115 insertions(+)

New commits:
commit fb4131ba8f3fb2a00dccf8cf24bf78caa91b680b
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Feb 18 11:22:52 2014 +0100

    rhbz#1065629: RTF import: don't drop nested cells if not enough \cellx
    
    In this document written by "XMLmind XSL-FO Converter" there are less
    \cellx than \cell and thus when reading \nestrow/\row a whole buffered
    nested table \cell is lost and then subsequently the rest of the nested
    table too.  Try to fix that by counting both \cell and \cellx and
    replaying until the maximum of those.
    
    Cannot count \intbl since we synthesize that in various places.
    
    (regression in LO 3.5)
    
    Change-Id: I3b64ad94af842e076611418589a0c83bd18841c6
    (cherry picked from commit 07ef4cf096015f0e427ffd17cd26bb6837e75481)
    Reviewed-on: https://gerrit.libreoffice.org/8100
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit 34de0b64b9184a85cd7fb65d0e811b435e90fe24)
    Reviewed-on: https://gerrit.libreoffice.org/8102
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/qa/extras/rtfimport/data/rhbz1065629.rtf b/sw/qa/extras/rtfimport/data/rhbz1065629.rtf
new file mode 100644
index 0000000..b22ec50
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/rhbz1065629.rtf
@@ -0,0 +1,81 @@
+{\rtf1\ansi\ansicpg1252\deff0
+{\fonttbl
+\f0\froman\fcharset0 Times New Roman;
+\f1\fswiss\fcharset0 Arial;
+\f2\fmodern\fcharset0 Courier New;
+\f3\ftech\fcharset2 Symbol;
+\f4\fswiss\fcharset0 Helvetica;
+}
+{\info
+{\*\userprops
+{\propname creator}\proptype30
+{\staticval XMLmind XSL-FO Converter Professional Edition 4.6.1}
+}
+}
+\facingp\fet0\ftnbj
+\sectd
+\pghsxn16114\pgwsxn12514
+\margtsxn720\margbsxn907\marglsxn907\margrsxn1080
+\headery720
+\footery547
+\pgncont\pgndec
+
+\par
+\trowd\trleft10
+\clvertalt
+\clcbpat17
+\clbrdrt\brdrs\brdrw20\brdrcf2\clbrdrb\brdrs\brdrw20\brdrcf2\clbrdrl\brdrs\brdrw20\brdrcf2\clbrdrr\brdrs\brdrw20\brdrcf2\cellx10262
+\pard\intbl
+{\plain\f4\fs19\b\cf15\ulc2
+Informations client
+}
+\cell
+\row
+\trowd\trleft10
+\clvertalt
+\clbrdrl\brdrs\brdrw10\brdrcf2\cellx5136
+\clvertalt
+\clbrdrl\brdrs\brdrw10\brdrcf2\clbrdrr\brdrs\brdrw10\brdrcf2\cellx10262
+\pard\intbl\itap2
+{\plain\f4\fs18\cf2\ulc2
+E-mail:
+}
+\nestcell
+{\*\nesttableprops
+\trowd\trleft0
+\clvertalt
+\cellx5400
+\nestrow}
+\pard\intbl
+\cell
+\pard\intbl\itap2
+{\plain\f4\fs18\b\cf2\ulc2
+Responsable Commercial:
+}
+\nestcell
+{\*\nesttableprops
+\trowd\trleft0
+\clvertalt
+\cellx5400
+\nestrow}
+\pard\intbl\itap2
+{\plain\f4\fs18\cf2\ulc2
+\~
+}
+\par
+\pard\intbl\itap2
+{\plain\f4\fs18\cf2\ulc2
+Nom: John Doe
+}
+\nestcell
+{\*\nesttableprops
+\trowd\trleft0
+\clvertalt
+\cellx5400
+\nestrow}
+\pard\intbl
+\cell
+\row
+
+\pard\sect
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 42ee83c..b389af6 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -1364,6 +1364,25 @@ DECLARE_RTFIMPORT_TEST(testCp1000018, "cp1000018.rtf")
 
 #endif
 
+DECLARE_RTFIMPORT_TEST(testNestedTable, "rhbz1065629.rtf")
+{
+    // nested table in second cell was missing
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
+    uno::Reference<text::XTextTable> xTable(xTables->getByIndex(1), uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xCell(xTable->getCellByName("A1"), uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell->getText(), uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
+    uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("Responsable Commercial:"), xPara->getString());
+    xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY);
+    xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY);
+    xParaEnum = xParaEnumAccess->createEnumeration();
+    xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY);
+    xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("Nom: John Doe"), xPara->getString());
+}
+
 DECLARE_RTFIMPORT_TEST(testCp1000016, "hello.rtf")
 {
     // The single-line document had a second fake empty para on Windows.
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 7f3e253..ef7117e 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -1867,6 +1867,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
                 RTFValue::Pointer_t pValue;
                 m_aTableBuffer.push_back(make_pair(BUFFER_CELLEND, pValue));
                 m_bNeedPap = true;
+                m_aStates.top().nCellEnds++;
             }
             break;
         case RTF_ROW:
@@ -1899,6 +1900,17 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
                     m_aStates.top().aTableCellsAttributes.pop_front();
                     replayBuffer(m_aTableBuffer);
                 }
+                for (int i = 0; i < m_aStates.top().nCellEnds - m_aStates.top().nCells; ++i)
+                {
+                    replayBuffer(m_aTableBuffer);
+                }
+                for (size_t i = 0; i < m_aTableBuffer.size(); ++i)
+                {
+                    SAL_WARN_IF(BUFFER_CELLEND == m_aTableBuffer[i].first,
+                        "writerfilter.rtf", "dropping table cell!");
+                }
+                assert(0 == m_aStates.top().aTableCellsSprms.size());
+                assert(0 == m_aStates.top().aTableCellsAttributes.size());
                 m_aStates.top().aTableCellSprms = m_aDefaultState.aTableCellSprms;
                 m_aStates.top().aTableCellAttributes = m_aDefaultState.aTableCellAttributes;
 
@@ -1951,6 +1963,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
                 m_bNeedFinalPar = true;
                 m_aTableBuffer.clear();
                 m_aStates.top().nCells = 0;
+                m_aStates.top().nCellEnds = 0;
                 m_aStates.top().aTableCellsSprms.clear();
                 m_aStates.top().aTableCellsAttributes.clear();
             }
@@ -4877,6 +4890,7 @@ RTFParserState::RTFParserState(RTFDocumentImpl *pDocumentImpl)
     nCellX(0),
     nCells(0),
     nInheritingCells(0),
+    nCellEnds(0),
     bIsCjk(false),
     nYear(0),
     nMonth(0),
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index eada5fa..e61b415 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -236,6 +236,7 @@ namespace writerfilter {
                 int nCellX;
                 int nCells;
                 int nInheritingCells;
+                int nCellEnds;
 
                 /// CJK or CTL?
                 bool bIsCjk;


More information about the Libreoffice-commits mailing list