Newer
Older
Import / projects / LGN-IP3870 / t / orig / smdl.py
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)