1
# -*- coding: utf-8 -*-
3
Inspect the header of ereader files. This is primarily used for debugging.
7
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
8
__docformat__ = 'restructuredtext en'
13
from calibre.ebooks.pdb.ereader import EreaderError
14
from calibre.ebooks.pdb.header import PdbHeaderReader
16
def ereader_header_info(header):
17
h0 = header.section_data(0)
19
print 'Header Size: %s' % len(h0)
22
print 'Header Type: Dropbook compatible'
24
ereader_header_info132(h0)
26
print 'Header Type: Makebook compatible'
28
ereader_header_info202(h0)
30
raise EreaderError('Size mismatch. eReader header record size %i KB is not supported.' % len(h0))
32
def pdb_header_info(header):
33
print 'PDB Header Info:'
35
print 'Identity: %s' % header.ident
36
print 'Total Sectons: %s' % header.num_sections
37
print 'Title: %s' % header.title
40
def ereader_header_info132(h0):
41
print 'Ereader Record 0 (Header) Info:'
43
print '0-2 Version: %i' % struct.unpack('>H', h0[0:2])[0]
44
print '2-4: %i' % struct.unpack('>H', h0[2:4])[0]
45
print '4-6: %i' % struct.unpack('>H', h0[4:6])[0]
46
print '6-8 Codepage: %i' % struct.unpack('>H', h0[6:8])[0]
47
print '8-10: %i' % struct.unpack('>H', h0[8:10])[0]
48
print '10-12: %i' % struct.unpack('>H', h0[10:12])[0]
49
print '12-14 Non-Text offset: %i' % struct.unpack('>H', h0[12:14])[0]
50
print '14-16: %i' % struct.unpack('>H', h0[14:16])[0]
51
print '16-18: %i' % struct.unpack('>H', h0[16:18])[0]
52
print '18-20: %i' % struct.unpack('>H', h0[18:20])[0]
53
print '20-22 Image Count: %i' % struct.unpack('>H', h0[20:22])[0]
54
print '22-24: %i' % struct.unpack('>H', h0[22:24])[0]
55
print '24-26 Has Metadata?: %i' % struct.unpack('>H', h0[24:26])[0]
56
print '26-28: %i' % struct.unpack('>H', h0[26:28])[0]
57
print '28-30 Footnote Count: %i' % struct.unpack('>H', h0[28:30])[0]
58
print '30-32 Sidebar Count: %i' % struct.unpack('>H', h0[30:32])[0]
59
print '32-34 Bookmark Offset: %i' % struct.unpack('>H', h0[32:34])[0]
60
print '34-36 MAGIC: %i' % struct.unpack('>H', h0[34:36])[0]
61
print '36-38: %i' % struct.unpack('>H', h0[36:38])[0]
62
print '38-40: %i' % struct.unpack('>H', h0[38:40])[0]
63
print '40-42 Image Data Offset: %i' % struct.unpack('>H', h0[40:42])[0]
64
print '42-44: %i' % struct.unpack('>H', h0[42:44])[0]
65
print '44-46 Metadata Offset: %i' % struct.unpack('>H', h0[44:46])[0]
66
print '46-48: %i' % struct.unpack('>H', h0[46:48])[0]
67
print '48-50 Footnote Offset: %i' % struct.unpack('>H', h0[48:50])[0]
68
print '50-52 Sidebar Offset: %i' % struct.unpack('>H', h0[50:52])[0]
69
print '52-54 Last Data Offset: %i' % struct.unpack('>H', h0[52:54])[0]
71
for i in range(54, 131, 2):
72
print '%i-%i: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0])
76
def ereader_header_info202(h0):
77
print 'Ereader Record 0 (Header) Info:'
79
print '0-2 Version: %i' % struct.unpack('>H', h0[0:2])[0]
80
print '2-4 Garbage: %i' % struct.unpack('>H', h0[2:4])[0]
81
print '4-6 Garbage: %i' % struct.unpack('>H', h0[4:6])[0]
82
print '6-8 Garbage: %i' % struct.unpack('>H', h0[6:8])[0]
83
print '8-10 Non-Text Offset: %i' % struct.unpack('>H', h0[8:10])[0]
84
print '10-12: %i' % struct.unpack('>H', h0[10:12])[0]
85
print '12-14: %i' % struct.unpack('>H', h0[12:14])[0]
86
print '14-16 Garbage: %i' % struct.unpack('>H', h0[14:16])[0]
87
print '16-18 Garbage: %i' % struct.unpack('>H', h0[16:18])[0]
88
print '18-20 Garbage: %i' % struct.unpack('>H', h0[18:20])[0]
89
print '20-22 Garbage: %i' % struct.unpack('>H', h0[20:22])[0]
90
print '22-24 Garbage: %i' % struct.unpack('>H', h0[22:24])[0]
91
print '24-26: %i' % struct.unpack('>H', h0[24:26])[0]
92
print '26-28: %i' % struct.unpack('>H', h0[26:28])[0]
93
for i in range(28, 98, 2):
94
print '%i-%i Garbage: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0])
95
print '98-100: %i' % struct.unpack('>H', h0[98:100])[0]
96
for i in range(100, 110, 2):
97
print '%i-%i Garbage: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0])
98
print '110-112: %i' % struct.unpack('>H', h0[110:112])[0]
99
print '112-114: %i' % struct.unpack('>H', h0[112:114])[0]
100
print '114-116 Garbage: %i' % struct.unpack('>H', h0[114:116])[0]
101
for i in range(116, 202, 2):
102
print '%i-%i: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0])
105
print '* Garbage: Random values.'
109
def section_lengths(header):
110
print 'Section Sizes'
113
for i in range(0, header.section_count()):
114
size = len(header.section_data(i))
116
message = '<--- Over!'
120
print 'Section %i: %i %s' % (i, size, message)
122
def main(args=sys.argv):
124
print 'Error: requires input file.'
127
f = open(sys.argv[1], 'rb')
129
pheader = PdbHeaderReader(f)
131
pdb_header_info(pheader)
132
ereader_header_info(pheader)
133
section_lengths(pheader)
137
if __name__ == '__main__':