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

Katarina Behrens Katarina.Behrens at cib.de
Wed Oct 28 08:00:26 PDT 2015


 sc/qa/unit/subsequent_export-test.cxx |   30 ++++++++++++++++++++++++++++++
 sc/source/filter/excel/excdoc.cxx     |   12 ++++++++++--
 sc/source/ui/unoobj/confuno.cxx       |   16 +++++++++++-----
 3 files changed, 51 insertions(+), 7 deletions(-)

New commits:
commit 73a851048f5173c3e6411f48ef26e006de7b63d8
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Mon Oct 26 18:36:49 2015 +0100

    tdf#92256: Don't save CONV_UNSPECIFIED string ref syntax value
    
    The following scenario is how it breaks:
    1. user has ExcelA1 as her formula syntax setting, CONV_UNSPECIFIED
    (that means "same as formula syntax") as her string ref syntax setting
    2. she saves the document, it will now contain CONV_UNSPECIFIED value
    3. someone else with CalcA1 formula syntax setting opens the document
    ... since it contains CONV_UNSPECIFIED "same as formula syntax" value,
    it will use his CalcA1 formula syntax value to evaluate INDIRECT func
    => #REF!
    
    Avoid this by reading formula syntax/grammar value, mapping it to
    matching string ref syntax and saving that instead of CONV_UNSPECIFIED
    
    Change-Id: Ide62d81e6b70c2e9f2ff79648935788107475778
    Reviewed-on: https://gerrit.libreoffice.org/19610
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index 6b1f60e..0ab499b 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -157,6 +157,7 @@ public:
 
     void testRefStringXLSX();
     void testRefStringConfigXLSX();
+    void testRefStringUnspecified();
     void testHeaderImage();
 
     CPPUNIT_TEST_SUITE(ScExportTest);
@@ -222,6 +223,7 @@ public:
 
     CPPUNIT_TEST(testRefStringXLSX);
     CPPUNIT_TEST(testRefStringConfigXLSX);
+    CPPUNIT_TEST(testRefStringUnspecified);
     CPPUNIT_TEST(testHeaderImage);
 
     CPPUNIT_TEST_SUITE_END();
@@ -2966,6 +2968,34 @@ void ScExportTest::testRefStringConfigXLSX()
     xNewDocSh->DoClose();
 }
 
+void ScExportTest::testRefStringUnspecified()
+{
+    ScDocShell* pShell = new ScDocShell(
+        SfxModelFlags::EMBEDDED_OBJECT |
+        SfxModelFlags::DISABLE_EMBEDDED_SCRIPTS |
+        SfxModelFlags::DISABLE_DOCUMENT_RECOVERY);
+    pShell->DoInitNew();
+
+    ScDocument& rDoc = pShell->GetDocument();
+    ScCalcConfig aConfig = rDoc.GetCalcConfig();
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Default string ref syntax value doesn't match", formula::FormulaGrammar::CONV_UNSPECIFIED,
+                            aConfig.meStringRefAddressSyntax);
+
+    // change formula syntax (i.e. not string ref syntax) to ExcelA1
+    rDoc.SetGrammar( formula::FormulaGrammar::GRAM_NATIVE_XL_A1 );
+
+    ScDocShellRef xDocSh = saveAndReload( pShell, ODS );
+    CPPUNIT_ASSERT_MESSAGE("Failed to reload doc", xDocSh.Is());
+
+    // with string ref syntax at its default value, we should've saved ExcelA1
+    ScDocument& rDoc2 = xDocSh->GetDocument();
+    aConfig = rDoc2.GetCalcConfig();
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match", formula::FormulaGrammar::CONV_XL_A1,
+                            aConfig.meStringRefAddressSyntax);
+
+    xDocSh->DoClose();
+}
+
 void ScExportTest::testHeaderImage()
 {
     // Graphic as header background was lost on export.
diff --git a/sc/source/filter/excel/excdoc.cxx b/sc/source/filter/excel/excdoc.cxx
index 37450ca..ee4c4cc 100644
--- a/sc/source/filter/excel/excdoc.cxx
+++ b/sc/source/filter/excel/excdoc.cxx
@@ -888,15 +888,23 @@ void ExcDocument::WriteXml( XclExpXmlStream& rStrm )
         rCaches.SaveXml(rStrm);
 
     const ScCalcConfig& rCalcConfig = GetDoc().GetCalcConfig();
+    formula::FormulaGrammar::AddressConvention eConv = rCalcConfig.meStringRefAddressSyntax;
+
+    // don't save "unspecified" string ref syntax ... query formula grammar
+    // and save that instead
+    if( eConv == formula::FormulaGrammar::CONV_UNSPECIFIED)
+    {
+        eConv = GetDoc().GetAddressConvention();
+    }
 
     // write if it has been read|imported or explicitly changed
     // or if ref syntax isn't what would be native for our file format
     // i.e. ExcelA1 in this case
     if ( rCalcConfig.mbHasStringRefSyntax ||
-         (rCalcConfig.meStringRefAddressSyntax != formula::FormulaGrammar::CONV_XL_A1) )
+         (eConv != formula::FormulaGrammar::CONV_XL_A1) )
     {
         XclExtLstRef xExtLst( new XclExtLst( GetRoot()  ) );
-        xExtLst->AddRecord( XclExpExtRef( new XclExpExtCalcPr( GetRoot(), rCalcConfig.meStringRefAddressSyntax ))  );
+        xExtLst->AddRecord( XclExpExtRef( new XclExpExtCalcPr( GetRoot(), eConv ))  );
         xExtLst->SaveXml(rStrm);
     }
 
diff --git a/sc/source/ui/unoobj/confuno.cxx b/sc/source/ui/unoobj/confuno.cxx
index 3c9277c..e4ff166 100644
--- a/sc/source/ui/unoobj/confuno.cxx
+++ b/sc/source/ui/unoobj/confuno.cxx
@@ -461,22 +461,28 @@ uno::Any SAL_CALL ScDocumentConfiguration::getPropertyValue( const OUString& aPr
         else if ( aPropertyName == SC_UNO_SYNTAXSTRINGREF )
         {
             ScCalcConfig aCalcConfig = rDoc.GetCalcConfig();
+            formula::FormulaGrammar::AddressConvention eConv = aCalcConfig.meStringRefAddressSyntax;
+
+            // don't save "unspecified" string ref syntax ... query formula grammar
+            // and save that instead
+            if( eConv == formula::FormulaGrammar::CONV_UNSPECIFIED)
+            {
+                eConv = rDoc.GetAddressConvention();
+            }
 
             // write if it has been read|imported or explicitly changed
             // or if ref syntax isn't what would be native for our file format
             // i.e. CalcA1 in this case
             if ( aCalcConfig.mbHasStringRefSyntax ||
-                 (aCalcConfig.meStringRefAddressSyntax != formula::FormulaGrammar::CONV_OOO) )
+                 (eConv != formula::FormulaGrammar::CONV_OOO) )
             {
-                formula::FormulaGrammar::AddressConvention aConv = aCalcConfig.meStringRefAddressSyntax;
-
-                switch (aConv)
+                switch (eConv)
                 {
                     case formula::FormulaGrammar::CONV_OOO:
                     case formula::FormulaGrammar::CONV_XL_A1:
                     case formula::FormulaGrammar::CONV_XL_R1C1:
                     case formula::FormulaGrammar::CONV_A1_XL_A1:
-                         aRet <<= static_cast<sal_Int16>( aConv );
+                         aRet <<= static_cast<sal_Int16>( eConv );
                          break;
 
                     case formula::FormulaGrammar::CONV_UNSPECIFIED:


More information about the Libreoffice-commits mailing list