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_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
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"
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")
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
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
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
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
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