Checkpoint for changing computers

This commit is contained in:
Marshall T. Vandegrift 2008-07-16 15:00:47 -04:00
parent 76b3759947
commit a48282500f

View File

@ -25,20 +25,6 @@ XHTML_DECL = """<?xml version="1.0" encoding="UTF-8" ?>
"http://openebook.org/dtds/oeb-1.0.1/oebdoc101.dtd"> "http://openebook.org/dtds/oeb-1.0.1/oebdoc101.dtd">
""" """
class DirectoryEntry(object):
def __init__(self, name, section, offset, size):
self.name = name
self.section = section
self.offset = offset
self.size = size
def __repr__(self):
return "<DirectoryEntry name='%s' section='%d' offset='%d' size='%d'>" \
% (self.name, self.section, self.offset, self.size)
def __str__(self):
return repr(self)
def u32(bytes): def u32(bytes):
return struct.unpack('<L', bytes[:4])[0] return struct.unpack('<L', bytes[:4])[0]
@ -302,6 +288,20 @@ class UnBinary(object):
state = 'get attr' state = 'get attr'
return index return index
class DirectoryEntry(object):
def __init__(self, name, section, offset, size):
self.name = name
self.section = section
self.offset = offset
self.size = size
def __repr__(self):
return "DirectoryEntry(name=%s, section=%d, offset=%d, size=%d)" \
% (repr(self.name), self.section, self.offset, self.size)
def __str__(self):
return repr(self)
class ManifestItem(object): class ManifestItem(object):
def __init__(self, original, internal, mime_type, offset, root, state): def __init__(self, original, internal, mime_type, offset, root, state):
self.original = original self.original = original
@ -310,8 +310,7 @@ class ManifestItem(object):
self.offset = offset self.offset = offset
self.root = root self.root = root
self.state = state self.state = state
self.prefix = 'images' \ self.prefix = state if state in ('images', 'css') else ''
if state == 'images' else 'css' if state == 'css' else ''
self.prefix = self.prefix + os.sep if self.prefix else '' self.prefix = self.prefix + os.sep if self.prefix else ''
self.path = self.prefix + self.original self.path = self.prefix + self.original
@ -321,7 +320,8 @@ class ManifestItem(object):
return self.internal == other return self.internal == other
def __repr__(self): def __repr__(self):
return self.internal + u'->' + self.path return "ManifestItem(internal='%s', path='%s')" \
% (repr(self.internal), repr(self.path))
def preserve(function): def preserve(function):
def wrapper(self, *args, **kwargs): def wrapper(self, *args, **kwargs):
@ -383,6 +383,7 @@ class LitFile(object):
return property(fget=fget) return property(fget=fget)
guid = guid() guid = guid()
def header(): def header():
@preserve @preserve
def fget(self): def fget(self):
@ -403,6 +404,19 @@ class LitFile(object):
self.read_secondary_header() self.read_secondary_header()
self.read_header_pieces() self.read_header_pieces()
@preserve
def __len__(self):
self._stream.seek(0, 2)
return self._stream.tell()
@preserve
def _read_raw(self, offset, size):
self._stream.seek(offset)
return self._stream.read(size)
def _read_content(self, offset, size):
return self._read_raw(self.content_offset + offset, size)
@preserve @preserve
def read_secondary_header(self): def read_secondary_header(self):
self._stream.seek(self.hdr_len + self.num_pieces*self.PIECE_SIZE) self._stream.seek(self.hdr_len + self.num_pieces*self.PIECE_SIZE)
@ -462,7 +476,7 @@ class LitFile(object):
self.piece4_guid = piece self.piece4_guid = piece
def read_directory(self, piece): def read_directory(self, piece):
self.entries = [] self.entries = {}
if not piece.startswith('IFCM'): if not piece.startswith('IFCM'):
raise LitError('Header piece #1 is not main directory.') raise LitError('Header piece #1 is not main directory.')
chunk_size, num_chunks = int32(piece[8:12]), int32(piece[24:28]) chunk_size, num_chunks = int32(piece[8:12]), int32(piece[24:28])
@ -507,7 +521,7 @@ class LitFile(object):
self.read_manifest(entry) self.read_manifest(entry)
elif name == '/meta': elif name == '/meta':
self.read_meta(entry) self.read_meta(entry)
self.entries.append(entry) self.entries[name] = entry
i += 1 i += 1
if not hasattr(self, 'sections'): if not hasattr(self, 'sections'):
@ -590,14 +604,17 @@ class LitFile(object):
@preserve @preserve
def read_image(self, internal_name): def read_image(self, internal_name):
cover_entry = None cover_entry = self.entries[internal_name]
for entry in self.entries:
if internal_name in entry.name:
cover_entry = entry
break
self._stream.seek(self.content_offset + cover_entry.offset) self._stream.seek(self.content_offset + cover_entry.offset)
return self._stream.read(cover_entry.size) return self._stream.read(cover_entry.size)
def get_file(self, name):
entry = self.entries[name]
if entry.section == 0:
return self._read_content(entry.offset, entry.size)
section = self.get_section(entry.section)
return section[entry.offset:entry.offset+entry.size]
def get_metadata(stream): def get_metadata(stream):
try: try:
litfile = LitFile(stream) litfile = LitFile(stream)