import config
def calculate_checksum(s):
check_sum = 0
for x in s:
check_sum += ord(x)
check_sum &= 0xFF
return (0x100 - check_sum) & 0xFF # two's complement
class Parser:
def __init__(self):
self.buf = ''
self.done = False
self.len = -1
self.dll_pass = False
self.checksum_valid = True
self.extension_bit = False
self.ignore_gabage = False
def need_more(self):
return not self.done
def get_payload(self):
return self.buf[2:-1]
def get_type(self):
return self.message_type & 0x7F
def read_header(self, buf):
if config.sms_debug:
print '### Parser:read_header()'
if self.ignore_gabage:
for i in range(len(buf)):
y = ord(buf[i])
if config.sms_debug:
print '0x%X' % y
if 0x11 <= (y & 0x7F) <= 0x16:
break
else:
return
else:
i = 0
y = ord(buf[i])
if not (0x11 <= (y & 0x7F) <= 0x16):
import sms, utils
if config.sms_debug:
print 'read_header invalid message error, y:', y
utils.print_hex(buf)
raise sms.DLLError, 'Invalid Message Type'
self.extension_bit = not (y & 0x80)
self.dll_pass = True
if i < len(buf):
return buf[i:]
else:
if config.sms_debug:
print 'all junk data...'
def feed(self, buf):
self.buf += buf
if config.sms_debug:
print '### Parser:feed(), buf_len:', len(self.buf)
print '*** received data'
import utils
utils.print_hex(buf)
print '*** data end'
if self.len < 0 and len(self.buf) < 3:
return
if self.len < 0 and len(self.buf) >= 2:
self.len = ord(self.buf[1]) + 3
self.message_type = ord(self.buf[0])
if self.len <= len(self.buf):
if config.sms_debug:
print 'self.len=', self.len, ' len(self.buf)=', len(self.buf)
print 'Got Message payload + checksum'
if len(self.buf) > self.len:
if config.sms_debug:
print 'got too long message from SC:'
print '\texpected: %d real: %d' % (self.len, len(self.buf))
raise IOError, 'Too long message'
self.done = True
check_sum = calculate_checksum(self.buf[:-1])
if check_sum != ord(self.buf[-1]):
self.checksum_valid = False
if config.sms_debug:
print 'checksum is wrong'
if self.done:
if config.sms_debug:
print 'self.len=', self.len, ' len(self.buf)=', len(self.buf)
print '*** received data'
for i in range(len(self.buf)):
print i+1, '0x%02X' % ord(self.buf[i])
print '*** data end'
class Maker:
def __init__(self, message_type, payload):
# 0x80: this message is complete
message = chr(message_type | 0x80) + chr(len(payload)) + str(payload)
check_sum = calculate_checksum(message)
self.message = message + chr(check_sum)
def __str__(self):
return self.message
if __name__ == '__main__':
import status
import smtp
DLL_SMS_DATA = 0x11
status.message_reference = 8
submit = smtp.Submit('email', '4210', 'abcdefg')
dll = Maker(DLL_SMS_DATA, submit)
m = str(dll)
for x in m:
print "[%02x]" % ord(x)
print 'fax - 5457'
status.message_reference = 9
submit = smtp.Submit('fax', '5457', 'Good morning')
dll = Maker(DLL_SMS_DATA, submit)
m = str(dll)
for x in m:
print "[%02x]" % ord(x)
import sys
sys.exit(0)