[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2017-08-30 Thread Tamás Zolnai
 msodumper/xlsrecord.py |   42 ++
 1 file changed, 42 insertions(+)

New commits:
commit cfff9e0d3f73405d7992d6ec825503ea41de7d5a
Author: Tamás Zolnai 
Date:   Wed Aug 30 21:01:36 2017 +0200

XLS dumper: SXCView dump improvements

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index f87187f..1103e2c 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -3114,10 +3114,12 @@ class XLUnicodeStringSegmentedSXAddl(object):
 def __init__ (self, strm):
 self.cchTotal = strm.readUnsignedInt(4)
 strm.readBytes(2) # ignored
+self.viewName = strm.readXLUnicodeString()
 
 def appendLines (self, hdl):
 if self.cchTotal <= 65535:
 hdl.appendLineInt("cchTotal", self.cchTotal)
+hdl.appendLineString("Referenced pivot table view", self.viewName)
 
 
 class DConName(BaseRecordHandler):
@@ -3232,6 +3234,7 @@ class SXAddlInfo(BaseRecordHandler):
 }
 
 def __parseBytes (self):
+self.rt = self.readUnsignedInt(2) # ignored
 self.flags = FrtFlags(self) # ignored
 self.sxc = self.readUnsignedInt(1)
 self.sxd = self.readUnsignedInt(1)
@@ -3244,10 +3247,32 @@ class SXAddlInfo(BaseRecordHandler):
 if self.sxd == 0x00:
 # sxdId
 self.__parseSxcViewSxdId()
+elif self.sxd == 0x19:
+# sxdVer12Info
+self.__parseSxcViewsxdVer12Info()
 
 def __parseSxcViewSxdId (self):
 self.stName = XLUnicodeStringSegmentedSXAddl(self)
 
+def __parseSxcViewsxdVer12Info (self):
+versionflags = self.readUnsignedInt(4)
+self.fDefaultCompact = (versionflags & 0x0001) != 0
+self.fDefaultOutline = (versionflags & 0x0002) != 0
+self.fOutlineData = (versionflags & 0x0004) != 0
+self.fCompactData = (versionflags & 0x0008) != 0
+self.fNewDropZones = (versionflags & 0x0010) != 0
+self.fPublished = (versionflags & 0x0020) != 0
+self.fTurnOffImmersive = (versionflags & 0x0040) != 0
+self.fSingleFilterPerField = (versionflags & 0x0080) != 0
+self.fNonDefaultSortInFlist = (versionflags & 0x0100) != 0
+self.fDontUseCustomLists = (versionflags & 0x0400) != 0
+self.fHideDrillIndicators = (versionflags & 0x0010) != 0
+self.fPrintDrillIndicators = (versionflags & 0x0020) != 0
+self.fMemPropsInTips = (versionflags & 0x0040) != 0
+self.fNoPivotTips = (versionflags & 0x0080) != 0
+self.fNoHeaders = (versionflags & 0x8000) != 0
+self.readUnsignedInt(2) # ignored
+
 def parseBytes (self):
 self.__parseBytes()
 self.appendLineString("classs name", 
globals.getValueOrUnknown(SXAddlInfo.SxcClassList, self.sxc))
@@ -3257,6 +3282,23 @@ class SXAddlInfo(BaseRecordHandler):
 if self.sxd == 0x00:
 # sxdId
 self.stName.appendLines(self)
+elif self.sxd == 0x19:
+# sxdVer12Info
+self.appendLineBoolean("fDefaultCompact", self.fDefaultCompact)
+self.appendLineBoolean("fDefaultOutline", self.fDefaultOutline)
+self.appendLineBoolean("fOutlineData", self.fOutlineData)
+self.appendLineBoolean("fCompactData", self.fCompactData)
+self.appendLineBoolean("fNewDropZones", self.fNewDropZones)
+self.appendLineBoolean("fPublished", self.fPublished)
+self.appendLineBoolean("fTurnOffImmersive", 
self.fTurnOffImmersive)
+self.appendLineBoolean("fSingleFilterPerField", 
self.fSingleFilterPerField)
+self.appendLineBoolean("fNonDefaultSortInFlist", 
self.fNonDefaultSortInFlist)
+self.appendLineBoolean("fDontUseCustomLists", 
self.fDontUseCustomLists)
+self.appendLineBoolean("fHideDrillIndicators", 
self.fHideDrillIndicators)
+self.appendLineBoolean("fPrintDrillIndicators", 
self.fPrintDrillIndicators)
+self.appendLineBoolean("fMemPropsInTips", self.fMemPropsInTips)
+self.appendLineBoolean("fNoPivotTips", self.fNoPivotTips)
+self.appendLineBoolean("fNoHeaders", self.fNoHeaders)
 
 
 class SXDb(BaseRecordHandler):
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2017-08-30 Thread Tamás Zolnai
 msodumper/xlsrecord.py |5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

New commits:
commit 9e28ecdd0d41f60f431ff4db9a30920d15da631b
Author: Tamás Zolnai 
Date:   Tue Aug 29 18:54:13 2017 +0200

XLS dumper: add newer excel versions

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 5370e83..f87187f 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -4126,7 +4126,10 @@ class PivotQueryTableEx(BaseRecordHandler):
 'Excel 2000',
 'Excel XP',
 'Excel 2003',
-'Excel 2007'
+'Excel 2007',
+'Excel 2010',
+'Excel 2013',
+'Excel 2016'
 ]
 
 class TableType:
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-11-27 Thread Andras Timar
 msodumper/xlsrecord.py |5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

New commits:
commit 1523a605f4ea7e8d3ef8e1242a91b19c51e1f9b2
Author: Andras Timar andras.ti...@collabora.com
Date:   Thu Nov 27 14:50:58 2014 +0100

add build id of Excel 2010

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 8c2a607..5370e83 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -737,7 +737,8 @@ class BOF(BaseRecordHandler):
 buildId = {
 0x0DBB: 'Excel 97',
 0x0EDE: 'Excel 97',
-0x2775: 'Excel XP'
+0x2775: 'Excel XP',
+0x3267: 'Excel 2010'
 }
 
 def getBuildIdName (self, value):
@@ -778,7 +779,7 @@ class BOF(BaseRecordHandler):
 self.betaAny = 0
 self.riscAny = 0
 self.lowestExcelVer = 0
-
+
 def parseBytes (self):
 self.__parseBytes()
 # BIFF version
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-09-16 Thread Kohei Yoshida
 msodumper/xlsrecord.py |   18 ++
 1 file changed, 18 insertions(+)

New commits:
commit 4d583770dd9dfb6ee16b9864d97adedad0833292
Author: Kohei Yoshida kohei.yosh...@gmail.com
Date:   Tue Sep 16 15:30:44 2014 -0400

Bit more on parsing FEATURE11 record.  I'll leave the rest for later.

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index c3f5588..8c2a607 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2845,6 +2845,16 @@ class TableFeatureType(object):
 self.lem = strm.readUnsignedInt(4) # table edit mode
 self.rgbHashParam = strm.readBytes(16)
 self.rgbName = strm.readXLUnicodeString()
+self.cFieldData = strm.readUnsignedInt(2)
+if self.fLoadCSPName:
+self.cSPName = strm.readXLUnicodeString()
+if self.fLoadEntryId:
+self.entryId = strm.readXLUnicodeString()
+
+# TODO : fieldData
+# TODO : idDeleted
+# TODO : idChanged
+# TODO : cellInvalid
 
 def appendLines (self, hdl):
 hdl.appendLineString(source type, SourceType.toString(self.lt))
@@ -2879,6 +2889,14 @@ class TableFeatureType(object):
 # TODO : dump more data
 
 hdl.appendLineString(table name, self.rgbName)
+hdl.appendLineInt(column count, self.cFieldData)
+
+if self.fLoadCSPName:
+hdl.appendLineString(cryptographic service provider name, 
self.cSPName)
+if self.fLoadEntryId:
+hdl.appendLineString(unique table identifier, self.entryId)
+
+
 
 class FeatureHeader(BaseRecordHandler):
 Beginning of a collection of records.
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py msodumper/xlsstream.py

2014-07-11 Thread Kohei Yoshida
 msodumper/xlsrecord.py |  318 ++---
 msodumper/xlsstream.py |4 
 2 files changed, 228 insertions(+), 94 deletions(-)

New commits:
commit ff0dc534560702f5af16a1a15f368f6c6e083d54
Author: Kohei Yoshida kohei.yosh...@gmail.com
Date:   Fri Jul 11 18:51:21 2014 -0400

Handle change cell and ins/del rows/columns records in change tracking.

The change cell record is a redo of my previous handler code, to get
more details.  This is still work-in-progress.

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 463e783..181a2a8 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -15,6 +15,32 @@ class RecordError(Exception): pass
 # ---
 # record handler classes
 
+class ColRelU(object):
+
+def __init__ (self, strm):
+self.col = strm.readUnsignedInt(2)
+self.colRelative = (self.col  0x4000) != 0
+self.rowRelative = (self.col  0x8000) != 0
+self.col = self.col  0x3FFF
+
+
+class RgceLoc(object):
+
+def __init__ (self, strm):
+self.row = strm.readUnsignedInt(2)
+self.column = ColRelU(strm)
+
+def toString (self):
+s = ''
+if not self.column.colRelative:
+s += '$'
+s += formula.toColName(self.column.col)
+if not self.column.rowRelative:
+s += '$'
+s += %d%(self.row+1)
+return s
+
+
 class Ref8(object):
 
 def __init__ (self, strm):
@@ -58,6 +84,14 @@ class Ref8U(object):
 self.col1 = strm.readUnsignedInt(2)
 self.col2 = strm.readUnsignedInt(2)
 
+def toString (self):
+rge = formula.CellRange()
+rge.firstRow = self.row1
+rge.firstCol = self.col1
+rge.lastRow = self.row2
+rge.lastCol = self.col2
+return rge.toString()
+
 
 class RKAuxData(object):
 Store auxiliary data for RK value
@@ -4010,100 +4044,200 @@ class SXRng(BaseRecordHandler):
 # ---
 # CT - Change Tracking
 
-class CTCellContent(BaseRecordHandler):
-
-EXC_CHTR_TYPE_MASK   = 0x0007
-EXC_CHTR_TYPE_FORMATMASK = 0xFF00
-EXC_CHTR_TYPE_EMPTY  = 0x
-EXC_CHTR_TYPE_RK = 0x0001
-EXC_CHTR_TYPE_DOUBLE = 0x0002
-EXC_CHTR_TYPE_STRING = 0x0003
-EXC_CHTR_TYPE_BOOL   = 0x0004
-EXC_CHTR_TYPE_FORMULA= 0x0005
-
-def parseBytes (self):
-size = globals.getSignedInt(self.readBytes(4))
-id = globals.getSignedInt(self.readBytes(4))
-opcode = globals.getSignedInt(self.readBytes(2))
-accept = globals.getSignedInt(self.readBytes(2))
-tabCreateId = globals.getSignedInt(self.readBytes(2))
-valueType = globals.getSignedInt(self.readBytes(2))
-self.appendLine(header: (size=%d; index=%d; opcode=0x%2.2X; 
accept=%d)%(size, id, opcode, accept))
-self.appendLine(sheet creation id: %d%tabCreateId)
-
-oldType = (valueType/(2*2*2)  CTCellContent.EXC_CHTR_TYPE_MASK)
-newType = (valueType  CTCellContent.EXC_CHTR_TYPE_MASK)
-self.appendLine(value type: (old=%4.4Xh; new=%4.4Xh)%(oldType, 
newType))
-self.readBytes(2) # ignore next 2 bytes.
-
-row = globals.getSignedInt(self.readBytes(2))
-col = globals.getSignedInt(self.readBytes(2))
-cell = formula.CellAddress(col, row)
-self.appendLine(cell position: %s%cell.getName())
-
-oldSize = globals.getSignedInt(self.readBytes(2))
-self.readBytes(4) # ignore 4 bytes.
-
-fmtType = (valueType  CTCellContent.EXC_CHTR_TYPE_FORMATMASK)
-if fmtType == 0x1100:
-self.readBytes(16)
-elif fmtType == 0x1300:
-self.readBytes(8)
-
-self.readCell(oldType, old cell type)
-self.readCell(newType, new cell type)
-
-def readCell (self, cellType, cellName):
-
-cellTypeText = 'unknown'
-
-if cellType == CTCellContent.EXC_CHTR_TYPE_FORMULA:
-cellTypeText, formulaBytes, formulaText = self.readFormula()
-self.appendLine(%s: %s%(cellName, cellTypeText))
-self.appendLine(formula bytes: 
%s%globals.getRawBytes(formulaBytes, True, False))
-self.appendLine(tokens: %s%formulaText)
+class RRD(object):
+
+RevType = {
+0x: insert row,  # REVTINSRW
+0x0001: insert column,   # REVTINSCOL
+0x0002: delete row,  # REVTDELRW
+0x0003: delete column,   # REVTDELCOL
+0x0004: cell move,   # REVTMOVE
+0x0005: insert sheet,# REVTINSERTSH
+0x0007: sort,# REVTSORT
+0x0008: cell change, # REVTCHANGECELL
+0x0009: rename sheet,# REVTRENSHEET
+0x000A: defined name change, # REVTDEFNAME
+0x000B: 

[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-07-11 Thread Kohei Yoshida
 msodumper/xlsrecord.py |   95 +
 1 file changed, 95 insertions(+)

New commits:
commit 15cd2bd8ff914a764bf0c6b5f0d39da5b58b2b03
Author: Kohei Yoshida kohei.yosh...@gmail.com
Date:   Fri Jul 11 20:53:21 2014 -0400

Handle boolean, error, string, and formula values in cell change record.

Still for change tracking.

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 181a2a8..81c42f1 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -15,6 +15,46 @@ class RecordError(Exception): pass
 # ---
 # record handler classes
 
+class Bes(object):
+Boolean or error value
+
+ErrorValues = {
+0x00: #NULL!,
+0x07: #DIV/0!,
+0x0F: #VALUE!,
+0x17: #REF!,
+0x1D: #NAME?,
+0x24: #NUM!,
+0x2A: #N/A,
+0x2B: #GETTING_DATA
+}
+
+def __init__ (self, strm):
+self.bBoolErr = strm.readUnsignedInt(1)
+self.fError = strm.readUnsignedInt(1) != 0
+
+def toString (self):
+if self.fError:
+return 
(error:%s)%globals.getValueOrUnknown(Bes.ErrorValues,self.bBoolErr,???)
+elif self.bBoolErr:
+return (boolean:true)
+else:
+return (boolean:false)
+
+
+class CellParsedFormula(object):
+
+def __init__ (self, strm):
+cce = strm.readUnsignedInt(2)
+bytes = strm.readBytes(cce)
+parser = formula.FormulaParser(strm.header, bytes)
+parser.parse()
+self.text = parser.getText()
+
+def toString (self):
+return self.text
+
+
 class ColRelU(object):
 
 def __init__ (self, strm):
@@ -417,6 +457,37 @@ Like parseBytes(), the derived classes must overwrite this 
method.
 def readXLUnicodeStringNoCch (self, cch):
 return self.readUnicodeString(cch)
 
+def readXLUnicodeRichExtendedString (self):
+cch = self.readUnsignedInt(2)
+flags = self.readUnsignedInt(1)
+fHighByte = (flags  0x01) != 0  # double byte string
+fExtSt= (flags  0x04) != 0  # phonetic string data
+fRichSt   = (flags  0x08) != 0  # rich text
+
+cRun = 0
+if fRichSt:
+cRun = self.readUnsignedInt(2) # number of elemetns in rgRun
+
+cbExtRst = 0
+if fExtSt:
+cbExtRst = self.readSignedInt(4) # byte count of ExtRst
+
+if fHighByte:
+rgb = unicode(self.readBytes(2*cch), 'UTF-16LE', errors='replace')
+elif globals.params.utf8:
+# Compressed Unicode- latin1
+rgb = self.readBytes(cch).decode('cp1252')
+else:
+# Old behaviour with hex dump
+rgb = self.readBytes(cch)
+
+# optional FormatRun array.  Ignore this for now.
+self.readBytes(cRun*4) # Each FormatRun is 4-byte long.
+
+# optional ExtRst.  Ignore this for now.
+self.readBytes(cbExtRst)
+return rgb
+
 def readLongRGB (self):
 r = self.readUnsignedInt(1)
 g = self.readUnsignedInt(1)
@@ -4164,6 +4235,12 @@ class RRDChgCell(BaseRecordHandler):
 self.rkOld = decodeRK(self.readUnsignedInt(4))
 elif self.vtOld == RRDChgCell.CellType.Xnum:
 self.numOld = self.readDouble()
+elif self.vtOld == RRDChgCell.CellType.XLUnicodeRichExtendedString:
+self.stOld = self.readXLUnicodeRichExtendedString()
+elif self.vtOld == RRDChgCell.CellType.Bes:
+self.besOld = Bes(self)
+elif self.vtOld == RRDChgCell.CellType.CellParsedFormula:
+self.xpeOld = CellParsedFormula(self)
 else:
 # TODO : Handle other value types.
 return
@@ -4174,6 +4251,12 @@ class RRDChgCell(BaseRecordHandler):
 self.rk = decodeRK(self.readUnsignedInt(4))
 elif self.vt == RRDChgCell.CellType.Xnum:
 self.num = self.readDouble()
+elif self.vt == RRDChgCell.CellType.XLUnicodeRichExtendedString:
+self.st = self.readXLUnicodeRichExtendedString()
+elif self.vt == RRDChgCell.CellType.Bes:
+self.bes = Bes(self)
+elif self.vt == RRDChgCell.CellType.CellParsedFormula:
+self.xpe = CellParsedFormula(self)
 else:
 # TODO : Handle other value types.
 return
@@ -4208,6 +4291,12 @@ class RRDChgCell(BaseRecordHandler):
 self.appendLine(old value: %g%self.rkOld)
 elif self.vtOld == RRDChgCell.CellType.Xnum:
 self.appendLine(old value: %g%self.numOld)
+elif self.vtOld == RRDChgCell.CellType.XLUnicodeRichExtendedString:
+self.appendLineString(old value, self.stOld)
+elif self.vtOld == RRDChgCell.CellType.Bes:
+self.appendLineString(old value, self.besOld.toString())
+elif self.vtOld == RRDChgCell.CellType.CellParsedFormula:
+self.appendLineString(old value, 

[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-07-11 Thread Kohei Yoshida
 msodumper/xlsrecord.py |   14 --
 1 file changed, 4 insertions(+), 10 deletions(-)

New commits:
commit 74da3c1eb42590856f286091b55ce13dd7c03fc3
Author: Kohei Yoshida kohei.yosh...@gmail.com
Date:   Fri Jul 11 20:58:24 2014 -0400

Bit of cleanup.

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 81c42f1..b41be00 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -4229,6 +4229,7 @@ class RRDChgCell(BaseRecordHandler):
 # TODO : Parse DXFN
 return
 
+# old value
 if self.vtOld == RRDChgCell.CellType.Blank:
 pass
 elif self.vtOld == RRDChgCell.CellType.RKNumber:
@@ -4241,10 +4242,8 @@ class RRDChgCell(BaseRecordHandler):
 self.besOld = Bes(self)
 elif self.vtOld == RRDChgCell.CellType.CellParsedFormula:
 self.xpeOld = CellParsedFormula(self)
-else:
-# TODO : Handle other value types.
-return
 
+# new value
 if self.vt == RRDChgCell.CellType.Blank:
 pass
 elif self.vt == RRDChgCell.CellType.RKNumber:
@@ -4257,9 +4256,6 @@ class RRDChgCell(BaseRecordHandler):
 self.bes = Bes(self)
 elif self.vt == RRDChgCell.CellType.CellParsedFormula:
 self.xpe = CellParsedFormula(self)
-else:
-# TODO : Handle other value types.
-return
 
 def parseBytes (self):
 self.__parseBytes()
@@ -4285,6 +4281,7 @@ class RRDChgCell(BaseRecordHandler):
 # TODO : Parse DXFN.
 return
 
+# old value
 if self.vtOld == RRDChgCell.CellType.Blank:
 self.appendLine(old value: blank)
 elif self.vtOld == RRDChgCell.CellType.RKNumber:
@@ -4297,9 +4294,8 @@ class RRDChgCell(BaseRecordHandler):
 self.appendLineString(old value, self.besOld.toString())
 elif self.vtOld == RRDChgCell.CellType.CellParsedFormula:
 self.appendLineString(old value, self.xpeOld.toString())
-else:
-return
 
+# new value
 if self.vt == RRDChgCell.CellType.Blank:
 self.appendLine(new value: blank)
 elif self.vt == RRDChgCell.CellType.RKNumber:
@@ -4312,8 +4308,6 @@ class RRDChgCell(BaseRecordHandler):
 self.appendLineString(new value, self.bes.toString())
 elif self.vt == RRDChgCell.CellType.CellParsedFormula:
 self.appendLineString(new value, self.xpe.toString())
-else:
-return
 
 
 class RRDInsDel(BaseRecordHandler):
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-04-08 Thread Eike Rathke
 msodumper/xlsrecord.py |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit f16ae8babbffcae3feb61246f416c8a15adecacb
Author: Eike Rathke er...@redhat.com
Date:   Tue Apr 8 11:26:08 2014 +0200

bit 0 is bit 0

They say they use big-endian bit diagrams, but just to confuse you.

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 59e748a..463e783 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2743,7 +2743,7 @@ class FeatureData(BaseRecordHandler):
 self.appendLine(A and reserved: 0x%8.8X%Areserved)
 self.appendLine(wPassword: 0x%8.8X%wPassword)
 self.appendLine(stTitle: %s%stTitle)
-if Areserved  0x8000 == 0x8000:
+if Areserved  0x0001 == 0x0001:
 # SDContainer
 cbSD = self.readUnsignedInt(4)
 self.appendLine(cbSD: %d%cbSD)
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-03-24 Thread Eike Rathke
 msodumper/xlsrecord.py |2 ++
 1 file changed, 2 insertions(+)

New commits:
commit 8471bc70365c4aa03296be6ddafe07e65c6c0327
Author: Eike Rathke er...@redhat.com
Date:   Mon Mar 24 18:06:10 2014 +0100

dump Areserved and wPassword of FEAT FeatProtection structure

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 781d848..59e748a 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2740,6 +2740,8 @@ class FeatureData(BaseRecordHandler):
 Areserved = self.readUnsignedInt(4)
 wPassword = self.readUnsignedInt(4)
 stTitle = self.readXLUnicodeString()
+self.appendLine(A and reserved: 0x%8.8X%Areserved)
+self.appendLine(wPassword: 0x%8.8X%wPassword)
 self.appendLine(stTitle: %s%stTitle)
 if Areserved  0x8000 == 0x8000:
 # SDContainer
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-03-18 Thread Eike Rathke
 msodumper/xlsrecord.py |   25 -
 1 file changed, 16 insertions(+), 9 deletions(-)

New commits:
commit c4192de229ceb549b0a7bc26fa1b1fc38972d83d
Author: Eike Rathke er...@redhat.com
Date:   Tue Mar 18 11:11:57 2014 +0100

partly implemented FEAT FeatProtection structure

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index b3cbece..1a0f336 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2717,17 +2717,24 @@ class FeatureData(BaseRecordHandler):
 self.appendLine(feature type: %d (%s)%(featureTypeId, 
featureTypeText))
 self.appendLine(size of feature data: %d (%s)%(cbFeatData, 
cbFeatDataText))
 
-# http://msdn.microsoft.com/en-us/library/dd911261.aspx
-# Documentation isn't very clear on this, for cbFeatData it says must
-# be 0 if 'isf' (featureTypeId) is not ISFFEC2 (type 3) but for rgbFeat
-# (the variable data field) lists structures for each of the possible
-# types. However, so far there was no FeatProtection structure data for
-# ISFPROTECTION encountered.
-
-if featureTypeId == 3 and cbFeatData  0:
+if featureTypeId == 2:
+# enhanced protection, ISFPROTECTION, FeatProtection structure
+Areserved = self.readUnsignedInt(4)
+wPassword = self.readUnsignedInt(4)
+stTitle = self.readXLUnicodeString()
+self.appendLine(stTitle: %s%stTitle)
+if Areserved  1 == 1:
+# SDContainer
+cbSD = self.readUnsignedInt(4)
+self.appendLine(cbSD: %d%cbSD)
+self.readBytes(cbSD)
+elif featureTypeId == 3 and cbFeatData  0:
 # ignored formula errors, ISFFEC2, FeatFormulaErr2 structure
 self.readBytes(cbFeatData)
-self.appendLine(FeatFormulaErr2 yet not handled)
+self.appendLine(FeatFormulaErr2 not handled)
+elif featureTypeId == 4:
+# smart tag, ISFFACTOID, FeatSmartTag structure
+self.appendLine(FeatSmartTag not handled)
 
 for ref in refs:
 self.appendLine(applied to range: (col=%d,row=%d) - 
(col=%d,row=%d)%
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py msodumper/xlsstream.py

2014-03-18 Thread Eike Rathke
 msodumper/xlsrecord.py |   35 +++
 msodumper/xlsstream.py |2 +-
 2 files changed, 36 insertions(+), 1 deletion(-)

New commits:
commit 71d45a05919029845fe0a20e36b8bddc9236f427
Author: Eike Rathke er...@redhat.com
Date:   Tue Mar 18 11:18:30 2014 +0100

implemented MergeCells

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 1a0f336..e908067 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -15,6 +15,24 @@ class RecordError(Exception): pass
 # ---
 # record handler classes
 
+class Ref8(object):
+
+def __init__ (self, strm):
+self.row1 = strm.readUnsignedInt(2)
+self.row2 = strm.readUnsignedInt(2)
+self.col1 = strm.readUnsignedInt(2)
+self.col2 = strm.readUnsignedInt(2)
+
+def toString (self):
+string = ((col=%d,row=%d) - (col=%d,row=%d)%
+(self.col1, self.row1, self.col2, self.row2))
+if self.col1 == 0 and self.col2 == 0xFF:
+string += , entire column
+if self.row1 == 0 and self.row2 == 0x:
+string += , entire row
+return string
+
+
 class RefU(object):
 
 def __init__ (self, strm):
@@ -3533,6 +3551,23 @@ class SXViewSource(BaseRecordHandler):
 self.appendLine(data source type: %s%srcType)
 
 
+class MergeCells(BaseRecordHandler):
+
+def __parseBytes (self):
+self.cmcs = self.readUnsignedInt(2)
+self.rgref = []
+for i in xrange(0, self.cmcs):
+self.rgref.append(Ref8(self))
+
+def parseBytes (self):
+self.__parseBytes()
+self.appendLine(%d merge ranges:%self.cmcs)
+i = 0
+for ref in self.rgref:
+i += 1
+self.appendLine(%d: %s%(i,ref.toString()))
+
+
 class Sxvd(BaseRecordHandler):
 
 def __parseBytes (self):
diff --git a/msodumper/xlsstream.py b/msodumper/xlsstream.py
index 0f514ee..a034a4c 100644
--- a/msodumper/xlsstream.py
+++ b/msodumper/xlsstream.py
@@ -143,7 +143,7 @@ recData = {
 0x00E1: [INTERFACEHDR, Beginning of User Interface Records],
 0x00E2: [INTERFACEEND, End of User Interface Records],
 0x00E3: [SXVS, PivotCache Source Data Type, xlsrecord.SXViewSource],
-0x00E5: [MERGECELLS, Merged cells in the document],
+0x00E5: [MERGECELLS, Merged cells in the document, 
xlsrecord.MergeCells],
 0x00EA: [TABIDCONF, Sheet Tab ID of Conflict History],
 0x00EB: [MSODRAWINGGROUP, Microsoft Office Drawing Group, 
xlsrecord.MSODrawingGroup],
 0x00EC: [MSODRAWING, Microsoft Office Drawing, xlsrecord.MSODrawing],
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-03-18 Thread Eike Rathke
 msodumper/xlsrecord.py |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit e0c64ff72711d7861362507870076dd4c49fa9b9
Author: Eike Rathke er...@redhat.com
Date:   Tue Mar 18 23:33:10 2014 +0100

MS-XLS documentation uses big-endian bit diagrams

... so if it says leftmost bit 0 then test for hight bit.

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index e908067..e56602b 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2741,7 +2741,7 @@ class FeatureData(BaseRecordHandler):
 wPassword = self.readUnsignedInt(4)
 stTitle = self.readXLUnicodeString()
 self.appendLine(stTitle: %s%stTitle)
-if Areserved  1 == 1:
+if Areserved  0x7000 == 0x7000:
 # SDContainer
 cbSD = self.readUnsignedInt(4)
 self.appendLine(cbSD: %d%cbSD)
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py

2014-03-18 Thread Eike Rathke
 msodumper/xlsrecord.py |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit f2d5d0c6e156aa1f8a3ebbb59f49f47759d75fdd
Author: Eike Rathke er...@redhat.com
Date:   Tue Mar 18 23:35:27 2014 +0100

ONE bit, geez ...

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index e56602b..781d848 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2741,7 +2741,7 @@ class FeatureData(BaseRecordHandler):
 wPassword = self.readUnsignedInt(4)
 stTitle = self.readXLUnicodeString()
 self.appendLine(stTitle: %s%stTitle)
-if Areserved  0x7000 == 0x7000:
+if Areserved  0x8000 == 0x8000:
 # SDContainer
 cbSD = self.readUnsignedInt(4)
 self.appendLine(cbSD: %d%cbSD)
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py msodumper/xlsstream.py

2014-03-17 Thread Eike Rathke
 msodumper/xlsrecord.py |   51 -
 msodumper/xlsstream.py |   21 ++--
 2 files changed, 69 insertions(+), 3 deletions(-)

New commits:
commit f0e8c8fea614960d28cc2e52fd32d02dbdebd01f
Author: Eike Rathke er...@redhat.com
Date:   Mon Mar 17 23:06:02 2014 +0100

added some record IDs and implemented FeatureData for 0x0868 FEAT

FEAT actually is a collection of records of which FEATHDR specifies the
common data, for example enhanced protection. FEAT contains sequences of
ranges the feature is applied to.

Also, FEAT was wrongly named RANGEPROTECTION (probably from the OOo
documentation).

Added names of IDs in the range 0x086? to 0x088?

See
http://msdn.microsoft.com/en-us/library/dd945945.aspx
http://msdn.microsoft.com/en-us/library/dd907085.aspx
http://msdn.microsoft.com/en-us/library/dd911261.aspx

diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py
index 9a51fc7..b3cbece 100644
--- a/msodumper/xlsrecord.py
+++ b/msodumper/xlsrecord.py
@@ -2636,6 +2636,8 @@ class FeatureHeader(BaseRecordHandler):
 featureTypeText = 'unknown'
 if featureTypeId == 2:
 featureTypeText = 'enhanced protection'
+elif featureTypeId == 3:
+featureTypeText = 'ignored formula errors'
 elif featureTypeId == 4:
 featureTypeText = 'smart tag'
 featureHdr = self.readUnsignedInt(1) # must be 1
@@ -2649,7 +2651,7 @@ class FeatureHeader(BaseRecordHandler):
 self.appendLine(size of header data: %d (%s)%(sizeHdrData, 
sizeHdrDataText))
 
 if featureTypeId == 2 and sizeHdrData == -1:
-# enhanced protection optionsss
+# enhanced protection options
 flags = self.readUnsignedInt(4)
 self.appendLine(enhanced protection flag: 0x%8.8X%flags)
 
@@ -2686,6 +2688,53 @@ class FeatureHeader(BaseRecordHandler):
 
 return
 
+class FeatureData(BaseRecordHandler):
+
+def parseBytes (self):
+recordType = self.readUnsignedInt(2)
+frtFlag = self.readUnsignedInt(2) # currently 0
+self.readBytes(8) # reserved (currently all 0)
+featureTypeId = self.readUnsignedInt(2)
+featureTypeText = 'unknown'
+if featureTypeId == 2:
+featureTypeText = 'enhanced protection'
+elif featureTypeId == 3:
+featureTypeText = 'ignored formula errors'
+elif featureTypeId == 4:
+featureTypeText = 'smart tag'
+self.readBytes(1) # reserved1, must be 0
+self.readBytes(4) # reserved2, must be 0
+cref = self.readUnsignedInt(2)
+cbFeatData = self.readUnsignedInt(4)
+cbFeatDataText = 'byte size'
+self.readBytes(2) # reserved3, must be 0
+
+refs = []
+for i in xrange(0, cref):
+refs.append(Ref8U(self))
+
+self.appendLine(record type: 0x%4.4X (must match the 
header)%recordType)
+self.appendLine(feature type: %d (%s)%(featureTypeId, 
featureTypeText))
+self.appendLine(size of feature data: %d (%s)%(cbFeatData, 
cbFeatDataText))
+
+# http://msdn.microsoft.com/en-us/library/dd911261.aspx
+# Documentation isn't very clear on this, for cbFeatData it says must
+# be 0 if 'isf' (featureTypeId) is not ISFFEC2 (type 3) but for rgbFeat
+# (the variable data field) lists structures for each of the possible
+# types. However, so far there was no FeatProtection structure data for
+# ISFPROTECTION encountered.
+
+if featureTypeId == 3 and cbFeatData  0:
+# ignored formula errors, ISFFEC2, FeatFormulaErr2 structure
+self.readBytes(cbFeatData)
+self.appendLine(FeatFormulaErr2 yet not handled)
+
+for ref in refs:
+self.appendLine(applied to range: (col=%d,row=%d) - 
(col=%d,row=%d)%
+(ref.col1, ref.row1, ref.col2, ref.row2))
+
+return
+
 class ShrFmla(BaseRecordHandler):
 
 def __parseBytes (self):
diff --git a/msodumper/xlsstream.py b/msodumper/xlsstream.py
index 945c5a8..0f514ee 100644
--- a/msodumper/xlsstream.py
+++ b/msodumper/xlsstream.py
@@ -143,6 +143,7 @@ recData = {
 0x00E1: [INTERFACEHDR, Beginning of User Interface Records],
 0x00E2: [INTERFACEEND, End of User Interface Records],
 0x00E3: [SXVS, PivotCache Source Data Type, xlsrecord.SXViewSource],
+0x00E5: [MERGECELLS, Merged cells in the document],
 0x00EA: [TABIDCONF, Sheet Tab ID of Conflict History],
 0x00EB: [MSODRAWINGGROUP, Microsoft Office Drawing Group, 
xlsrecord.MSODrawingGroup],
 0x00EC: [MSODRAWING, Microsoft Office Drawing, xlsrecord.MSODrawing],
@@ -215,10 +216,26 @@ recData = {
 0x0862: [SHEETLAYOUT, Tab Color below Sheet Name],
 0x0863: [BOOKEXT, Extra Book Info],
 0x0864: [SXADDL, Pivot Table Additional Info, xlsrecord.SXAddlInfo],
-0x0867: [FEATHEADR, Shared Feature Header,