def parse_stsh(page, data, parent, flag):
    model = page.model
    [num] = struct.unpack('<I', data[4:8])
    [off1] = struct.unpack('<I', data[20:24])
    i = 1
    while off1 < len(data):
        if i == num:
            off2 = len(data)
        else:
            [off2] = struct.unpack('<I', data[20 + i * 4:24 + i * 4])


#		print "Offsets: %d %02x %02x"%(i,off1,off2)
        if flag == "1":  # and i/2.>i/2:
            iter1 = add_pgiter(
                page, "Ch %02x Pr %02x" %
                (i, struct.unpack("<H", data[20 + off1:20 + off1 + 2])[0]),
                "quill", "stsh", data[20 + off1:20 + off1 + 2], parent)
            [dlen] = struct.unpack('<I', data[20 + off1 + 2:20 + off1 + 6])
            pubblock.parse(page, data[20 + off1 + 6:20 + off1 + dlen + 2],
                           iter1, i)
            off1 += dlen + 2
            if off1 < off2:
                add_pgiter(page, "Ps", "quill", 0, data[20 + off1:20 + off2],
                           iter1)
        else:
            add_pgiter(page, "Ch %02x" % i, "quill", 0,
                       data[20 + off1:20 + off2], parent)
        off1 = off2
        i += 1
Exemplo n.º 2
0
def parse_fdpc (page,data,offset,fdpciter):
	model = page.model
	[num] = struct.unpack('<H', data[offset:offset+2])
	for i in range (num):
		[toff] = struct.unpack('<I', data[offset+8+i*4:offset+12+i*4])
		[tflag] = struct.unpack('<H', data[offset+8+num*4+i*2:offset+8+2+num*4+i*2])
		iter1 = add_pgiter (page,"[%02x] %02x"%(toff,tflag),"quill","fdpc",data[offset+8+i*4:offset+12+i*4],fdpciter)
		[nlen] = struct.unpack('<I', data[offset+tflag:offset+tflag+4])
		pubblock.parse (page,data[offset+tflag+4:offset+tflag+nlen],iter1,0,0)
	return
Exemplo n.º 3
0
def parse_pl(page,data,parent):
	model = page.model
	try:
		[num] = struct.unpack('<I', data[0:4])
		off = 12
		for i in range(num):
			[nlen] = struct.unpack('<I',data[off:off+4])
			iter1 = add_pgiter (page,"PL %02x"%i,"quill","pl",data[off:off+nlen],parent)
			pubblock.parse (page,data[off+4:off+nlen],iter1,i)
			off += nlen
	except:
		print "Failed at PL parsing"
Exemplo n.º 4
0
def parse_pl(page,data,parent):
	model = page.model
	try:
		[num] = struct.unpack('<I', data[0:4])
		off = 12
		for i in range(num):
			[nlen] = struct.unpack('<I',data[off:off+4])
			iter1 = add_pgiter (page,"PL %02x"%i,"quill","pl",data[off:off+nlen],parent)
			pubblock.parse (page,data[off+4:off+nlen],iter1,i)
			off += nlen
	except:
		print("Failed at PL parsing")
Exemplo n.º 5
0
def parse_mcld(page,data,parent):
	model = page.model
	[num] = struct.unpack('<I', data[4:8])
	off = num*4 + 8
	for i in range(num):
		iter1 = add_pgiter (page,"(%02x) %02x"%(i,struct.unpack("<I",data[8+i*4:12+i*4])[0]),"quill",0,data[8+i*4:12+i*4],parent)
		[nlen] = struct.unpack("<I",data[off:off+4])
		iter2 = add_pgiter (page,"Hdr","quill",0,data[off:off+nlen],iter1)
		pubblock.parse (page,data[off+4:off+nlen],iter2,i,0)
		off += nlen
		[num2] = struct.unpack('<I', data[off:off+4])
		off += 4
		for k in range(num2):
			[nlen2] = struct.unpack('<I', data[off:off+4])
			iter3 = add_pgiter (page,"Ch %02x"%k,"quill",0,data[off:off+nlen2],iter1)
			pubblock.parse (page,data[off+4:off+nlen2],iter3,k,0)
			off += nlen2
def parse_fdpc(page, data, offset, fdpciter):
    model = page.model
    [num] = struct.unpack('<H', data[offset:offset + 2])
    for i in range(num):
        [toff] = struct.unpack('<I',
                               data[offset + 8 + i * 4:offset + 12 + i * 4])
        [tflag] = struct.unpack(
            '<H', data[offset + 8 + num * 4 + i * 2:offset + 8 + 2 + num * 4 +
                       i * 2])
        iter1 = add_pgiter(page, "[%02x] %02x" % (toff, tflag), "quill",
                           "fdpc",
                           data[offset + 8 + i * 4:offset + 12 + i * 4],
                           fdpciter)
        [nlen] = struct.unpack('<I', data[offset + tflag:offset + tflag + 4])
        pubblock.parse(page, data[offset + tflag + 4:offset + tflag + nlen],
                       iter1, 0, 0)
    return
Exemplo n.º 7
0
def parse_mcld(page,data,parent):
	model = page.model
	[num] = struct.unpack('<I', data[4:8])
	off = num*4 + 8
	for i in range(num):
		iter1 = add_pgiter (page,"(%02x) %02x"%(i,struct.unpack("<I",data[8+i*4:12+i*4])[0]),"quill",0,data[8+i*4:12+i*4],parent)
		[nlen] = struct.unpack("<I",data[off:off+4])
		iter2 = add_pgiter (page,"Hdr","quill",0,data[off:off+nlen],iter1)
		pubblock.parse (page,data[off+4:off+nlen],iter2,i,0)
		off += nlen
		[num2] = struct.unpack('<I', data[off:off+4])
		off += 4
		for k in range(num2):
			[nlen2] = struct.unpack('<I', data[off:off+4])
			iter3 = add_pgiter (page,"Ch %02x"%k,"quill",0,data[off:off+nlen2],iter1)
			pubblock.parse (page,data[off+4:off+nlen2],iter3,k,0)
			off += nlen2
Exemplo n.º 8
0
def parse_stsh (page,data,parent,flag):
	model = page.model
	[num] = struct.unpack('<I', data[4:8])
	[off1] = struct.unpack('<I', data[20:24])
	i = 1
	while off1 < len(data):
		if i == num:
			off2 = len(data)
		else:
			[off2] = struct.unpack('<I', data[20+i*4:24+i*4])
#		print "Offsets: %d %02x %02x"%(i,off1,off2)
		if flag == "1": # and i/2.>i/2:
			iter1 = add_pgiter (page,"Ch %02x Pr %02x"%(i,struct.unpack("<H",data[20+off1:20+off1+2])[0]),"quill","stsh",data[20+off1:20+off1+2],parent)
			[dlen] = struct.unpack('<I', data[20+off1+2:20+off1+6])
			pubblock.parse (page,data[20+off1+6:20+off1+dlen+2],iter1,i)
			off1 += dlen+2
			if off1 < off2:
				add_pgiter (page,"Ps","quill",0,data[20+off1:20+off2],iter1)
		else:
			add_pgiter (page,"Ch %02x"%i,"quill",0,data[20+off1:20+off2],parent)
		off1 = off2
		i += 1
def parse(page, data, parent):
    model = page.model
    #	try:
    if 1:
        hdrsize = struct.unpack("<H", data[2:4])[0]
        if hdrsize == 0x22:
            parse98(page, data, parent)
            return
        add_pgiter(page, "Header", "pub", "cnthdr", data[0:hdrsize], parent)
        blocks = {}
        reorders = []
        off = hdrsize
        # Parse the 1st block after header
        [dlen] = struct.unpack('<I', data[off:off + 4])
        iter1 = add_pgiter(page, "Block A [%02x]" % off, "pub", 0,
                           data[off:off + dlen], parent)
        pubblock.parse(page, data[off + 4:off + dlen], iter1, 0)
        # Parse the dummy list block (the 2nd after header)
        [off] = struct.unpack('<I', data[0x1e:0x22])
        [dlen] = struct.unpack('<I', data[off:off + 4])
        iter1 = add_pgiter(page, "Block B [%02x]" % off, "pub", 0,
                           data[off:off + dlen], parent)
        pubblock.parse(page, data[off + 4:off + dlen], iter1, 1)
        # Parse the list of blocks block
        off = struct.unpack('<I', data[0x1a:0x1e])[0]
        [dlen] = struct.unpack('<I', data[off:off + 4])
        iter1 = add_pgiter(page, "Trailer [%02x]" % off, "pub", 0,
                           data[off:off + dlen], parent)
        pubblock.parse(page, data[off + 4:off + dlen], iter1, 2)
        list_iter = model.iter_nth_child(iter1, 2)
        j = 255
        name = "***"
        for k in range(model.iter_n_children(list_iter)):
            #			print "Parse 'Contents' block %02x"%k
            curiter = model.iter_nth_child(list_iter, k)
            test = model.get_value(curiter, 0)
            if test[len(test) - 4:] != "ID78":
                opts = ""
                parid = None
                for i in range(model.iter_n_children(curiter)):
                    child = model.iter_nth_child(curiter, i)
                    id = model.get_value(child, 0)[4:6]
                    if id == "02":
                        type = struct.unpack("<H", model.get_value(child,
                                                                   3))[0]
                    if id == "04":
                        offset = struct.unpack("<I", model.get_value(child,
                                                                     3))[0]
                    if id == "05":
                        [parid] = struct.unpack("<I",
                                                model.get_value(child, 3))
                dlen = struct.unpack('<I', data[offset:offset + 4])[0]
                if parid != None:
                    if blocks.has_key(parid):
                        if pubblock.block_types.has_key(type):
                            name = "(%02x) %s" % (j,
                                                  pubblock.block_types[type])
                        else:
                            name = "(%02x) Type: %02x" % (j, type)
                        iter1 = add_pgiter(page, name, "pub", 0,
                                           data[offset:offset + dlen],
                                           blocks[parid])
                        pubblock.parse(page, data[offset + 4:offset + dlen],
                                       iter1, i + 3, -1, type)
                        blocks[k + 255] = iter1
                    else:
                        reorders.append(k + 255)
                else:
                    if pubblock.block_types.has_key(type):
                        name = "(%02x) %s" % (j, pubblock.block_types[type])
                    else:
                        name = "(%02x) Type: %02x" % (j, type)
                    iter1 = add_pgiter(page, name, "pub", 0,
                                       data[offset:offset + dlen], parent)
                    pubblock.parse(page, data[offset + 4:offset + dlen], iter1,
                                   i + 3)
                    blocks[k + 255] = iter1
            j += 1
        if 0:  # what I used it for??
            #for k in reorders:
            curiter = model.iter_nth_child(list_iter, k)
            for i in range(model.iter_n_children(curiter)):
                child = model.iter_nth_child(curiter, i)
                id = model.get_value(child, 0)[4:6]
                if id == "02":
                    type = struct.unpack("<H", model.get_value(child, 3))[0]
                if id == "04":
                    offset = struct.unpack("<I", model.get_value(child, 3))[0]
                if id == "05":
                    [parid] = struct.unpack("<I", model.get_value(child, 3))
                [dlen] = struct.unpack('<I', data[offset:offset + 4])
                if blocks.has_key(parid):
                    if pubblock.block_types.has_key(type):
                        name = "(%02x) %s" % (j, pubblock.block_types[type])
                    else:
                        name = "(%02x) Type: %02x" % (j, type)
                    iter1 = add_pgiter(page, name, "pub", 0,
                                       data[offset:offset + dlen],
                                       blocks[parid])
                    pubblock.parse(page, data[offset + 4:offset + dlen], iter1,
                                   i)
                else:
                    print "Failed to add reordered item %02x" % parid

        return
Exemplo n.º 10
0
def parse_fdpc (page,data,offset,fdpciter):
	text_pos = {1: 'superscript', 2: 'subscript',}

	def underline(val):
		umap = {
			0x00: 'none',
			0x01: 'single',
			0x02: 'words only',
			0x03: 'double',
			0x04: 'dotted',
			0x06: 'thick',
			0x07: 'dash',
			0x09: 'dot dash',
			0x0a: 'dot dot dash',
			0x0b: 'wave',
			0x10: 'thick wave',
			0x11: 'thick dot',
			0x12: 'thick dash',
			0x13: 'thick dot dash',
			0x14: 'thick dot dot dash',
			0x15: 'long dash',
			0x16: 'thick long dash',
			0x17: 'double wave',
		}
		return key2txt(val & 0xff, umap)

	names = {
		0x2: 'Bold 1',
		0x3: 'Italic 1',
		0x4: 'Outline',
		0x5: 'Shadow',
		0xc: 'Text size 1',
		0xf: 'Text position',
		0x12: 'Locale ID',
		0x13: 'Small caps',
		0x14: 'All caps',
		0x16: 'Emboss',
		0x17: 'Engrave',
		0x18: 'Pair kerning',
		0x1b: 'Kerning',
		0x1e: 'Underline',
		0x1f: 'Tracking',
		0x20: 'Scaling',
		0x24: 'Font?',
		0x37: 'Bold 2',
		0x38: 'Italic 2',
		0x39: 'Text size 2',
	}

	displays = {
		0xc: emu2pttxt,
		0xf: text_pos,
		0x12: lcid2txt,
		0x18: emu2pttxt,
		0x1b: emu2pttxt,
		0x1e: underline,
		0x1f: val2pctxt,
		0x20: val2pctxt,
	}

	parsers = {
		0x24: pubblock.block_descs({0x0: 'Font index?',}),
	}

	descs = pubblock.block_descs(names, displays, parsers)

	model = page.model
	[num] = struct.unpack('<H', data[offset:offset+2])
	for i in range (num):
		[toff] = struct.unpack('<I', data[offset+8+i*4:offset+12+i*4])
		[tflag] = struct.unpack('<H', data[offset+8+num*4+i*2:offset+8+2+num*4+i*2])
		iter1 = add_pgiter (page,"[%02x] %02x"%(toff,tflag),"quill","fdpc",data[offset+8+i*4:offset+12+i*4],fdpciter)
		[nlen] = struct.unpack('<I', data[offset+tflag:offset+tflag+4])
		pubblock.parse (page,data[offset+tflag+4:offset+tflag+nlen],iter1,0,0,None,descs)
	return
Exemplo n.º 11
0
def parse_fdpc(page, data, offset, fdpciter):
    text_pos = {
        1: 'superscript',
        2: 'subscript',
    }

    def underline(val):
        umap = {
            0x00: 'none',
            0x01: 'single',
            0x02: 'words only',
            0x03: 'double',
            0x04: 'dotted',
            0x06: 'thick',
            0x07: 'dash',
            0x09: 'dot dash',
            0x0a: 'dot dot dash',
            0x0b: 'wave',
            0x10: 'thick wave',
            0x11: 'thick dot',
            0x12: 'thick dash',
            0x13: 'thick dot dash',
            0x14: 'thick dot dot dash',
            0x15: 'long dash',
            0x16: 'thick long dash',
            0x17: 'double wave',
        }
        return key2txt(val & 0xff, umap)

    names = {
        0x2: 'Bold 1',
        0x3: 'Italic 1',
        0x4: 'Outline',
        0x5: 'Shadow',
        0xc: 'Text size 1',
        0xf: 'Text position',
        0x12: 'Locale ID',
        0x13: 'Small caps',
        0x14: 'All caps',
        0x16: 'Emboss',
        0x17: 'Engrave',
        0x18: 'Pair kerning',
        0x1b: 'Kerning',
        0x1e: 'Underline',
        0x1f: 'Tracking',
        0x20: 'Scaling',
        0x24: 'Font?',
        0x37: 'Bold 2',
        0x38: 'Italic 2',
        0x39: 'Text size 2',
    }

    displays = {
        0xc: emu2pttxt,
        0xf: text_pos,
        0x12: lcid2txt,
        0x18: emu2pttxt,
        0x1b: emu2pttxt,
        0x1e: underline,
        0x1f: val2pctxt,
        0x20: val2pctxt,
    }

    parsers = {
        0x24: pubblock.block_descs({
            0x0: 'Font index?',
        }),
    }

    descs = pubblock.block_descs(names, displays, parsers)

    model = page.model
    [num] = struct.unpack('<H', data[offset:offset + 2])
    for i in range(num):
        [toff] = struct.unpack('<I',
                               data[offset + 8 + i * 4:offset + 12 + i * 4])
        [tflag] = struct.unpack(
            '<H', data[offset + 8 + num * 4 + i * 2:offset + 8 + 2 + num * 4 +
                       i * 2])
        iter1 = add_pgiter(page, "[%02x] %02x" % (toff, tflag), "quill",
                           "fdpc",
                           data[offset + 8 + i * 4:offset + 12 + i * 4],
                           fdpciter)
        [nlen] = struct.unpack('<I', data[offset + tflag:offset + tflag + 4])
        pubblock.parse(page, data[offset + tflag + 4:offset + tflag + nlen],
                       iter1, 0, 0, None, descs)
    return
Exemplo n.º 12
0
Arquivo: pub.py Projeto: renyxa/re-lab
	def parse(self,data):
		model = self.page.model
		hdrsize = struct.unpack("<H",data[2:4])[0]
		if hdrsize == 0x22:
			self.parse98 (data)
			return
		add_pgiter (self.page,"Header","pub","cnthdr",data[0:hdrsize],self.parent)
		blocks = {}
		reorders = []
		off = hdrsize
		# Parse the 1st block after header
		[dlen] = struct.unpack('<I', data[off:off+4])
		iter1 = add_pgiter (self.page,"Block A [%02x]"%off,"pub",0,data[off:off+dlen],self.parent)
		pubblock.parse (self.page,data[off+4:off+dlen],iter1,0)
		# Parse the dummy list block (the 2nd after header)
		[off] = struct.unpack('<I', data[0x1e:0x22])
		[dlen] = struct.unpack('<I', data[off:off+4])
		iter1 = add_pgiter (self.page,"Block B [%02x]"%off,"pub",0,data[off:off+dlen],self.parent)
		pubblock.parse (self.page,data[off+4:off+dlen],iter1,1)
		# Parse the list of blocks block
		off = struct.unpack('<I', data[0x1a:0x1e])[0]
		[dlen] = struct.unpack('<I', data[off:off+4])
		iter1 = add_pgiter (self.page,"Trailer [%02x]"%off,"pub",0,data[off:off+dlen],self.parent)
		pubblock.parse (self.page,data[off+4:off+dlen],iter1,2)
		list_iter = model.iter_nth_child(iter1,2)
		j = 255
		name = "***"
		for k in range (model.iter_n_children(list_iter)):
			# print "Parse 'Contents' block %02x"%k
			curiter = model.iter_nth_child(list_iter,k)
			test = model.get_value(curiter,0)
			if test[len(test)-4:] != "ID78":
				opts = ""
				parid = None
				for i in range (model.iter_n_children(curiter)):
					child = model.iter_nth_child(curiter,i)
					id = model.get_value(child,0)[4:6]
					if id == "02":
						type = struct.unpack("<H",model.get_value(child,3))[0]
					if id == "04":
						offset = struct.unpack("<I",model.get_value(child,3))[0]
					if id == "05":
						[parid] = struct.unpack("<I",model.get_value(child,3))
				dlen = struct.unpack('<I', data[offset:offset+4])[0]
				if parid != None:
					if blocks.has_key(parid):
						if pubblock.block_types.has_key(type):
							name = "(%02x) %s"%(j,pubblock.block_types[type])
						else:
							name = "(%02x) Type: %02x"%(j,type)
						iter1 = add_pgiter (self.page,name,"pub",0,data[offset:offset+dlen],blocks[parid])
						pubblock.parse (self.page,data[offset+4:offset+dlen],iter1,i+3,-1,type)
						blocks[k+255] = iter1
					else:
						reorders.append(k+255)
				else:
					if pubblock.block_types.has_key(type):
						name = "(%02x) %s"%(j,pubblock.block_types[type])
					else:
						name = "(%02x) Type: %02x"%(j,type)
					iter1 = add_pgiter (self.page,name,"pub",0,data[offset:offset+dlen],self.parent)
					pubblock.parse (self.page,data[offset+4:offset+dlen],iter1,i+3)
					blocks[k+255] = iter1
			j += 1