home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import array
- import string
- import sys
- import calibre.utils.chm.chmlib as chmlib
- from calibre.constants import plugins
- (extra, extra_err) = plugins['chm_extra']
- if extra_err:
- raise RuntimeError('Failed to load chm.extra: ' + extra_err)
- extra_err
- charset_table = {
- 0: 'iso8859_1',
- 238: 'iso8859_2',
- 178: 'iso8859_6',
- 161: 'iso8859_7',
- 177: 'iso8859_8',
- 162: 'iso8859_9',
- 222: 'iso8859_11',
- 186: 'iso8859_13',
- 204: 'cp1251',
- 255: 'cp437',
- 128: 'cp932',
- 134: 'cp936',
- 129: 'cp949',
- 136: 'cp950',
- 1: None,
- 2: None,
- 130: None,
- 163: None,
- 77: None }
- locale_table = {
- 1078: ('iso8859_1', 'Afrikaans', 'Western Europe & US'),
- 1052: ('iso8859_2', 'Albanian', 'Central Europe'),
- 1025: ('iso8859_6', 'Arabic_Saudi_Arabia', 'Arabic'),
- 2049: ('iso8859_6', 'Arabic_Iraq', 'Arabic'),
- 3073: ('iso8859_6', 'Arabic_Egypt', 'Arabic'),
- 4097: ('iso8859_6', 'Arabic_Libya', 'Arabic'),
- 5121: ('iso8859_6', 'Arabic_Algeria', 'Arabic'),
- 6145: ('iso8859_6', 'Arabic_Morocco', 'Arabic'),
- 7169: ('iso8859_6', 'Arabic_Tunisia', 'Arabic'),
- 8193: ('iso8859_6', 'Arabic_Oman', 'Arabic'),
- 9217: ('iso8859_6', 'Arabic_Yemen', 'Arabic'),
- 10241: ('iso8859_6', 'Arabic_Syria', 'Arabic'),
- 11265: ('iso8859_6', 'Arabic_Jordan', 'Arabic'),
- 12289: ('iso8859_6', 'Arabic_Lebanon', 'Arabic'),
- 13313: ('iso8859_6', 'Arabic_Kuwait', 'Arabic'),
- 14337: ('iso8859_6', 'Arabic_UAE', 'Arabic'),
- 15361: ('iso8859_6', 'Arabic_Bahrain', 'Arabic'),
- 16385: ('iso8859_6', 'Arabic_Qatar', 'Arabic'),
- 1067: (None, 'Armenian', 'Armenian'),
- 1068: ('iso8859_9', 'Azeri_Latin', 'Turkish'),
- 2092: ('cp1251', 'Azeri_Cyrillic', 'Cyrillic'),
- 1069: ('iso8859_1', 'Basque', 'Western Europe & US'),
- 1059: ('cp1251', 'Belarusian', 'Cyrillic'),
- 1026: ('cp1251', 'Bulgarian', 'Cyrillic'),
- 1027: ('iso8859_1', 'Catalan', 'Western Europe & US'),
- 1028: ('cp950', 'Chinese_Taiwan', 'Traditional Chinese'),
- 2052: ('cp936', 'Chinese_PRC', 'Simplified Chinese'),
- 3076: ('cp950', 'Chinese_Hong_Kong', 'Traditional Chinese'),
- 4100: ('cp936', 'Chinese_Singapore', 'Simplified Chinese'),
- 5124: ('cp950', 'Chinese_Macau', 'Traditional Chinese'),
- 1050: ('iso8859_2', 'Croatian', 'Central Europe'),
- 1029: ('iso8859_2', 'Czech', 'Central Europe'),
- 1030: ('iso8859_1', 'Danish', 'Western Europe & US'),
- 1043: ('iso8859_1', 'Dutch_Standard', 'Western Europe & US'),
- 2067: ('iso8859_1', 'Dutch_Belgian', 'Western Europe & US'),
- 1033: ('iso8859_1', 'English_United_States', 'Western Europe & US'),
- 2057: ('iso8859_1', 'English_United_Kingdom', 'Western Europe & US'),
- 3081: ('iso8859_1', 'English_Australian', 'Western Europe & US'),
- 4105: ('iso8859_1', 'English_Canadian', 'Western Europe & US'),
- 5129: ('iso8859_1', 'English_New_Zealand', 'Western Europe & US'),
- 6153: ('iso8859_1', 'English_Irish', 'Western Europe & US'),
- 7177: ('iso8859_1', 'English_South_Africa', 'Western Europe & US'),
- 8201: ('iso8859_1', 'English_Jamaica', 'Western Europe & US'),
- 9225: ('iso8859_1', 'English_Caribbean', 'Western Europe & US'),
- 10249: ('iso8859_1', 'English_Belize', 'Western Europe & US'),
- 11273: ('iso8859_1', 'English_Trinidad', 'Western Europe & US'),
- 12297: ('iso8859_1', 'English_Zimbabwe', 'Western Europe & US'),
- 13321: ('iso8859_1', 'English_Philippines', 'Western Europe & US'),
- 1061: ('iso8859_13', 'Estonian', 'Baltic'),
- 1080: ('iso8859_1', 'Faeroese', 'Western Europe & US'),
- 1065: ('iso8859_6', 'Farsi', 'Arabic'),
- 1035: ('iso8859_1', 'Finnish', 'Western Europe & US'),
- 1036: ('iso8859_1', 'French_Standard', 'Western Europe & US'),
- 2060: ('iso8859_1', 'French_Belgian', 'Western Europe & US'),
- 3084: ('iso8859_1', 'French_Canadian', 'Western Europe & US'),
- 4108: ('iso8859_1', 'French_Swiss', 'Western Europe & US'),
- 5132: ('iso8859_1', 'French_Luxembourg', 'Western Europe & US'),
- 6156: ('iso8859_1', 'French_Monaco', 'Western Europe & US'),
- 1079: (None, 'Georgian', 'Georgian'),
- 1031: ('iso8859_1', 'German_Standard', 'Western Europe & US'),
- 2055: ('iso8859_1', 'German_Swiss', 'Western Europe & US'),
- 3079: ('iso8859_1', 'German_Austrian', 'Western Europe & US'),
- 4103: ('iso8859_1', 'German_Luxembourg', 'Western Europe & US'),
- 5127: ('iso8859_1', 'German_Liechtenstein', 'Western Europe & US'),
- 1032: ('iso8859_7', 'Greek', 'Greek'),
- 1037: ('iso8859_8', 'Hebrew', 'Hebrew'),
- 1081: (None, 'Hindi', 'Indic'),
- 1038: ('iso8859_2', 'Hungarian', 'Central Europe'),
- 1039: ('iso8859_1', 'Icelandic', 'Western Europe & US'),
- 1057: ('iso8859_1', 'Indonesian', 'Western Europe & US'),
- 1040: ('iso8859_1', 'Italian_Standard', 'Western Europe & US'),
- 2064: ('iso8859_1', 'Italian_Swiss', 'Western Europe & US'),
- 1041: ('cp932', 'Japanese', 'Japanese'),
- 1087: ('cp1251', 'Kazakh', 'Cyrillic'),
- 1111: (None, 'Konkani', 'Indic'),
- 1042: ('cp949', 'Korean', 'Korean'),
- 1062: ('iso8859_13', 'Latvian', 'Baltic'),
- 1063: ('iso8859_13', 'Lithuanian', 'Baltic'),
- 1071: ('cp1251', 'Macedonian', 'Cyrillic'),
- 1086: ('iso8859_1', 'Malay_Malaysia', 'Western Europe & US'),
- 2110: ('iso8859_1', 'Malay_Brunei_Darussalam', 'Western Europe & US'),
- 1102: (None, 'Marathi', 'Indic'),
- 1044: ('iso8859_1', 'Norwegian_Bokmal', 'Western Europe & US'),
- 2068: ('iso8859_1', 'Norwegian_Nynorsk', 'Western Europe & US'),
- 1045: ('iso8859_2', 'Polish', 'Central Europe'),
- 1046: ('iso8859_1', 'Portuguese_Brazilian', 'Western Europe & US'),
- 2070: ('iso8859_1', 'Portuguese_Standard', 'Western Europe & US'),
- 1048: ('iso8859_2', 'Romanian', 'Central Europe'),
- 1049: ('cp1251', 'Russian', 'Cyrillic'),
- 1103: (None, 'Sanskrit', 'Indic'),
- 2074: ('iso8859_2', 'Serbian_Latin', 'Central Europe'),
- 3098: ('cp1251', 'Serbian_Cyrillic', 'Cyrillic'),
- 1051: ('iso8859_2', 'Slovak', 'Central Europe'),
- 1060: ('iso8859_2', 'Slovenian', 'Central Europe'),
- 1034: ('iso8859_1', 'Spanish_Trad_Sort', 'Western Europe & US'),
- 2058: ('iso8859_1', 'Spanish_Mexican', 'Western Europe & US'),
- 3082: ('iso8859_1', 'Spanish_Modern_Sort', 'Western Europe & US'),
- 4106: ('iso8859_1', 'Spanish_Guatemala', 'Western Europe & US'),
- 5130: ('iso8859_1', 'Spanish_Costa_Rica', 'Western Europe & US'),
- 6154: ('iso8859_1', 'Spanish_Panama', 'Western Europe & US'),
- 7178: ('iso8859_1', 'Spanish_Dominican_Repub', 'Western Europe & US'),
- 8202: ('iso8859_1', 'Spanish_Venezuela', 'Western Europe & US'),
- 9226: ('iso8859_1', 'Spanish_Colombia', 'Western Europe & US'),
- 10250: ('iso8859_1', 'Spanish_Peru', 'Western Europe & US'),
- 11274: ('iso8859_1', 'Spanish_Argentina', 'Western Europe & US'),
- 12298: ('iso8859_1', 'Spanish_Ecuador', 'Western Europe & US'),
- 13322: ('iso8859_1', 'Spanish_Chile', 'Western Europe & US'),
- 14346: ('iso8859_1', 'Spanish_Uruguay', 'Western Europe & US'),
- 15370: ('iso8859_1', 'Spanish_Paraguay', 'Western Europe & US'),
- 16394: ('iso8859_1', 'Spanish_Bolivia', 'Western Europe & US'),
- 17418: ('iso8859_1', 'Spanish_El_Salvador', 'Western Europe & US'),
- 18442: ('iso8859_1', 'Spanish_Honduras', 'Western Europe & US'),
- 19466: ('iso8859_1', 'Spanish_Nicaragua', 'Western Europe & US'),
- 20490: ('iso8859_1', 'Spanish_Puerto_Rico', 'Western Europe & US'),
- 1089: ('iso8859_1', 'Swahili', 'Western Europe & US'),
- 1053: ('iso8859_1', 'Swedish', 'Western Europe & US'),
- 2077: ('iso8859_1', 'Swedish_Finland', 'Western Europe & US'),
- 1097: (None, 'Tamil', 'Indic'),
- 1092: ('cp1251', 'Tatar', 'Cyrillic'),
- 1054: ('iso8859_11', 'Thai', 'Thai'),
- 1055: ('iso8859_9', 'Turkish', 'Turkish'),
- 1058: ('cp1251', 'Ukrainian', 'Cyrillic'),
- 1056: ('iso8859_6', 'Urdu', 'Arabic'),
- 1091: ('iso8859_9', 'Uzbek_Latin', 'Turkish'),
- 2115: ('cp1251', 'Uzbek_Cyrillic', 'Cyrillic'),
- 1066: (None, 'Vietnamese', 'Vietnamese') }
-
- class CHMFile:
- filename = ''
- file = None
- title = ''
- home = '/'
- index = None
- topics = None
- encoding = None
- lcid = None
- binaryindex = None
-
- def __init__(self):
- self.searchable = 0
-
-
- def LoadCHM(self, archiveName):
- if self.filename != None:
- self.CloseCHM()
-
- self.file = chmlib.chm_open(archiveName)
- if self.file == None:
- return 0
- self.filename = archiveName
- self.GetArchiveInfo()
- return 1
-
-
- def CloseCHM(self):
- if self.filename != None:
- chmlib.chm_close(self.file)
- self.file = None
- self.filename = ''
- self.title = ''
- self.home = '/'
- self.index = None
- self.topics = None
- self.encoding = None
-
-
-
- def GetArchiveInfo(self):
- self.searchable = False
- self.lcid = None
- (result, ui) = chmlib.chm_resolve_object(self.file, '/#SYSTEM')
- if result != chmlib.CHM_RESOLVE_SUCCESS:
- sys.stderr.write('GetArchiveInfo: #SYSTEM does not exist\n')
- return 0
- (size, text) = chmlib.chm_retrieve_object(self.file, ui, 0x4L, ui.length)
- if size == 0:
- sys.stderr.write('GetArchiveInfo: file size = 0\n')
- return 0
- buff = array.array('B', text)
- index = 0
- while index < size:
- cursor = buff[index] + buff[index + 1] * 256
- if cursor == 0:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- self.topics = '/' + text[index:index + cursor - 1]
- elif cursor == 1:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- self.index = '/' + text[index:index + cursor - 1]
- elif cursor == 2:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- self.home = '/' + text[index:index + cursor - 1]
- elif cursor == 3:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- self.title = text[index:index + cursor - 1]
- elif cursor == 4:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- self.lcid = buff[index] + buff[index + 1] * 256
- elif cursor == 6:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- tmp = text[index:index + cursor - 1]
- if not self.topics:
- tmp1 = '/' + tmp + '.hhc'
- tmp2 = '/' + tmp + '.hhk'
- (res1, ui1) = chmlib.chm_resolve_object(self.file, tmp1)
- (res2, ui2) = chmlib.chm_resolve_object(self.file, tmp2)
- if not (self.topics) and res1 == chmlib.CHM_RESOLVE_SUCCESS:
- self.topics = '/' + tmp + '.hhc'
-
- if not (self.index) and res2 == chmlib.CHM_RESOLVE_SUCCESS:
- self.index = '/' + tmp + '.hhk'
-
-
- elif cursor == 16:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- self.encoding = text[index:index + cursor - 1]
- else:
- index += 2
- cursor = buff[index] + buff[index + 1] * 256
- index += 2
- index += cursor
- self.GetWindowsInfo()
- if not self.lcid:
- self.lcid = extra.get_lcid(self.file)
-
- return 1
-
-
- def GetTopicsTree(self):
- if self.topics == None:
- return None
- (size, text) = chmlib.chm_retrieve_object(self.file, ui, 0x0L, ui.length)
- if size == 0:
- sys.stderr.write('GetTopicsTree: file size = 0\n')
- return None
- return text
-
-
- def GetIndex(self):
- if self.index == None:
- return None
- (size, text) = chmlib.chm_retrieve_object(self.file, ui, 0x0L, ui.length)
- if size == 0:
- sys.stderr.write('GetIndex: file size = 0\n')
- return None
- return text
-
-
- def ResolveObject(self, document):
- if self.file:
- path = document
- return chmlib.chm_resolve_object(self.file, path)
- return (1, None)
-
-
- def RetrieveObject(self, ui, start = -1, length = -1):
- if self.file and ui:
- if length == -1:
- len = ui.length
- else:
- len = length
- if start == -1:
- st = 0x0L
- else:
- st = long(start)
- return chmlib.chm_retrieve_object(self.file, ui, st, len)
- return (0, '')
-
-
- def Search(self, text, wholewords = 0, titleonly = 0):
- if text and text != '' and self.file:
- return extra.search(self.file, text, wholewords, titleonly)
- return None
-
-
- def IsSearchable(self):
- return self.searchable
-
-
- def GetEncoding(self):
- if self.encoding:
- vals = string.split(self.encoding, ',')
- if len(vals) > 2:
-
- try:
- return charset_table[int(vals[2])]
- except KeyError:
- pass
- except:
- None<EXCEPTION MATCH>KeyError
-
-
- None<EXCEPTION MATCH>KeyError
-
-
-
- def GetLCID(self):
- if self.lcid in locale_table:
- return locale_table[self.lcid]
- return None
-
-
- def GetDWORD(self, buff, idx = 0):
- result = buff[idx] + (buff[idx + 1] << 8) + (buff[idx + 2] << 16) + (buff[idx + 3] << 24)
- if result == 0xFFFFFFFFL:
- result = 0
-
- return result
-
-
- def GetString(self, text, idx):
- next = string.find(text, '\x00', idx)
- chunk = text[idx:next]
- return chunk
-
-
- def GetWindowsInfo(self):
- (result, ui) = chmlib.chm_resolve_object(self.file, '/#WINDOWS')
- if result != chmlib.CHM_RESOLVE_SUCCESS:
- return -1
- (size, text) = chmlib.chm_retrieve_object(self.file, ui, 0x0L, 8)
- if size < 8:
- return -2
- buff = array.array('B', text)
- num_entries = self.GetDWORD(buff, 0)
- entry_size = self.GetDWORD(buff, 4)
- if num_entries < 1:
- return -3
- (size, text) = chmlib.chm_retrieve_object(self.file, ui, 0x8L, entry_size)
- if size < entry_size:
- return -4
- buff = array.array('B', text)
- toc_index = self.GetDWORD(buff, 96)
- idx_index = self.GetDWORD(buff, 100)
- dft_index = self.GetDWORD(buff, 104)
- (result, ui) = chmlib.chm_resolve_object(self.file, '/#STRINGS')
- if result != chmlib.CHM_RESOLVE_SUCCESS:
- return -5
- (size, text) = chmlib.chm_retrieve_object(self.file, ui, 0x0L, ui.length)
- if size == 0:
- return -6
-
-
-