Ejemplo n.º 1
0
    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))
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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))