[Libreoffice-commits] core.git: sw/qa writerfilter/source

László Németh (via logerrit) logerrit at kemper.freedesktop.org
Tue Sep 15 06:17:12 UTC 2020


 sw/qa/extras/ooxmlexport/data/tdf136667.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport11.cxx   |    8 +++
 writerfilter/source/dmapper/PropertyMap.cxx  |   57 ++++++++++++++-------------
 3 files changed, 39 insertions(+), 26 deletions(-)

New commits:
commit 464a7b0631335a8f8729512b8c27f864747f56a7
Author:     László Németh <nemeth at numbertext.org>
AuthorDate: Mon Sep 14 11:00:27 2020 +0200
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Tue Sep 15 08:16:31 2020 +0200

    tdf#136667 DOCX import: fix crash of floating tables
    
    with tracked changes of table structure (not only cell
    text content), where text ranges of redlines aren't
    connected to a cell. Support also different table names
    of redline text ranges for sure.
    
    Regression from commit 288db6eb47fbbd2b3ca34ffea0686d8ed8ed9be9
    (tdf#132271 DOCX: import change tracking in floating tables).
    
    Change-Id: I58b1b21c8016d682a292409165991dec2f8cfa3d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102655
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf136667.docx b/sw/qa/extras/ooxmlexport/data/tdf136667.docx
new file mode 100644
index 000000000000..e5b047ee3330
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136667.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index 6cdecfd2c258..cd00389f063c 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -979,6 +979,14 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf132271, "tdf132271.docx")
     assertXPath(pXmlDoc, "//w:ins", 2);
 }
 
+DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf136667, "tdf136667.docx")
+{
+    xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml");
+    // import change tracking in floating tables
+    assertXPath(pXmlDoc, "//w:del", 2);
+    assertXPath(pXmlDoc, "//w:ins", 4);
+}
+
 DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf128156, "tdf128156.docx")
 {
     xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml");
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 4e08279a8427..7a2807746141 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -1380,52 +1380,57 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
                 // convert redline ranges to cursor movement and character length
                 std::vector<sal_Int32> redPos, redLen;
                 std::vector<OUString> redCell;
-                OUString sTableName;
+                std::vector<OUString> redTable;
                 for( size_t i = 0; i < aFramedRedlines.size(); i+=3)
                 {
                     uno::Reference<text::XText> xCell;
                     uno::Reference< text::XTextRange > xRange;
                     aFramedRedlines[i] >>= xRange;
                     uno::Reference< beans::XPropertySet > xRangeProperties;
+                    OUString sTableName;
+                    OUString sCellName;
                     if ( xRange.is() )
                     {
                         xRangeProperties.set( xRange, uno::UNO_QUERY_THROW );
-
-                        const uno::Sequence<beans::Property> aRangeProperties
-                            = xRangeProperties->getPropertySetInfo()->getProperties();
-
-                        for (const beans::Property& rProperty : aRangeProperties)
+                        if (xRangeProperties->getPropertySetInfo()->hasPropertyByName("TextTable"))
                         {
-                            const OUString& rKey = rProperty.Name;
-                            uno::Any aValue = xRangeProperties->getPropertyValue(rKey);
-                            if ( rKey == "TextTable" )
+                            uno::Any aTable = xRangeProperties->getPropertyValue("TextTable");
+                            if ( aTable != uno::Any() )
                             {
                                 uno::Reference<text::XTextTable> xTable;
-                                aValue >>= xTable;
+                                aTable >>= xTable;
                                 uno::Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY);
                                 xTableProperties->getPropertyValue("TableName") >>= sTableName;
                             }
-                            else if ( rKey == "Cell" )
+                            if (xRangeProperties->getPropertySetInfo()->hasPropertyByName("Cell"))
                             {
-                                 OUString sCellName;
-                                 aValue >>= xCell;
-                                 uno::Reference<beans::XPropertySet> xCellProperties(xCell, uno::UNO_QUERY);
-                                 xCellProperties->getPropertyValue("CellName") >>= sCellName;
-                                 redCell.push_back(sCellName);
+                                uno::Any aCell = xRangeProperties->getPropertyValue("Cell");
+                                if ( aCell != uno::Any() )
+                                {
+                                    aCell >>= xCell;
+                                    uno::Reference<beans::XPropertySet> xCellProperties(xCell, uno::UNO_QUERY);
+                                    xCellProperties->getPropertyValue("CellName") >>= sCellName;
+                                }
                             }
                         }
-
-                        uno::Reference<text::XTextCursor> xRangeCursor = xCell->createTextCursorByRange( xRange );
-                        if ( xRangeCursor.is() )
+                        redTable.push_back(sTableName);
+                        redCell.push_back(sCellName);
+                        bool bOk = false;
+                        if (!sTableName.isEmpty() && !sCellName.isEmpty())
                         {
-                            sal_Int32 nLen = xRange->getString().getLength();
-                            redLen.push_back(nLen);
-                            xRangeCursor->gotoStart(true);
-                            redPos.push_back(xRangeCursor->getString().getLength() - nLen);
+                            uno::Reference<text::XTextCursor> xRangeCursor = xCell->createTextCursorByRange( xRange );
+                            if ( xRangeCursor.is() )
+                            {
+                                bOk = true;
+                                sal_Int32 nLen = xRange->getString().getLength();
+                                redLen.push_back(nLen);
+                                xRangeCursor->gotoStart(true);
+                                redPos.push_back(xRangeCursor->getString().getLength() - nLen);
+                            }
                         }
-                        else
+                        if (!bOk)
                         {
-                            // failed createTextCursorByRange()
+                            // missing cell or failed createTextCursorByRange()
                             redLen.push_back(-1);
                             redPos.push_back(-1);
                         }
@@ -1437,7 +1442,6 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
 
                 uno::Reference<text::XTextTablesSupplier> xTextDocument(rDM_Impl.GetTextDocument(), uno::UNO_QUERY);
                 uno::Reference<container::XNameAccess> xTables = xTextDocument->getTextTables();
-                uno::Reference<text::XTextTable> xTable(xTables->getByName(sTableName), uno::UNO_QUERY);
                 for( size_t i = 0; i < aFramedRedlines.size(); i+=3)
                 {
                     OUString sType;
@@ -1447,6 +1451,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
                         continue;
                     aFramedRedlines[i+1] >>= sType;
                     aFramedRedlines[i+2] >>= aRedlineProperties;
+                    uno::Reference<text::XTextTable> xTable(xTables->getByName(redTable[i/3]), uno::UNO_QUERY);
                     uno::Reference<text::XText> xCell(xTable->getCellByName(redCell[i/3]), uno::UNO_QUERY);
                     uno::Reference<text::XTextCursor> xCrsr = xCell->createTextCursor();
                     xCrsr->goRight(redPos[i/3], false);


More information about the Libreoffice-commits mailing list