[SNBOutput][Bug] Fixed a bug when using multiple SNBFile object, error will happen. [Feature] Get ready for SNB input plugin

This commit is contained in:
Li Fanxi 2010-10-14 16:53:39 +08:00
parent f0fb8fb12a
commit 6c9541723f

View File

@ -5,6 +5,7 @@ __copyright__ = '2010, Li Fanxi <lifanxi@freemindworld.com>'
__docformat__ = 'restructuredtext en'
import sys, struct, zlib, bz2, os, math
from mimetypes import types_map
class FileStream:
def IsBinary(self):
@ -18,9 +19,6 @@ class BlockData:
class SNBFile:
files = []
blocks = []
MAGIC = 'SNBP000B'
REV80 = 0x00008000
REVA3 = 0x00A3A3A3
@ -28,15 +26,21 @@ class SNBFile:
REVZ2 = 0x00000000
def __init__(self, inputFile = None):
if inputFile != None:
self.Parse(inputFile);
self.files = []
self.blocks = []
def Parse(self, inputFile):
if inputFile != None:
self.Open(inputFile)
def Open(self, inputFile):
self.fileName = inputFile
snbFile = open(self.fileName, "rb")
snbFile.seek(0)
self.Parse(snbFile)
snbFile.close()
def Parse(self, snbFile, metaOnly = False):
# Read header
vmbr = snbFile.read(44)
(self.magic, self.rev80, self.revA3, self.revZ1,
@ -78,7 +82,7 @@ class SNBFile:
try:
data = snbFile.read(bSize)
uncompressedData += bzdc.decompress(data)
except EOFError, e:
except Exception, e:
print e
f.fileBody = uncompressedData[plainPos:plainPos+f.fileSize]
plainPos += f.fileSize
@ -90,7 +94,6 @@ class SNBFile:
else:
print f.attr, f.fileName
raise Exception("Invalid file")
snbFile.close()
def ParseFile(self, vfat, fileCount):
fileNames = vfat[fileCount*12:].split('\0');
@ -157,6 +160,24 @@ class SNBFile:
f.fileName = fileName.replace(os.sep, '/')
self.files.append(f)
def GetFileStream(self, fileName):
for file in self.files:
if file.fileName == fileName:
return file.fileBody
return None
def OutputImageFiles(self, path):
fileNames = []
for f in self.files:
fname = os.path.basename(f.fileName)
root, ext = os.path.splitext(fname)
if ext in [ '.jpeg', '.jpg', '.gif', '.svg', '.png' ]:
file = open(os.path.join(path, fname), 'wb')
file.write(f.fileBody)
file.close()
fileNames.append((fname, types_map[ext]))
return fileNames
def Output(self, outputFile):
# Sort the files in file buffer,
@ -247,6 +268,7 @@ class SNBFile:
return
def Dump(self):
if self.fileName:
print "File Name:\t", self.fileName
print "File Count:\t", self.fileCount
print "VFAT Size(Compressed):\t%d(%d)" % (self.vfatSize, self.vfatCompressed)