#!/usr/bin/env python # -*- coding: utf-8 -*- # vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab # flake8: noqa from __future__ import unicode_literals, division, absolute_import, print_function from .compatibility_utils import PY2, text_type, bchr, bord import binascii if PY2: range = xrange from itertools import cycle def getLanguage(langID, sublangID): mobilangdict = { 54: {0: "af"}, # Afrikaans 28: {0: "sq"}, # Albanian 1: { 0: "ar", 5: "ar-dz", 15: "ar-bh", 3: "ar-eg", 2: "ar-iq", 11: "ar-jo", 13: "ar-kw", 12: "ar-lb", 4: "ar-ly", 6: "ar-ma", 8: "ar-om", 16: "ar-qa", 1: "ar-sa", 10: "ar-sy", 7: "ar-tn", 14: "ar-ae", 9: "ar-ye", }, # Arabic, Arabic (Algeria), Arabic (Bahrain), Arabic (Egypt), Arabic # (Iraq), Arabic (Jordan), Arabic (Kuwait), Arabic (Lebanon), Arabic # (Libya), Arabic (Morocco), Arabic (Oman), Arabic (Qatar), Arabic # (Saudi Arabia), Arabic (Syria), Arabic (Tunisia), Arabic (United Arab # Emirates), Arabic (Yemen) 43: {0: "hy"}, # Armenian 77: {0: "as"}, # Assamese 44: {0: "az"}, # "Azeri (IANA: Azerbaijani) 45: {0: "eu"}, # Basque 35: {0: "be"}, # Belarusian 69: {0: "bn"}, # Bengali 2: {0: "bg"}, # Bulgarian 3: {0: "ca"}, # Catalan 4: {0: "zh", 3: "zh-hk", 2: "zh-cn", 4: "zh-sg", 1: "zh-tw"}, # Chinese, Chinese (Hong Kong), Chinese (PRC), Chinese (Singapore), Chinese (Taiwan) 26: {0: "hr", 3: "sr"}, # Croatian, Serbian 5: {0: "cs"}, # Czech 6: {0: "da"}, # Danish 19: {0: "nl", 1: "nl", 2: "nl-be"}, # Dutch / Flemish, Dutch (Belgium) 9: { 0: "en", 1: "en", 3: "en-au", 40: "en-bz", 4: "en-ca", 6: "en-ie", 8: "en-jm", 5: "en-nz", 13: "en-ph", 7: "en-za", 11: "en-tt", 2: "en-gb", 1: "en-us", 12: "en-zw", }, # English, English (Australia), English (Belize), English (Canada), # English (Ireland), English (Jamaica), English (New Zealand), English # (Philippines), English (South Africa), English (Trinidad), English # (United Kingdom), English (United States), English (Zimbabwe) 37: {0: "et"}, # Estonian 56: {0: "fo"}, # Faroese 41: {0: "fa"}, # Farsi / Persian 11: {0: "fi"}, # Finnish 12: { 0: "fr", 1: "fr", 2: "fr-be", 3: "fr-ca", 5: "fr-lu", 6: "fr-mc", 4: "fr-ch", }, # French, French (Belgium), French (Canada), French (Luxembourg), French (Monaco), French (Switzerland) 55: {0: "ka"}, # Georgian 7: {0: "de", 1: "de", 3: "de-at", 5: "de-li", 4: "de-lu", 2: "de-ch"}, # German, German (Austria), German (Liechtenstein), German (Luxembourg), German (Switzerland) 8: {0: "el"}, # Greek, Modern (1453-) 71: {0: "gu"}, # Gujarati 13: {0: "he"}, # Hebrew (also code 'iw'?) 57: {0: "hi"}, # Hindi 14: {0: "hu"}, # Hungarian 15: {0: "is"}, # Icelandic 33: {0: "id"}, # Indonesian 16: {0: "it", 1: "it", 2: "it-ch"}, # Italian, Italian (Switzerland) 17: {0: "ja"}, # Japanese 75: {0: "kn"}, # Kannada 63: {0: "kk"}, # Kazakh 87: {0: "x-kok"}, # Konkani (real language code is 'kok'?) 18: {0: "ko"}, # Korean 38: {0: "lv"}, # Latvian 39: {0: "lt"}, # Lithuanian 47: {0: "mk"}, # Macedonian 62: {0: "ms"}, # Malay 76: {0: "ml"}, # Malayalam 58: {0: "mt"}, # Maltese 78: {0: "mr"}, # Marathi 97: {0: "ne"}, # Nepali 20: {0: "no"}, # Norwegian 72: {0: "or"}, # Oriya 21: {0: "pl"}, # Polish 22: {0: "pt", 2: "pt", 1: "pt-br"}, # Portuguese, Portuguese (Brazil) 70: {0: "pa"}, # Punjabi 23: {0: "rm"}, # "Rhaeto-Romanic" (IANA: Romansh) 24: {0: "ro"}, # Romanian 25: {0: "ru"}, # Russian 59: {0: "sz"}, # "Sami (Lappish)" (not an IANA language code) # IANA code for "Northern Sami" is 'se' # 'SZ' is the IANA region code for Swaziland 79: {0: "sa"}, # Sanskrit 27: {0: "sk"}, # Slovak 36: {0: "sl"}, # Slovenian 46: {0: "sb"}, # "Sorbian" (not an IANA language code) # 'SB' is IANA region code for 'Solomon Islands' # Lower Sorbian = 'dsb' # Upper Sorbian = 'hsb' # Sorbian Languages = 'wen' 10: { 0: "es", 4: "es", 44: "es-ar", 64: "es-bo", 52: "es-cl", 36: "es-co", 20: "es-cr", 28: "es-do", 48: "es-ec", 68: "es-sv", 16: "es-gt", 72: "es-hn", 8: "es-mx", 76: "es-ni", 24: "es-pa", 60: "es-py", 40: "es-pe", 80: "es-pr", 56: "es-uy", 32: "es-ve", }, # Spanish, Spanish (Mobipocket bug?), Spanish (Argentina), Spanish # (Bolivia), Spanish (Chile), Spanish (Colombia), Spanish (Costa Rica), # Spanish (Dominican Republic), Spanish (Ecuador), Spanish (El # Salvador), Spanish (Guatemala), Spanish (Honduras), Spanish (Mexico), # Spanish (Nicaragua), Spanish (Panama), Spanish (Paraguay), Spanish # (Peru), Spanish (Puerto Rico), Spanish (Uruguay), Spanish (Venezuela) 48: {0: "sx"}, # "Sutu" (not an IANA language code) # "Sutu" is another name for "Southern Sotho"? # IANA code for "Southern Sotho" is 'st' 65: {0: "sw"}, # Swahili 29: {0: "sv", 1: "sv", 8: "sv-fi"}, # Swedish, Swedish (Finland) 73: {0: "ta"}, # Tamil 68: {0: "tt"}, # Tatar 74: {0: "te"}, # Telugu 30: {0: "th"}, # Thai 49: {0: "ts"}, # Tsonga 50: {0: "tn"}, # Tswana 31: {0: "tr"}, # Turkish 34: {0: "uk"}, # Ukrainian 32: {0: "ur"}, # Urdu 67: {0: "uz", 2: "uz"}, # Uzbek 42: {0: "vi"}, # Vietnamese 52: {0: "xh"}, # Xhosa 53: {0: "zu"}, # Zulu } lang = "en" if langID in mobilangdict: subdict = mobilangdict[langID] lang = subdict[0] if sublangID in subdict: lang = subdict[sublangID] return lang def toHex(byteList): return binascii.hexlify(byteList) # returns base32 bytestring def toBase32(value, npad=4): digits = b"0123456789ABCDEFGHIJKLMNOPQRSTUV" num_string = b"" current = value while current != 0: next, remainder = divmod(current, 32) rem_string = digits[remainder : remainder + 1] num_string = rem_string + num_string current = next if num_string == b"": num_string = b"0" pad = npad - len(num_string) if pad > 0: num_string = b"0" * pad + num_string return num_string # converts base32 string to value def fromBase32(str_num): if isinstance(str_num, text_type): str_num = str_num.encode("latin-1") scalelst = [1, 32, 1024, 32768, 1048576, 33554432, 1073741824, 34359738368] value = 0 j = 0 n = len(str_num) scale = 0 for i in range(n): c = str_num[n - i - 1 : n - i] if c in b"0123456789": v = ord(c) - ord(b"0") else: v = ord(c) - ord(b"A") + 10 if j < len(scalelst): scale = scalelst[j] else: scale = scale * 32 j += 1 if v != 0: value = value + (v * scale) return value # note: if decode a bytestring using 'latin-1' (or any other 0-255 encoding) # in place of ascii you will get a byte to half-word or integer # one to one mapping of values from 0 - 255 def mangle_fonts(encryption_key, data): if isinstance(encryption_key, text_type): encryption_key = encryption_key.encode("latin-1") crypt = data[:1024] key = cycle(iter(map(bord, encryption_key))) # encrypt = ''.join([chr(ord(x)^key.next()) for x in crypt]) encrypt = b"".join([bchr(bord(x) ^ next(key)) for x in crypt]) return encrypt + data[1024:]