def extract_resources(self, records): self.resource_map = [] self.containers = [] known_types = { b'FLIS', b'FCIS', b'SRCS', b'\xe9\x8e\r\n', b'RESC', b'BOUN', b'FDST', b'DATP', b'AUDI', b'VIDE', b'CRES', b'CONT', b'CMET', b'PAGE' } container = None for i, rec in enumerate(records): for (l, r, offset) in self.resource_ranges: if l <= i <= r: resource_index = i + 1 if offset is not None and resource_index >= offset: resource_index -= offset break else: continue sig = rec.raw[:4] payload = rec.raw ext = 'dat' prefix = 'binary' suffix = '' if sig in {b'HUFF', b'CDIC', b'INDX'}: continue # TODO: Ignore CNCX records as well if sig == b'FONT': font = read_font_record(rec.raw) if font['err']: raise ValueError( 'Failed to read font record: %s Headers: %s' % (font['err'], font['headers'])) payload = (font['font_data'] if font['font_data'] else font['raw_data']) prefix, ext = 'fonts', font['ext'] elif sig == b'CONT': if payload == b'CONTBOUNDARY': self.containers.append(container) container = None continue container = ContainerHeader(payload) elif sig == b'CRES': container.resources.append(payload) if container.is_image_container: payload = payload[12:] q = what(None, payload) if q: prefix, ext = 'hd-images', q resource_index = len(container.resources) elif sig == b'\xa0\xa0\xa0\xa0' and len(payload) == 4: if container is None: print( 'Found an end of container record with no container, ignoring' ) else: container.resources.append(None) continue elif sig not in known_types: if container is not None and len( container.resources ) == container.num_of_resource_records: container.add_hrefs(payload) continue q = what(None, rec.raw) if q: prefix, ext = 'images', q if prefix == 'binary': if sig == b'\xe9\x8e\r\n': suffix = '-EOF' elif sig in known_types: suffix = '-' + sig.decode('ascii') self.resource_map.append( ('%s/%06d%s.%s' % (prefix, resource_index, suffix, ext), payload))
def extract_resources(self, records): self.resource_map = [] self.containers = [] known_types = {b'FLIS', b'FCIS', b'SRCS', b'\xe9\x8e\r\n', b'RESC', b'BOUN', b'FDST', b'DATP', b'AUDI', b'VIDE', b'CRES', b'CONT', b'CMET', b'PAGE'} container = None for i, rec in enumerate(records): for (l, r, offset) in self.resource_ranges: if l <= i <= r: resource_index = i + 1 if offset is not None and resource_index >= offset: resource_index -= offset break else: continue sig = rec.raw[:4] payload = rec.raw ext = 'dat' prefix = 'binary' suffix = '' if sig in {b'HUFF', b'CDIC', b'INDX'}: continue # TODO: Ignore CNCX records as well if sig == b'FONT': font = read_font_record(rec.raw) if font['err']: raise ValueError('Failed to read font record: %s Headers: %s'%( font['err'], font['headers'])) payload = (font['font_data'] if font['font_data'] else font['raw_data']) prefix, ext = 'fonts', font['ext'] elif sig == b'CONT': if payload == b'CONTBOUNDARY': self.containers.append(container) container = None continue container = ContainerHeader(payload) elif sig == b'CRES': container.resources.append(payload) if container.is_image_container: payload = payload[12:] q = what(None, payload) if q: prefix, ext = 'hd-images', q resource_index = len(container.resources) elif sig == b'\xa0\xa0\xa0\xa0' and len(payload) == 4: if container is None: print('Found an end of container record with no container, ignoring') else: container.resources.append(None) continue elif sig not in known_types: if container is not None and len(container.resources) == container.num_of_resource_records: container.add_hrefs(payload) continue q = what(None, rec.raw) if q: prefix, ext = 'images', q if prefix == 'binary': if sig == b'\xe9\x8e\r\n': suffix = '-EOF' elif sig in known_types: suffix = '-' + sig.decode('ascii') self.resource_map.append(('%s/%06d%s.%s'%(prefix, resource_index, suffix, ext), payload))
def extract_resources(self, records): self.resource_map = [] self.containers = [] known_types = { b"FLIS", b"FCIS", b"SRCS", b"\xe9\x8e\r\n", b"RESC", b"BOUN", b"FDST", b"DATP", b"AUDI", b"VIDE", b"CRES", b"CONT", b"CMET", b"PAGE", } container = None for i, rec in enumerate(records): for (l, r, offset) in self.resource_ranges: if l <= i <= r: resource_index = i + 1 if offset is not None and resource_index >= offset: resource_index -= offset break else: continue sig = rec.raw[:4] payload = rec.raw ext = "dat" prefix = "binary" suffix = "" if sig in {b"HUFF", b"CDIC", b"INDX"}: continue # TODO: Ignore CNCX records as well if sig == b"FONT": font = read_font_record(rec.raw) if font["err"]: raise ValueError("Failed to read font record: %s Headers: %s" % (font["err"], font["headers"])) payload = font["font_data"] if font["font_data"] else font["raw_data"] prefix, ext = "fonts", font["ext"] elif sig == b"CONT": if payload == b"CONTBOUNDARY": self.containers.append(container) container = None continue container = ContainerHeader(payload) elif sig == b"CRES": container.resources.append(payload) if container.is_image_container: payload = payload[12:] q = what(None, payload) if q: prefix, ext = "hd-images", q resource_index = len(container.resources) elif sig == b"\xa0\xa0\xa0\xa0" and len(payload) == 4: container.resources.append(None) continue elif sig not in known_types: if container is not None and len(container.resources) == container.num_of_resource_records: container.add_hrefs(payload) continue q = what(None, rec.raw) if q: prefix, ext = "images", q if prefix == "binary": if sig == b"\xe9\x8e\r\n": suffix = "-EOF" elif sig in known_types: suffix = "-" + sig.decode("ascii") self.resource_map.append(("%s/%06d%s.%s" % (prefix, resource_index, suffix, ext), payload))