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

Noel Power noel.power at suse.com
Thu Aug 1 09:04:07 PDT 2013


 sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx |binary
 sc/qa/unit/subsequent_export-test.cxx           |   32 +++++++++++++++++
 sc/source/filter/excel/excdoc.cxx               |    5 ++
 sc/source/filter/excel/excrecds.cxx             |   44 ++++++++++++++++++++++++
 sc/source/filter/inc/excrecds.hxx               |    8 ++++
 sc/source/filter/oox/worksheetsettings.cxx      |   35 +++++++++++++++----
 6 files changed, 118 insertions(+), 6 deletions(-)

New commits:
commit 96ef3ad2d84b3d390f0bdd47408d2a7b2c569087
Author: Noel Power <noel.power at suse.com>
Date:   Thu Aug 1 16:41:11 2013 +0100

    unit test for fdo#64753 ( import/export of sheetprotection )
    
    Change-Id: Ib66a8ef62ba598890c7db634cf54003fd92485a7

diff --git a/sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx b/sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx
new file mode 100755
index 0000000..509ebe2
Binary files /dev/null and b/sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index 19ecd3d..f881923 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -30,6 +30,7 @@
 #include "tokenarray.hxx"
 
 #include "svx/svdoole2.hxx"
+#include "tabprotection.hxx"
 
 using namespace ::com::sun::star;
 using namespace ::com::sun::star::uno;
@@ -58,6 +59,7 @@ public:
     void testInlineArrayXLS();
     void testEmbeddedChartXLS();
     void testFormulaReferenceXLS();
+    void testSheetProtectionXLSX();
 
     CPPUNIT_TEST_SUITE(ScExportTest);
     CPPUNIT_TEST(test);
@@ -73,6 +75,8 @@ public:
     CPPUNIT_TEST(testInlineArrayXLS);
     CPPUNIT_TEST(testEmbeddedChartXLS);
     CPPUNIT_TEST(testFormulaReferenceXLS);
+    CPPUNIT_TEST(testSheetProtectionXLSX);
+
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -447,6 +451,34 @@ void ScExportTest::testFormulaReferenceXLS()
     xDocSh->DoClose();
 }
 
+void ScExportTest::testSheetProtectionXLSX()
+{
+    ScDocShellRef xShell = loadDoc("ProtecteSheet1234Pass.", XLSX);
+    CPPUNIT_ASSERT(xShell.Is());
+
+    ScDocShellRef xDocSh = saveAndReload(xShell, XLSX);
+    CPPUNIT_ASSERT(xDocSh.Is());
+
+    ScDocument* pDoc = xDocSh->GetDocument();
+    CPPUNIT_ASSERT(pDoc);
+    const ScTableProtection* pTabProtect = pDoc->GetTabProtection(0);
+    CPPUNIT_ASSERT(pTabProtect);
+    if ( pTabProtect )
+    {
+        Sequence<sal_Int8> aHash = pTabProtect->getPasswordHash(PASSHASH_XL);
+        // check has
+        if (aHash.getLength() >= 2)
+        {
+            CPPUNIT_ASSERT( (sal_uInt8)aHash[0] == 204 );
+            CPPUNIT_ASSERT( (sal_uInt8)aHash[1] == 61 );
+        }
+        // we could flesh out this check I guess
+        CPPUNIT_ASSERT ( pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) );
+        CPPUNIT_ASSERT ( pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) );
+    }
+    xDocSh->DoClose();
+}
+
 ScExportTest::ScExportTest()
       : ScBootstrapFixture("/sc/qa/unit/data")
 {
commit 8ce1124359783df750d176b8390b4eb0f54fb6ba
Author: Noel Power <noel.power at suse.com>
Date:   Thu Aug 1 14:29:34 2013 +0100

    2nd step to export SheetProtection fdo#64753, actually export the data
    
    Change-Id: Id9fa1f9b917f9df8ca0ead02dfd5405388039b4b

diff --git a/sc/source/filter/excel/excdoc.cxx b/sc/source/filter/excel/excdoc.cxx
index b56f780..89dcce8 100644
--- a/sc/source/filter/excel/excdoc.cxx
+++ b/sc/source/filter/excel/excdoc.cxx
@@ -593,6 +593,11 @@ void ExcTable::FillAsXmlTable( SCTAB nCodeNameIdx )
     // conditional formats
     Add( new XclExpCondFormatBuffer( GetRoot(), xExtLst ) );
 
+    ScDocument& rDoc = GetDoc();
+    const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
+    if (pTabProtect && pTabProtect->isProtected())
+        Add( new XclExpSheetProtection(true, mnScTab) );
+
     if( HasVbaStorage() )
         if( nCodeNameIdx < GetExtDocOptions().GetCodeNameCount() )
             Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx
index 3469b36..c63d3c5 100644
--- a/sc/source/filter/excel/excrecds.cxx
+++ b/sc/source/filter/excel/excrecds.cxx
@@ -79,6 +79,7 @@
 #include "xecontent.hxx"
 
 #include "xcl97rec.hxx"
+#include "tabprotection.hxx"
 
 using namespace ::oox;
 
@@ -494,6 +495,49 @@ XclExpProtection::XclExpProtection(bool bValue) :
 {
 }
 
+XclExpSheetProtection::XclExpSheetProtection(bool bValue, SCTAB nTab ) :
+    XclExpProtection( bValue),
+    mnTab(nTab)
+{
+}
+
+void XclExpSheetProtection::SaveXml( XclExpXmlStream& rStrm )
+{
+   ScDocument& rDoc = rStrm.GetRoot().GetDoc();
+   const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnTab);
+   if ( pTabProtect )
+   {
+        Sequence<sal_Int8> aHash = pTabProtect->getPasswordHash(PASSHASH_XL);
+        sal_uInt16 nHash(0x0000);
+        OString sHash;
+        if (aHash.getLength() >= 2)
+        {
+            nHash = ((aHash[0] << 8) & 0xFFFF);
+            nHash |= (aHash[1] & 0xFF);
+            sHash = OString::valueOf( nHash, 16 );
+        }
+        sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
+        rWorksheet->singleElement( XML_sheetProtection,
+            XML_sheet,  XclXmlUtils::ToPsz( true ),
+            XML_password, sHash.getStr(),
+            XML_objects, pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ? XclXmlUtils::ToPsz( true ) : NULL,
+            XML_scenarios, pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ? XclXmlUtils::ToPsz( true ) : NULL,
+            XML_formatCells, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_CELLS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_formatColumns, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_formatRows, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_insertColumns, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_insertRows, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_insertHyperlinks, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_HYPERLINKS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_deleteColumns, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_deleteRows, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_selectLockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_LOCKED_CELLS ) ? XclXmlUtils::ToPsz( true ) : NULL,
+            XML_sort, pTabProtect->isOptionEnabled( ScTableProtection::SORT ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_autoFilter, pTabProtect->isOptionEnabled( ScTableProtection::AUTOFILTER ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_pivotTables, pTabProtect->isOptionEnabled( ScTableProtection::PIVOT_TABLES ) ? NULL : XclXmlUtils::ToPsz( true ),
+            XML_selectUnlockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_UNLOCKED_CELLS ) ? XclXmlUtils::ToPsz( true ) : NULL,
+            FSEND );
+    }
+}
 // ============================================================================
 
 XclExpPassHash::XclExpPassHash(const Sequence<sal_Int8>& aHash) :
diff --git a/sc/source/filter/inc/excrecds.hxx b/sc/source/filter/inc/excrecds.hxx
index 426f0cf..f0de420 100644
--- a/sc/source/filter/inc/excrecds.hxx
+++ b/sc/source/filter/inc/excrecds.hxx
@@ -191,6 +191,14 @@ class XclExpProtection : public XclExpBoolRecord
         XclExpProtection(bool bValue);
 };
 
+class XclExpSheetProtection : public XclExpProtection
+{
+    SCTAB                   mnTab;
+    public:
+        XclExpSheetProtection(bool bValue, SCTAB nTab);
+    virtual void            SaveXml( XclExpXmlStream& rStrm );
+};
+
 class XclExpPassHash : public XclExpRecord
 {
 public:
commit 016e18680e471d9f0cea8ee35f9716ae0f9baa11
Author: Noel Power <noel.power at suse.com>
Date:   Thu Aug 1 10:04:42 2013 +0100

    1st step fix for exporting SheetProtection fdo#64753 is to import correctly
    
    Change-Id: If420b386543c15c7b550a720b6e2db69bf372d7f

diff --git a/sc/source/filter/oox/worksheetsettings.cxx b/sc/source/filter/oox/worksheetsettings.cxx
index 1980283..96ca193 100644
--- a/sc/source/filter/oox/worksheetsettings.cxx
+++ b/sc/source/filter/oox/worksheetsettings.cxx
@@ -26,6 +26,8 @@
 #include "biffinputstream.hxx"
 #include "pagesettings.hxx"
 #include "workbooksettings.hxx"
+#include "tabprotection.hxx"
+#include "document.hxx"
 
 namespace oox {
 namespace xls {
@@ -231,13 +233,34 @@ void WorksheetSettings::importPhoneticPr( SequenceInputStream& rStrm )
 void WorksheetSettings::finalizeImport()
 {
     // sheet protection
-    if( maSheetProt.mbSheet ) try
-    {
-        Reference< XProtectable > xProtectable( getSheet(), UNO_QUERY_THROW );
-        xProtectable->protect( OUString() );
-    }
-    catch( Exception& )
+    if( maSheetProt.mbSheet )
     {
+        ScTableProtection aProtect;
+        aProtect.setProtected(true);
+        if (maSheetProt.mnPasswordHash)
+        {
+            Sequence<sal_Int8> aPass(2);
+            aPass[0] = ( maSheetProt.mnPasswordHash>> 8) & 0xFF;
+            aPass[1] = maSheetProt.mnPasswordHash & 0xFF;
+            aProtect.setPasswordHash(aPass, PASSHASH_XL);
+        }
+        aProtect.setOption( ScTableProtection::OBJECTS, maSheetProt.mbObjects);
+        aProtect.setOption( ScTableProtection::SCENARIOS, maSheetProt.mbScenarios );
+        aProtect.setOption( ScTableProtection::FORMAT_CELLS, maSheetProt.mbFormatCells );
+        aProtect.setOption( ScTableProtection::FORMAT_COLUMNS, maSheetProt.mbFormatColumns );
+        aProtect.setOption( ScTableProtection::FORMAT_ROWS, maSheetProt.mbFormatRows );
+        aProtect.setOption( ScTableProtection::INSERT_COLUMNS, maSheetProt.mbInsertColumns );
+        aProtect.setOption( ScTableProtection::INSERT_ROWS,  maSheetProt.mbInsertRows );
+        aProtect.setOption( ScTableProtection::INSERT_HYPERLINKS, maSheetProt.mbInsertHyperlinks );
+        aProtect.setOption( ScTableProtection::DELETE_COLUMNS, maSheetProt.mbDeleteColumns );
+        aProtect.setOption( ScTableProtection::DELETE_ROWS,maSheetProt.mbDeleteRows );
+        aProtect.setOption( ScTableProtection::SELECT_LOCKED_CELLS, maSheetProt.mbSelectLocked );
+        aProtect.setOption( ScTableProtection::SORT, maSheetProt.mbSort );
+        aProtect.setOption( ScTableProtection::AUTOFILTER, maSheetProt.mbAutoFilter );
+        aProtect.setOption( ScTableProtection::PIVOT_TABLES, maSheetProt.mbPivotTables );
+        aProtect.setOption( ScTableProtection::SELECT_UNLOCKED_CELLS, maSheetProt.mbSelectUnlocked );
+
+        getScDocument().SetTabProtection( getSheetIndex(), &aProtect );
     }
 
     // VBA code name


More information about the Libreoffice-commits mailing list