pycrate_mobile: TS23040_SMS, fix decoding of SMS_STATUS_REPORT with TP_PI field which is optional

This commit is contained in:
mich 2019-01-04 18:03:31 +01:00
parent 991606dc28
commit ce0672a8cc
3 changed files with 34 additions and 20 deletions

View File

@ -575,7 +575,7 @@ def encode_7b(txt):
def decode_7b(buf):
"""translates the GSM 7 bit characters buffer `buf' to an unicode string
"""
"""
if python_version < 3:
char = Charpy(''.join(reversed(buf)))
else:

View File

@ -842,21 +842,22 @@ class TP_UD(Envelope):
return self[1].get_len() + self[2].get_len()
def _from_char(self, char):
dcs = self.get_dcs()
self[0]._from_char(char)
ccur, clen, charnum = char._cur, char._len_bit, self[0]()
self[1]._from_char(char)
if dcs == DCS_7B:
char._len_bit = ccur + 7*charnum
lastbit, self[2]._ENC_BL = char._len_bit%8, (char._len_bit-char._cur)
if lastbit:
char._len_bit += 8-lastbit
self[2]._from_char(char)
else:
char._len_bit = ccur + 8*charnum
self[2]._ENC_BL = 0
self[2]._from_char(char)
char._len_bit = clen
if not self.get_trans():
dcs = self.get_dcs()
self[0]._from_char(char)
ccur, clen, charnum = char._cur, char._len_bit, self[0]()
self[1]._from_char(char)
if dcs == DCS_7B:
char._len_bit = ccur + 7*charnum
lastbit, self[2]._ENC_BL = char._len_bit%8, (char._len_bit-char._cur)
if lastbit:
char._len_bit += 8-lastbit
self[2]._from_char(char)
else:
char._len_bit = ccur + 8*charnum
self[2]._ENC_BL = 0
self[2]._from_char(char)
char._len_bit = clen
def get_udhi(self):
try:
@ -1091,16 +1092,28 @@ class SMS_STATUS_REPORT(SMS_TP):
TP_SCTS(),
TP_DT(),
Uint8('TP_ST', dic=_TP_ST_dict),
TP_PI(),
TP_PI(), # may be set to transparent in case none of the following fields are present
TP_PID(),
TP_DCS(),
TP_UD()
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['TP_PID'].set_transauto(lambda: False if self['TP_PI']['TP_PID']() else True)
self['TP_DCS'].set_transauto(lambda: False if self['TP_PI']['TP_DCS']() else True)
self['TP_UD'].set_transauto(lambda: False if self['TP_PI']['TP_UDL']() else True)
# warning: TP-PI may be transparent
self['TP_PID'].set_transauto(lambda: False if not self['TP_PI'].get_trans() and self['TP_PI']['TP_PID']() else True)
self['TP_DCS'].set_transauto(lambda: False if not self['TP_PI'].get_trans() and self['TP_PI']['TP_DCS']() else True)
self['TP_UD'].set_transauto(lambda: False if not self['TP_PI'].get_trans() and self['TP_PI']['TP_UDL']() else True)
def _from_char(self, char):
# warning: TP_PI may be transparent
self[-4].set_trans(True)
SMS_TP._from_char(self, char)
if char.len_bit() >= 8:
self[-4].set_trans(False)
self[-4]._from_char(char)
self[-3]._from_char(char)
self[-2]._from_char(char)
self[-1]._from_char(char)
#------------------------------------------------------------------------------#

View File

@ -191,3 +191,4 @@ def encode_cbs_pages(msg, dcs7b=True, char_preamb=''):
buf.append(page)
buf.append(pack('>B', page_len))
return b''.join(buf)