def __init__(self, number, type=UNKNOWN): if type == ALPHANUMERIC: self.type_of_number = ALPHANUMERIC septets = unpack_7bit_bytes(number) self.number = gsm_decoder(septets) self.numbering_plan_id = UNKNOWN elif type == INTERNATIONAL: self.type_of_number = INTERNATIONAL if number.startswith('+'): self.number = number[1:] else: self.number = number self.numbering_plan_id = ISDNORTELEPHONE else: if number.startswith('+'): self.type_of_number = INTERNATIONAL self.number = number[1:] else: self.type_of_number = UNKNOWN self.number = number self.numbering_plan_id = ISDNORTELEPHONE
def user_data_from_octets(self, flags, octets, coding_scheme): user_data_len = octets.pop(0) if flags & 0x40: # user data header indicator header_len8 = octets[0] + 1 self.header = octets[1:header_len8] else: header_len8 = 0 compressed = (coding_scheme & 0xE0 == 0x20) if compressed: raise NotImplementedError() if (coding_scheme & 0xEC == 0x00 or # general data coding coding_scheme & 0xE0 == 0xC0 or # message waiting indication coding_scheme & 0xF4 == 0xF0): # data coding/message class coding = DEFAULT_ALPHABET elif (coding_scheme & 0xEC == 0x04 or # general data coding coding_scheme & 0xF4 == 0xF4): # data coding/message class coding = EIGHT_BIT elif (coding_scheme & 0xEC == 0x08 or # general data coding coding_scheme & 0xF0 == 0xE0): # message waiting indication coding = UCS2 else: raise ValueError("Unsupported coding scheme: %d" % coding_scheme) if coding == DEFAULT_ALPHABET: header_len7 = (header_len8 * 8 + 6) / 7 # ceil(int*8/7) septets = unpack_7bit_bytes(octets)[header_len7:user_data_len] self.text = gsm_decoder(septets) else: octets = octets[header_len8:user_data_len] user_data = "".join(chr(o) for o in octets) if coding == UCS2: self.text = ucs2_decoder(user_data)[0] else: self.text = user_data