src/ole.py | 30 ++++++++++++++++++++++++------ src/oletool.py | 29 ++++++++++++++++------------- 2 files changed, 40 insertions(+), 19 deletions(-)
New commits: commit 77e73a40bbaf5273ba775e70026c4494bdfbe30f Author: Noel Power <noel.po...@novell.com> Date: Thu Oct 6 21:58:13 2011 +0100 fixed lots of brainfarts and added lots of debug diff --git a/src/ole.py b/src/ole.py index c67df09..ae22314 100644 --- a/src/ole.py +++ b/src/ole.py @@ -92,6 +92,7 @@ class Header(object): self.secSizeShort = 64 self.params = params + self.__SSAT = None def getSectorSize (self): return 2**self.secSize @@ -277,8 +278,11 @@ class Header(object): self.bytes[68:72] = struct.pack( '<l', self.secIDFirstMSAT ) self.bytes[72:76] = struct.pack( '<l', self.numSecMSAT ) # write the MSAT, SAT & SSAT + print "*** writing MSAT" self.writeMSAT() + print "*** writing SAT" self.getSAT().write() + print "*** writing SSAT" self.getSSAT().write() def writeMSAT (self): @@ -319,17 +323,19 @@ class Header(object): def getSSAT (self): + if self.__SSAT != None: + return self.__SSAT ssatID = self.getFirstSectorID(BlockType.SSAT) if ssatID < 0: return None chain = self.getSAT().getSectorIDChain(ssatID) if len(chain) == 0: return None - obj = SSAT(2**self.secSize, self.bytes, self.params) + self.__SSAT = SSAT(2**self.secSize, self.bytes, self.params) for secID in chain: - obj.addSector(secID) - obj.buildArray() - return obj + self.__SSAT.addSector(secID) + self.__SSAT.buildArray() + return self.__SSAT def expandSSAT( self, numExtraEntriesNeeded ): # create enough sectors to increase SAT table to accomadate new entries @@ -344,6 +350,8 @@ class Header(object): # add the sectors into the SSAT for sectorID in newSATSectors: self.getSSAT().sectorIDs.append( sectorID ) + #mark the sectors as used by the SAT table + self.getSAT().array[ sectorID ] = -2 # expand SSAT array with the contens of the new SATSectors self.getSSAT().appendArray( newSATSectors ) # need to update the SectorIDChain for the SSAT @@ -372,14 +380,17 @@ class Header(object): print "Error: haven't implemented expanding the SAT to allow more sectors to be allocated for the MSAT" return chain self.createSATSectors( MSATSectors ) - + self.getSAT().appendArray( MSATSectors ) #is there room in the MSAT table header part if len( self.getMSAT().secIDs ) + len( MSATSectors ) < 109: for sector in MSATSectors: self.getMSAT().appendSectorID( sector ) - self.getSAT().appendArray( MSATSectors ) + self.getSAT().addSector( sector ) + #mark MSAT sectors in SAT array as in use by MSAT + self.getSAT().array[ sector ] = -4 else: print "*** extending the MSAT not supported yes" + #try again chain = self.getSAT().getFreeChainEntries( numNeeded, 0 ) @@ -524,16 +535,20 @@ class SAT(object): self.appendArray( self.sectorIDs ) def appendArray( self, sectorIDs ): + print "reading sectors", sectorIDs numItems = self.sectorSize / 4 for secID in sectorIDs: pos = 512 + secID*self.sectorSize for i in xrange(0, numItems): beginPos = pos + i*4 id = getSignedInt(self.bytes[beginPos:beginPos+4]) + print "index %d, len(self.sectorIDs) %d sectorID %d pos %d value %d"%(len(self.array) , len(self.sectorIDs),secID, beginPos, id ) self.array.append(id) + def write (self): #writes the contents of the SAT array to memory sectors + print "sectors making up the SAT or SAT are ",self.sectorIDs for index in xrange(0, len( self.array )): entryPos = 4 * index #calculate the offset into a sector @@ -716,6 +731,8 @@ entire file stream. elif entry.StreamLocation == StreamLocation.SSAT: chain = self.header.getSSAT().getSectorIDChain(entry.StreamSectorID) + print "__getRawStream extracting from chain ", chain + if entry.StreamLocation == StreamLocation.SSAT: # Get the root storage stream. if self.RootStorage == None: @@ -743,6 +760,7 @@ entire file stream. secSize = self.header.getSectorSize() numSectors = len(targetChain) print "writing out %d sectors"%(numSectors) + print "chain is ", targetChain for i in xrange(0, numSectors ): srcPos = ( i * secSize ) targetPos = 512 + ( targetChain[ i ] * secSize ) diff --git a/src/oletool.py b/src/oletool.py index 7ec247e..768f91c 100755 --- a/src/oletool.py +++ b/src/oletool.py @@ -185,7 +185,7 @@ class OleContainer: def updateEntry( self, directory, entry, filePath ): file = open( filePath, 'rb' ) bytes = file.read(); - print "Entry is ",entry.Name + print "Entry is ",entry.Name,"StreamSectorID ",entry.StreamSectorID theSAT = self.header.getSAT() sectorSize = self.header.getSectorSize() entry.StreamSize = len(bytes) @@ -195,13 +195,16 @@ class OleContainer: oldChain = [] if ( entry.StreamLocation == ole.StreamLocation.SSAT ): + print"using SSAT" theSAT = self.header.getSSAT() else: + print"using SAT" theSAT = self.header.getSAT() if ( entryID > -1 ): oldChain = theSAT.getSectorIDChain(entryID) theSAT.freeChainEntries( oldChain ) + print "** debug self.header.getSSAT().array[0] = ",self.header.getSSAT().array[0] if entry.StreamSize < self.header.minStreamSize: print "going to use ssat" theSAT = self.header.getSSAT() @@ -222,15 +225,19 @@ class OleContainer: newChain = self.header.getOrAllocateFreeSSATChainEntries( newNumChainEntries ) if ( newNumChainEntries != len(newChain) ): raise Exception("no space available") - entryID = newChain[ 0 ] # populate and terminate the chain - #FIXME move to be a common # routine + print "newChain (SSAT) ", newChain + for i in xrange(0,len(newChain)): + print "getSSAT().array[ %d ] = %d"%( newChain[i], directory.header.getSSAT().array[ newChain[i] ] ) + entryID = newChain[ 0 ] lastIndex = newChain[ len( newChain ) - 1 ] - self.header.getSSAT().array[ lastIndex ] = -2 + directory.header.getSSAT().array[ lastIndex ] = -2 for i in xrange(0,len(newChain) ): if i > 0: - self.header.getSSAT().array[ newChain[ i-1 ] ] = newChain[ i ] - #OMG - the assignment above ( to put in the -2 ) doesn't seem to work + directory.header.getSSAT().array[ newChain[ i - 1 ] ] = newChain[ i ] + for i in xrange(0,len(newChain)): + print "after pop getSSAT().array[ %d ] = %d"%( newChain[i], directory.header.getSSAT().array[ newChain[i] ] ) #FIXME find out what is wrong, because the assignment of the end of #chain ID above doesn't seem to work the line below loops :-/ print "newChain (SSAT) (retrieved)", theSAT.getSectorIDChain( entryID ) @@ -286,8 +293,9 @@ class OleContainer: entry.UserFlags = bytearray(4) entry.TimeCreated = bytearray(8) entry.TimeModified = bytearray(8) - entry.StreamSectorID = 0 + entry.StreamSectorID = -1 entry.StreamSize = 0 + entry.StreamLocation = ole.StreamLocation.SSAT def deleteEntry(self, directory, node, tree ): entry = node.Entry @@ -366,13 +374,9 @@ class OleContainer: lastEntry = directory.entries[ len( directory.entries ) - 1] entry = ole.Directory.Entry() self.makeEntryEmpty( entry ) + directory.entries.append( entry ) dirID = len( directory.entries) - 1 - # if the old last entry was empty use that other wise use - # the new one - if lastEntry.Type == ole.Directory.Type.Empty: - dirID = len( directory.entries ) - 2 - entry = lastEntry entry.Name = childName self.insertSiblingInTree ( directory, dirID, entry, directory.entries[ root.Entry.DirIDRoot ] ) @@ -422,7 +426,6 @@ class OleContainer: else: #storage node = self.__findNodeByHierachicalName( root, dirPath ) - print "adding a new file to %s"%dirPath entry = self.insertDirEntry( directory, node, fileLeafName ) if storageTestCreate: entry.NodeColor = ole.Directory.NodeColor.Black @@ -430,8 +433,8 @@ class OleContainer: else: #FIXME how to allocate the NodeColor entry.NodeColor = node.Entry.NodeColor - entry.NodeColor = node.Entry.NodeColor entry.Type = directory.Type.UserStream + self.updateEntry( directory, entry, filePath ) self.header.write() _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits