src/xlsrecord.py | 97 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 36 deletions(-)
New commits: commit 21c1f9dd6dcb53b87d6ec2267b2289b310b7b08b Author: Kohei Yoshida <kohei.yosh...@suse.com> Date: Fri Feb 10 21:54:22 2012 -0500 Re-did parsing of SXFDB record per MS-XLS spec. diff --git a/src/xlsrecord.py b/src/xlsrecord.py index 05ed4eb..e2c7383 100644 --- a/src/xlsrecord.py +++ b/src/xlsrecord.py @@ -195,6 +195,14 @@ Like parseBytes(), the derived classes must overwrite this method.""" if len(singleLine) > 0: self.lines.append(singleLine) + def appendLineString (self, name, value): + text = "%s: %s"%(name, value) + self.appendLine(text) + + def appendLineInt (self, name, value): + text = "%s: %d"%(name, value) + self.appendLine(text) + def appendLineBoolean (self, name, value): text = "%s: %s"%(name, self.getYesNo(value)) self.appendLine(text) @@ -227,6 +235,9 @@ Like parseBytes(), the derived classes must overwrite this method.""" else: return falseStr + def readXLUnicodeString (self): + return self.readUnicodeString() + def readShortXLUnicodeString (self): cch = self.readUnsignedInt(1) return self.readUnicodeString(cch) @@ -2914,6 +2925,7 @@ class SXDbEx(BaseRecordHandler): self.appendLine("last changed: %g"%lastChanged) self.appendLine("count of SXFORMULA records for this cache: %d"%sxFmlaRecs) + class SXDtr(BaseRecordHandler): def __parseBytes (self): @@ -2935,6 +2947,7 @@ class SXDtr(BaseRecordHandler): self.appendLine("") self.appendMultiLine("The month value must be 1 if the day of month value is 0.") + class SXFDBType(BaseRecordHandler): types = { @@ -2960,6 +2973,7 @@ class SXFDBType(BaseRecordHandler): s = globals.getValueOrUnknown(SXFDBType.types, self.wTypeSql) self.appendLine("ODBC Type: %s"%s) + class SXFDB(BaseRecordHandler): dataTypeNames = { @@ -2974,43 +2988,54 @@ class SXFDB(BaseRecordHandler): 0x0D80: 'dat+str[+int/dbl]' } + def __parseBytes (self): + # parse flag + bits = self.readUnsignedInt(2) + self.fAllAtoms = (bits & 0x0001) != 0 # A + self.fSomeUnhashed = (bits & 0x0002) != 0 # B (undefined, must be ignored) + self.fUsed = (bits & 0x0004) != 0 # C (undefined, must be ignored) + self.fHasParent = (bits & 0x0008) != 0 # D + self.fRangeGroup = (bits & 0x0010) != 0 # E + self.fNumField = (bits & 0x0020) != 0 # F + unused = (bits & 0x0040) != 0 # G (unused) + self.fTextEtcField = (bits & 0x0080) != 0 # H + self.fnumMinMaxValid = (bits & 0x0100) != 0 # I + self.fShortIitms = (bits & 0x0200) != 0 # J + self.fNonDates = (bits & 0x0400) != 0 # K + self.fDateInField = (bits & 0x0800) != 0 # L + unused = (bits & 0x1000) != 0 # M + self.fServerBased = (bits & 0x2000) != 0 # N + self.fCantGetUniqueItems = (bits & 0x4000) != 0 # O + self.fCalculatedField = (bits & 0x8000) != 0 # P + + self.ifdbParent = self.readUnsignedInt(2) + self.ifdbBase = self.readUnsignedInt(2) + self.citmUnq = self.readUnsignedInt(2) # (undefined, must be ignored) + self.csxoper = self.readUnsignedInt(2) + self.cisxoper = self.readUnsignedInt(2) + self.catm = self.readUnsignedInt(2) + self.stFieldName = self.readXLUnicodeString() + def parseBytes (self): - flags = self.readUnsignedInt(2) - origItems = (flags & 0x0001) - postponed = (flags & 0x0002) - calculated = (flags & 0x0004) - groupChild = (flags & 0x0008) - numGroup = (flags & 0x0010) - longIndex = (flags & 0x0200) - self.appendLine("original items: %s"%self.getYesNo(origItems)) - self.appendLine("postponed: %s"%self.getYesNo(postponed)) - self.appendLine("calculated: %s"%self.getYesNo(calculated)) - self.appendLine("group child: %s"%self.getYesNo(groupChild)) - self.appendLine("num group: %s"%self.getYesNo(numGroup)) - self.appendLine("long index: %s"%self.getYesNo(longIndex)) - dataType = (flags & 0x0DE0) - if SXFDB.dataTypeNames.has_key(dataType): - self.appendLine("data type: %s (%4.4Xh)"%(SXFDB.dataTypeNames[dataType], dataType)) - else: - self.appendLine("data type: unknown (%4.4Xh)"%dataType) - - grpSubField = self.readUnsignedInt(2) - grpBaseField = self.readUnsignedInt(2) - itemCount = self.readUnsignedInt(2) - grpItemCount = self.readUnsignedInt(2) - baseItemCount = self.readUnsignedInt(2) - srcItemCount = self.readUnsignedInt(2) - self.appendLine("group sub-field: %d"%grpSubField) - self.appendLine("group base-field: %d"%grpBaseField) - self.appendLine("item count: %d"%itemCount) - self.appendLine("group item count: %d"%grpItemCount) - self.appendLine("base item count: %d"%baseItemCount) - self.appendLine("source item count: %d"%srcItemCount) - - # field name - textLen = self.readUnsignedInt(2) - name, textLen = globals.getRichText(self.readRemainingBytes(), textLen) - self.appendLine("field name: %s"%name) + self.__parseBytes() + self.appendLineBoolean("collection of items", self.fAllAtoms) + self.appendLineBoolean("has parent grouping cache field", self.fHasParent) + self.appendLineBoolean("numeric or date grouping", self.fRangeGroup) + self.appendLineBoolean("has numeric cache item", self.fNumField) + self.appendLineBoolean("has text data", self.fTextEtcField) + self.appendLineBoolean("min/max values can be computed", self.fnumMinMaxValid) + self.appendLineBoolean("has more than 255 items", self.fShortIitms) + self.appendLineBoolean("has non-date values", self.fNonDates) + self.appendLineBoolean("has date item", self.fDateInField) + self.appendLineBoolean("server-based page field (for ODBC PivotCache)", self.fServerBased) + self.appendLineBoolean("unique values unavailable (for ODBC source data)", self.fCantGetUniqueItems) + self.appendLineBoolean("calculated field", self.fCalculatedField) + self.appendLineInt("field index of parent (for grouped field)", self.ifdbParent) + self.appendLineInt("field index of base (for grouped field)", self.ifdbBase) + self.appendLineInt("number of cache items (for grouped field)", self.csxoper) + self.appendLineInt("number of cache items in base field (for grouped field)", self.cisxoper) + self.appendLineInt("number of cache items in collection", self.catm) + self.appendLineString("field name", self.stFieldName) class SXStreamID(BaseRecordHandler): _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits