mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
[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:
parent
f0fb8fb12a
commit
6c9541723f
@ -5,6 +5,7 @@ __copyright__ = '2010, Li Fanxi <lifanxi@freemindworld.com>'
|
|||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import sys, struct, zlib, bz2, os, math
|
import sys, struct, zlib, bz2, os, math
|
||||||
|
from mimetypes import types_map
|
||||||
|
|
||||||
class FileStream:
|
class FileStream:
|
||||||
def IsBinary(self):
|
def IsBinary(self):
|
||||||
@ -18,9 +19,6 @@ class BlockData:
|
|||||||
|
|
||||||
class SNBFile:
|
class SNBFile:
|
||||||
|
|
||||||
files = []
|
|
||||||
blocks = []
|
|
||||||
|
|
||||||
MAGIC = 'SNBP000B'
|
MAGIC = 'SNBP000B'
|
||||||
REV80 = 0x00008000
|
REV80 = 0x00008000
|
||||||
REVA3 = 0x00A3A3A3
|
REVA3 = 0x00A3A3A3
|
||||||
@ -28,15 +26,21 @@ class SNBFile:
|
|||||||
REVZ2 = 0x00000000
|
REVZ2 = 0x00000000
|
||||||
|
|
||||||
def __init__(self, inputFile = None):
|
def __init__(self, inputFile = None):
|
||||||
|
self.files = []
|
||||||
|
self.blocks = []
|
||||||
|
|
||||||
if inputFile != None:
|
if inputFile != None:
|
||||||
self.Parse(inputFile);
|
self.Open(inputFile)
|
||||||
|
|
||||||
def Parse(self, inputFile):
|
def Open(self, inputFile):
|
||||||
self.fileName = inputFile
|
self.fileName = inputFile
|
||||||
|
|
||||||
snbFile = open(self.fileName, "rb")
|
snbFile = open(self.fileName, "rb")
|
||||||
snbFile.seek(0)
|
snbFile.seek(0)
|
||||||
|
self.Parse(snbFile)
|
||||||
|
snbFile.close()
|
||||||
|
|
||||||
|
def Parse(self, snbFile, metaOnly = False):
|
||||||
# Read header
|
# Read header
|
||||||
vmbr = snbFile.read(44)
|
vmbr = snbFile.read(44)
|
||||||
(self.magic, self.rev80, self.revA3, self.revZ1,
|
(self.magic, self.rev80, self.revA3, self.revZ1,
|
||||||
@ -47,7 +51,7 @@ class SNBFile:
|
|||||||
# Read FAT
|
# Read FAT
|
||||||
self.vfat = zlib.decompress(snbFile.read(self.vfatCompressed))
|
self.vfat = zlib.decompress(snbFile.read(self.vfatCompressed))
|
||||||
self.ParseFile(self.vfat, self.fileCount)
|
self.ParseFile(self.vfat, self.fileCount)
|
||||||
|
|
||||||
# Read tail
|
# Read tail
|
||||||
snbFile.seek(-16, os.SEEK_END)
|
snbFile.seek(-16, os.SEEK_END)
|
||||||
#plainStreamEnd = snbFile.tell()
|
#plainStreamEnd = snbFile.tell()
|
||||||
@ -57,7 +61,7 @@ class SNBFile:
|
|||||||
self.vTailUncompressed = zlib.decompress(snbFile.read(self.tailSize))
|
self.vTailUncompressed = zlib.decompress(snbFile.read(self.tailSize))
|
||||||
self.tailSizeUncompressed = len(self.vTailUncompressed)
|
self.tailSizeUncompressed = len(self.vTailUncompressed)
|
||||||
self.ParseTail(self.vTailUncompressed, self.fileCount)
|
self.ParseTail(self.vTailUncompressed, self.fileCount)
|
||||||
|
|
||||||
# Uncompress file data
|
# Uncompress file data
|
||||||
# Read files
|
# Read files
|
||||||
binPos = 0
|
binPos = 0
|
||||||
@ -78,7 +82,7 @@ class SNBFile:
|
|||||||
try:
|
try:
|
||||||
data = snbFile.read(bSize)
|
data = snbFile.read(bSize)
|
||||||
uncompressedData += bzdc.decompress(data)
|
uncompressedData += bzdc.decompress(data)
|
||||||
except EOFError, e:
|
except Exception, e:
|
||||||
print e
|
print e
|
||||||
f.fileBody = uncompressedData[plainPos:plainPos+f.fileSize]
|
f.fileBody = uncompressedData[plainPos:plainPos+f.fileSize]
|
||||||
plainPos += f.fileSize
|
plainPos += f.fileSize
|
||||||
@ -90,7 +94,6 @@ class SNBFile:
|
|||||||
else:
|
else:
|
||||||
print f.attr, f.fileName
|
print f.attr, f.fileName
|
||||||
raise Exception("Invalid file")
|
raise Exception("Invalid file")
|
||||||
snbFile.close()
|
|
||||||
|
|
||||||
def ParseFile(self, vfat, fileCount):
|
def ParseFile(self, vfat, fileCount):
|
||||||
fileNames = vfat[fileCount*12:].split('\0');
|
fileNames = vfat[fileCount*12:].split('\0');
|
||||||
@ -156,6 +159,24 @@ class SNBFile:
|
|||||||
f.fileBody = open(os.path.join(tdir,fileName), 'rb').read()
|
f.fileBody = open(os.path.join(tdir,fileName), 'rb').read()
|
||||||
f.fileName = fileName.replace(os.sep, '/')
|
f.fileName = fileName.replace(os.sep, '/')
|
||||||
self.files.append(f)
|
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):
|
def Output(self, outputFile):
|
||||||
|
|
||||||
@ -247,7 +268,8 @@ class SNBFile:
|
|||||||
return
|
return
|
||||||
|
|
||||||
def Dump(self):
|
def Dump(self):
|
||||||
print "File Name:\t", self.fileName
|
if self.fileName:
|
||||||
|
print "File Name:\t", self.fileName
|
||||||
print "File Count:\t", self.fileCount
|
print "File Count:\t", self.fileCount
|
||||||
print "VFAT Size(Compressed):\t%d(%d)" % (self.vfatSize, self.vfatCompressed)
|
print "VFAT Size(Compressed):\t%d(%d)" % (self.vfatSize, self.vfatCompressed)
|
||||||
print "Binary Stream Size:\t", self.binStreamSize
|
print "Binary Stream Size:\t", self.binStreamSize
|
||||||
|
Loading…
x
Reference in New Issue
Block a user