[Libreoffice-commits] core.git: 3 commits - sc/source
Eike Rathke
erack at redhat.com
Tue Mar 18 15:57:14 PDT 2014
sc/source/filter/excel/excimp8.cxx | 74 ++++++++++++++++++++++++++++++++++-
sc/source/filter/excel/read.cxx | 3 -
sc/source/filter/excel/xicontent.cxx | 37 +++++++++++------
sc/source/filter/inc/excimp8.hxx | 3 -
sc/source/filter/inc/xicontent.hxx | 24 +++++++++++
sc/source/filter/inc/xlconst.hxx | 6 ++
6 files changed, 131 insertions(+), 16 deletions(-)
New commits:
commit 35494ca3b3b5ec69322a0ecc29b676c89766f608
Author: Eike Rathke <erack at redhat.com>
Date: Tue Mar 18 23:36:39 2014 +0100
MS-XLS documentation uses big-endian bit diagrams
... so if it says leftmost bit 0 then test for high bit.
Change-Id: I260ff09fff66918da887742b5d177715e59548c2
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index 84174b1..c5008ef 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -367,7 +367,7 @@ void ImportExcel8::Feat( void )
aProt.mnAreserved = aIn.ReaduInt32();
aProt.mnPasswordVerifier = aIn.ReaduInt32();
aProt.maTitle = aIn.ReadUniString();
- if ((aProt.mnAreserved & 1) == 1)
+ if ((aProt.mnAreserved & 0x80000000) == 0x80000000)
{
sal_uInt32 nCbSD = aIn.ReaduInt32();
// TODO: could here be some sanity check applied to not allocate 4GB?
commit 2864bcdf49e916bd532c7ba0c4e678df9dc52e8f
Author: Eike Rathke <erack at redhat.com>
Date: Tue Mar 18 23:06:39 2014 +0100
start reading 0x0868 FEAT enhanced protection feature
Change-Id: Id38a7629ea5ed4bbb1a7d696926335ce0bdec6a6
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index e806999..84174b1 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -187,6 +187,22 @@ public:
}
};
+
+namespace {
+
+/** Future Record Type header.
+ @return whether read rt matches nRecordID
+ */
+bool readFrtHeader( XclImpStream& rStrm, sal_uInt16 nRecordID )
+{
+ sal_uInt16 nRt = rStrm.ReaduInt16();
+ rStrm.Ignore(10); // grbitFrt (2 bytes) and reserved (8 bytes)
+ return nRt == nRecordID;
+}
+
+}
+
+
ImportExcel8::ImportExcel8( XclImpRootData& rImpData, SvStream& rStrm ) :
ImportExcel( rImpData, rStrm )
{
@@ -304,12 +320,12 @@ void ImportExcel8::Labelsst( void )
void ImportExcel8::FeatHdr( void )
{
- aIn.Ignore(12);
+ if (!readFrtHeader( aIn, 0x0867))
+ return;
// Feature type (isf) can be EXC_ISFPROTECTION, EXC_ISFFEC2 or
// EXC_ISFFACTOID.
- sal_uInt16 nFeatureType(0);
- aIn >> nFeatureType;
+ sal_uInt16 nFeatureType = aIn.ReaduInt16();
if (nFeatureType != EXC_ISFPROTECTION)
// We currently only support import of enhanced protection data.
return;
@@ -319,6 +335,50 @@ void ImportExcel8::FeatHdr( void )
GetSheetProtectBuffer().ReadOptions( aIn, GetCurrScTab() );
}
+
+void ImportExcel8::Feat( void )
+{
+ if (!readFrtHeader( aIn, 0x0868))
+ return;
+
+ // Feature type (isf) can be EXC_ISFPROTECTION, EXC_ISFFEC2 or
+ // EXC_ISFFACTOID.
+ sal_uInt16 nFeatureType = aIn.ReaduInt16();
+ if (nFeatureType != EXC_ISFPROTECTION)
+ // We currently only support import of enhanced protection data.
+ return;
+
+ aIn.Ignore(5); // reserved1 (1 byte) and reserved2 (4 bytes)
+
+ sal_uInt16 nCref = aIn.ReaduInt16(); // number of ref elements
+ aIn.Ignore(4); // size if EXC_ISFFEC2, else 0 and to be ignored
+ aIn.Ignore(2); // reserved3 (2 bytes)
+
+ XclEnhancedProtection aProt;
+ aProt.maRefs.reserve( nCref);
+ XclRef8U aRef;
+ for (sal_uInt16 i=0; i < nCref && aIn.IsValid(); ++i)
+ {
+ aProt.maRefs.push_back( aRef.read( aIn));
+ }
+
+ // FeatProtection structure follows in record.
+
+ aProt.mnAreserved = aIn.ReaduInt32();
+ aProt.mnPasswordVerifier = aIn.ReaduInt32();
+ aProt.maTitle = aIn.ReadUniString();
+ if ((aProt.mnAreserved & 1) == 1)
+ {
+ sal_uInt32 nCbSD = aIn.ReaduInt32();
+ // TODO: could here be some sanity check applied to not allocate 4GB?
+ aProt.maSecurityDescriptor.reserve( nCbSD);
+ aIn.Read( &aProt.maSecurityDescriptor.front(), nCbSD);
+ }
+
+ GetSheetProtectBuffer().AppendEnhancedProtection( aProt, GetCurrScTab() );
+}
+
+
void ImportExcel8::ReadBasic( void )
{
SfxObjectShell* pShell = GetDocShell();
diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx
index d3a1e28..16cb97b 100644
--- a/sc/source/filter/excel/read.cxx
+++ b/sc/source/filter/excel/read.cxx
@@ -1143,6 +1143,7 @@ FltError ImportExcel8::Read( void )
case EXC_ID3_ARRAY: Array34(); break; // ARRAY [ 34 ]
case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ]
case 0x0867: FeatHdr(); break; // FEATHDR
+ case 0x0868: Feat(); break; // FEAT
}
}
break;
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index cd23adb..4edbff6 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -64,6 +64,22 @@
using ::com::sun::star::uno::Sequence;
using ::std::auto_ptr;
+
+const XclRef8U & XclRef8U::read( XclImpStream & rStrm )
+{
+ mnRow1 = rStrm.ReaduInt16();
+ mnRow2 = rStrm.ReaduInt16();
+ mnCol1 = rStrm.ReaduInt16();
+ mnCol2 = rStrm.ReaduInt16();
+ return *this;
+}
+
+ScRange XclRef8U::convertToScRange( SCTAB nTab )
+{
+ return ScRange( mnCol1, mnRow1, nTab, mnCol2, mnRow2, nTab);
+}
+
+
// Shared string table ========================================================
XclImpSst::XclImpSst( const XclImpRoot& rRoot ) :
@@ -1246,6 +1262,13 @@ void XclImpSheetProtectBuffer::ReadOptions( XclImpStream& rStrm, SCTAB nTab )
pSheet->mnOptions = nOptions;
}
+void XclImpSheetProtectBuffer::AppendEnhancedProtection( const XclEnhancedProtection & rProt, SCTAB nTab )
+{
+ Sheet* pSheet = GetSheetItem(nTab);
+ if (pSheet)
+ pSheet->maEnhancedProtections.push_back( rProt);
+}
+
void XclImpSheetProtectBuffer::ReadPasswordHash( XclImpStream& rStrm, SCTAB nTab )
{
sal_uInt16 nHash(0);
@@ -1279,6 +1302,8 @@ void XclImpSheetProtectBuffer::Apply() const
pProtect->setPasswordHash(aPass, PASSHASH_XL);
}
+ // ranges the protection is applied to
+
// sheet protection options
const sal_uInt16 nOptions = itr->second.mnOptions;
pProtect->setOption( ScTableProtection::OBJECTS, (nOptions & 0x0001) );
diff --git a/sc/source/filter/inc/excimp8.hxx b/sc/source/filter/inc/excimp8.hxx
index 54a5d0f5..f0270fe 100644
--- a/sc/source/filter/inc/excimp8.hxx
+++ b/sc/source/filter/inc/excimp8.hxx
@@ -59,6 +59,7 @@ public:
void Hlink( void ); // 0x01B8
void FeatHdr( void ); // 0x0867
+ void Feat( void ); // 0x0868
virtual void EndSheet( void );
virtual void PostDocLoad( void );
diff --git a/sc/source/filter/inc/xicontent.hxx b/sc/source/filter/inc/xicontent.hxx
index 4a7f102..72ed76915 100644
--- a/sc/source/filter/inc/xicontent.hxx
+++ b/sc/source/filter/inc/xicontent.hxx
@@ -44,6 +44,27 @@ globals for the document).
- Stream decryption
============================================================================ */
+struct XclRef8U
+{
+ sal_uInt16 mnRow1;
+ sal_uInt16 mnRow2;
+ sal_uInt16 mnCol1;
+ sal_uInt16 mnCol2;
+
+ const XclRef8U & read( XclImpStream & rStrm );
+ ScRange convertToScRange( SCTAB nTab );
+};
+
+/** Feat ISFPROTECTION refs plus FeatProtection */
+struct XclEnhancedProtection
+{
+ ::std::vector< XclRef8U > maRefs;
+ sal_uInt32 mnAreserved;
+ sal_uInt32 mnPasswordVerifier;
+ OUString maTitle;
+ ::std::vector< sal_uInt8 > maSecurityDescriptor; // raw data
+};
+
// Shared string table ========================================================
/** The SST (shared string table) contains all strings used in a BIFF8 file.
@@ -305,6 +326,8 @@ public:
void ReadOptions( XclImpStream& rStrm, SCTAB nTab );
+ void AppendEnhancedProtection( const XclEnhancedProtection & rProt, SCTAB nTab );
+
void ReadPasswordHash( XclImpStream& rStrm, SCTAB nTab );
void Apply() const;
@@ -315,6 +338,7 @@ private:
bool mbProtected;
sal_uInt16 mnPasswordHash;
sal_uInt16 mnOptions;
+ ::std::vector< XclEnhancedProtection > maEnhancedProtections;
Sheet();
Sheet(const Sheet& r);
commit a8f2c8c026b2d8d729b87991129ffd59781dbd56
Author: Eike Rathke <erack at redhat.com>
Date: Tue Mar 18 16:54:39 2014 +0100
record 0x0867 is not only SheetProtection, generalize to FeatHdr()
Change-Id: I9fe0558c013641a902ce5a95c02d37be9729fe38
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index 2f1bf94..e806999 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -302,8 +302,20 @@ void ImportExcel8::Labelsst( void )
}
-void ImportExcel8::SheetProtection( void )
+void ImportExcel8::FeatHdr( void )
{
+ aIn.Ignore(12);
+
+ // Feature type (isf) can be EXC_ISFPROTECTION, EXC_ISFFEC2 or
+ // EXC_ISFFACTOID.
+ sal_uInt16 nFeatureType(0);
+ aIn >> nFeatureType;
+ if (nFeatureType != EXC_ISFPROTECTION)
+ // We currently only support import of enhanced protection data.
+ return;
+
+ aIn.Ignore(1); // always 1
+
GetSheetProtectBuffer().ReadOptions( aIn, GetCurrScTab() );
}
diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx
index 1b6133c..d3a1e28 100644
--- a/sc/source/filter/excel/read.cxx
+++ b/sc/source/filter/excel/read.cxx
@@ -1142,7 +1142,7 @@ FltError ImportExcel8::Read( void )
case EXC_ID2_ARRAY:
case EXC_ID3_ARRAY: Array34(); break; // ARRAY [ 34 ]
case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ]
- case 0x0867: SheetProtection(); break; // SHEETPROTECTION
+ case 0x0867: FeatHdr(); break; // FEATHDR
}
}
break;
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index 31dd52d..cd23adb 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -1227,18 +1227,6 @@ void XclImpSheetProtectBuffer::ReadProtect( XclImpStream& rStrm, SCTAB nTab )
void XclImpSheetProtectBuffer::ReadOptions( XclImpStream& rStrm, SCTAB nTab )
{
- rStrm.Ignore(12);
-
- // feature type can be either 2 or 4. If 2, this record stores flag for
- // enhanced protection, whereas if 4 it stores flag for smart tag.
- sal_uInt16 nFeatureType(0);
- rStrm >> nFeatureType;
- if (nFeatureType != 2)
- // We currently only support import of enhanced protection data.
- return;
-
- rStrm.Ignore(1); // always 1
-
// The flag size specifies the size of bytes that follows that stores
// feature data. If -1 it depends on the feature type imported earlier.
// For enhanced protection data, the size is always 4. For the most xls
diff --git a/sc/source/filter/inc/excimp8.hxx b/sc/source/filter/inc/excimp8.hxx
index 54441bd..54a5d0f5 100644
--- a/sc/source/filter/inc/excimp8.hxx
+++ b/sc/source/filter/inc/excimp8.hxx
@@ -58,7 +58,7 @@ public:
void Labelsst( void ); // 0xFD
void Hlink( void ); // 0x01B8
- void SheetProtection( void ); // 0x0867
+ void FeatHdr( void ); // 0x0867
virtual void EndSheet( void );
virtual void PostDocLoad( void );
diff --git a/sc/source/filter/inc/xlconst.hxx b/sc/source/filter/inc/xlconst.hxx
index 7798121..68943d6 100644
--- a/sc/source/filter/inc/xlconst.hxx
+++ b/sc/source/filter/inc/xlconst.hxx
@@ -256,7 +256,11 @@ const sal_uInt16 EXC_BORDER_MEDIUM = 35;
const sal_uInt16 EXC_BORDER_THIN = 15;
const sal_uInt16 EXC_BORDER_HAIR = 1;
-
+// SharedFeatureType enumeration
+const sal_uInt16 EXC_ISFPROTECTION = 0x0002;
+const sal_uInt16 EXC_ISFFEC2 = 0x0003;
+const sal_uInt16 EXC_ISFFACTOID = 0x0004;
+const sal_uInt16 EXC_ISFLIST = 0x0005;
#endif
More information about the Libreoffice-commits
mailing list