From 60c7c6634936f7c543ff25826630bc425d44e952 Mon Sep 17 00:00:00 2001 From: Li Fanxi Date: Wed, 2 Mar 2011 23:25:53 +0800 Subject: [PATCH 1/2] [Bug] Workaround a strange problem when extracting some SNB files with PDF contents. --- src/calibre/ebooks/snb/snbfile.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/snb/snbfile.py b/src/calibre/ebooks/snb/snbfile.py index e42533f241..10aa6a8715 100644 --- a/src/calibre/ebooks/snb/snbfile.py +++ b/src/calibre/ebooks/snb/snbfile.py @@ -75,15 +75,18 @@ class SNBFile: for i in range(self.plainBlock): bzdc = bz2.BZ2Decompressor() if (i < self.plainBlock - 1): - bSize = self.blocks[self.binBlock + i + 1].Offset - self.blocks[self.binBlock + i].Offset; + bSize = self.blocks[self.binBlock + i + 1].Offset - self.blocks[self.binBlock + i].Offset else: - bSize = self.tailOffset - self.blocks[self.binBlock + i].Offset; - snbFile.seek(self.blocks[self.binBlock + i].Offset); + bSize = self.tailOffset - self.blocks[self.binBlock + i].Offset + snbFile.seek(self.blocks[self.binBlock + i].Offset) try: data = snbFile.read(bSize) - uncompressedData += bzdc.decompress(data) + if len(data) < 32768: + uncompressedData += bzdc.decompress(data) except Exception, e: print e + if len(uncompressedData) != self.plainStreamSizeUncompressed: + raise Exception() f.fileBody = uncompressedData[plainPos:plainPos+f.fileSize] plainPos += f.fileSize elif f.attr & 0x01000000 == 0x01000000: From e373c822e2155f7595b1291764cb3030f418f282 Mon Sep 17 00:00:00 2001 From: Li Fanxi Date: Thu, 3 Mar 2011 00:06:34 +0800 Subject: [PATCH 2/2] [Bug] A better way to workaround a strange problem when extracting some SNB files with PDF contents. --- src/calibre/ebooks/snb/snbfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/snb/snbfile.py b/src/calibre/ebooks/snb/snbfile.py index 10aa6a8715..9a7d65e417 100644 --- a/src/calibre/ebooks/snb/snbfile.py +++ b/src/calibre/ebooks/snb/snbfile.py @@ -83,6 +83,8 @@ class SNBFile: data = snbFile.read(bSize) if len(data) < 32768: uncompressedData += bzdc.decompress(data) + else: + uncompressedData += data except Exception, e: print e if len(uncompressedData) != self.plainStreamSizeUncompressed: