Newer
Older
Import / projects / LGN-IP3870 / t / new / smsmanager.py
import time
import config
import os.path
import utils
from smtp import SmsMessage_KT, SmsInfoHandler, IsmcMessageHandler, MmsHeaderHandler, IsmcContentHandler
import mms_net_define

FILE, TIME, READ, EMS, NUMBER, SUMMARY = range(6)

IN_BOX = 0
OUT_BOX = 1
SENT_BOX = 2
DRAFT_BOX = 3

def get_summary(m):
	s = m.summary(20)
	s = unicode(s, 'utf-8')
	s = s.replace('\n', '')
	s = s.replace('\r', '')
	s = s.replace('\t', '')
	s = s.strip()
	return s

def list_get(list, f):
	for l in list:
		if l[0] == f:
			return l

	return None

def get_sent_time(m):
	t = m.time
	#assert(len(t) == 7)
	t = (t[0], t[1], t[2], t[3], t[4], t[5], t[6], 0, 0)
	return time.mktime(t)
'''
class MessageManagerBase:
	received_path = ''
	received_info_path = ''
	personal_path = ''
	personal_info_path = ''
	sent_path = ''
	sent_info_path = ''
	draft_path = ''
	draft_info_path = ''

	def __init__(self):
		if self.received_path: utils.make_dir(self.received_path)
		if self.personal_path: utils.make_dir(self.personal_path)
		if self.sent_path: utils.make_dir(self.sent_path)
		if self.draft_path: utils.make_dir(self.draft_path)

		self.received_info = []
		self.personal_info = []
		self.sent_info = []
		self.draft_info = []

		self.reload()

	def reload(self):
		self.received_info = []
		self.personal_info = []
		self.sent_info = []
		self.draft_info = []

		try:
			if self.received_info_path:
				for l in file(self.received_info_path):
					l = l.strip()
					if not l:
						continue

					tokens = l.split(',', 6)
					if len(tokens) != 7:
						continue

					filename, t, read, ems, number, report, summary = tokens
					summary = unicode(summary, 'utf-8')
					try:
						t = int(t)
						ems = int(ems)
						read = int(read)
						report = int(report)
					except:
						continue

					if os.path.exists(filename):
						self.received_info.append((filename, t, read, ems, number, report, summary))
		except IOError:
			pass

		try:
			if self.personal_info_path:
				for l in file(self.personal_info_path):
					l = l.strip()
					if not l:
						continue

					tokens = l.split(',', 6)
					if len(tokens) != 7:
						continue

					filename, t, sent, ems, number, report, summary = tokens
					if not os.path.exists(filename):
						continue

					summary = unicode(summary, 'utf-8')
					try:
						t = int(t)
						sent = int(sent)
						ems = int(ems)
						report = int(report)
					except:
						continue

					if os.path.exists(filename):
						self.personal_info.append((filename, t, sent, ems, number, report, summary))
		except IOError:
			pass

		try:
			if self.sent_info_path:
				for l in file(self.sent_info_path):
					l = l.strip()
					if not l:
						continue

					tokens = l.split(',', 6)
					if len(tokens) != 7:
						continue

					filename, t, sent, ems, number, report, summary = tokens
					if not os.path.exists(filename):
						continue

					summary = unicode(summary, 'utf-8')
					try:
						t = int(t)
						sent = int(sent)
						ems = int(ems)
						report = int(report)
					except:
						continue

					if os.path.exists(filename):
						self.sent_info.append((filename, t, sent, ems, number, report, summary))
		except IOError:
			pass

		try:
			if self.draft_info_path:
				for l in file(self.draft_info_path):
					l = l.strip()
					if not l:
						continue

					tokens = l.split(',', 6)
					if len(tokens) != 7:
						continue

					filename, t, sent, ems, number, report, summary = tokens
					if not os.path.exists(filename):
						continue

					summary = unicode(summary, 'utf-8')
					try:
						t = int(t)
						sent = int(sent)
						ems = int(ems)
						report = int(report)
					except:
						continue

					if os.path.exists(filename):
						self.draft_info.append((filename, t, sent, ems, number, report, summary))
		except IOError:
			pass

		if self.received_path:
			for f,dummy,dummy in utils.get_file_lists(self.received_path):
				path = os.path.normpath(self.received_path + f)

				if not list_get(self.received_info, path):
					m = SmsMessage()
					m.load(path)
					ems = 0
					if len(m.get_pictures()) + len(m.get_melodies()) > 0:
						ems = 1
					report = 0
					if m.type == 'status report':
						report = 1
					self.received_info.append((path, get_sent_time(m), m.read, ems, m.number, report, get_summary(m)))
					del m

		if self.personal_path:
			for f,dummy,dummy in utils.get_file_lists(self.personal_path):
				path = os.path.normpath(self.personal_path + f)

				if not list_get(self.personal_info, path):
					m = SmsMessage()
					m.load(path)
					ems = 0
					if len(m.get_pictures()) + len(m.get_melodies()) > 0:
						ems = 1
					report = 0
					if m.type == 'status report':
						report = 1
					self.personal_info.append((path, 0, m.sent, ems, m.number, report, get_summary(m)))
					del m

		if self.sent_path:
			for f,dummy,dummy in utils.get_file_lists(self.sent_path):
				path = os.path.normpath(self.sent_path + f)

				if not list_get(self.sent_info, path):
					m = SmsMessage()
					m.load(path)
					ems = 0
					if len(m.get_pictures()) + len(m.get_melodies()) > 0:
						ems = 1
					report = 0
					if m.type == 'status report':
						report = 1
					self.sent_info.append((path, 0, m.sent, ems, m.number, report, get_summary(m)))
					del m

		if self.draft_path:
			for f,dummy,dummy in utils.get_file_lists(self.draft_path):
				path = os.path.normpath(self.draft_path + f)

				if not list_get(self.draft_info, path):
					m = SmsMessage()
					m.load(path)
					ems = 0
					if len(m.get_pictures()) + len(m.get_melodies()) > 0:
						ems = 1
					report = 0
					if m.type == 'status report':
						report = 1
					self.sent_info.append((path, 0, m.sent, ems, m.number, report, get_summary(m)))
					del m
		self.save_infos()

	def save_infos(self):
		if self.received_info_path:
			f = open(self.received_info_path, 'w')
			for data in self.received_info:
				file, t, read, ems, number, report, summary = data
				f.write('%s,%d,%d,%d,%s,%d,%s\n' % (file, t, read, ems, number, report, summary.encode('utf-8')))

		if self.personal_info_path:
			f = open(self.personal_info_path, 'w')
			for data in self.personal_info:
				file, t, sent, ems, number, report, summary = data
				f.write('%s,%d,%d,%d,%s,%d,%s\n' % (file, t, sent, ems, number, report, summary.encode('utf-8')))

		if self.sent_info_path:
			f = open(self.sent_info_path, 'w')
			for data in self.sent_info:
				file, t, sent, ems, number, report, summary = data
				f.write('%s,%d,%d,%d,%s,%d,%s\n' % (file, t, sent, ems, number, report, summary.encode('utf-8')))

		if self.draft_info_path:
			f = open(self.draft_info_path, 'w')
			for data in self.draft_info:
				file, t, sent, ems, number, report, summary = data
				f.write('%s,%d,%d,%d,%s,%d,%s\n' % (file, t, sent, ems, number, report, summary.encode('utf-8')))

	#0 = received, 1 = personal(out), 2 = sent, 3 = draft
	def insert_msg(self, m, boxtype=0):

		if 0 == boxtype:
			path = self.received_path
			info = self.received_info
		elif 1 == boxtype:
			path = self.personal_path
			info = self.personal_info
		elif 2 == boxtype:
			path = self.sent_path
			info = self.sent_info
		elif 3 == boxtype:
			path = self.draft_path
			info = self.draft_info
		else:
			pass
		if len(info) >= config.message_entry_max:
			import basemodel
			raise basemodel.StorageFullError, 'Storage Full'

		i = 0
		while True:
			filename = path + '%08d' % i
			if not os.path.exists(filename):
				break

			i += 1
			continue

		m.filename = os.path.normpath(filename)
		m.save()
		ems = 0
		if len(m.get_pictures()) + len(m.get_melodies()) > 0:
			ems = 1

		report = 0
		if m.type == 'status report':
			report = 1

		if 0 == boxtype:#received
			info.insert(0, (m.filename, get_sent_time(m), m.read, ems, m.number, report, get_summary(m)))
		elif 1 == boxtype:#out
			info.insert(0, (filename, 0, m.sent, ems, m.number, report, get_summary(m)))
		elif 2 == boxtype:#sent
			info.insert(0, (filename, 0, m.sent, ems, m.number, report, get_summary(m)))
		elif 3 == boxtype:#draft
			info.insert(0, (filename, 0, m.sent, ems, m.number, report, get_summary(m)))
		else:
			pass
		self.save_infos()

	def remove_msg(self, m):
		if self.received_path:
			if m.filename.startswith(self.received_path):
				l = list_get(self.received_info, m.filename)
				self.received_info.remove(l)
		if self.personal_path:
			if m.filename.startswith(self.personal_path):
				l = list_get(self.personal_info, m.filename)
				self.personal_info.remove(l)

		if self.sent_path:
			if m.filename.startswith(self.sent_path):
				l = list_get(self.sent_info, m.filename)
				self.sent_info.remove(l)
		if self.draft_path:
			if m.filename.startswith(self.draft_path):
				l = list_get(self.draft_info, m.filename)
				self.draft_info.remove(l)

		utils.remove_file(m.filename)
		self.save_infos()

	def count(self):
		return len(self.received_info)

	def count_unread(self):
		count = 0
		for file, t, read, ems, number, report, summary in self.received_info:
			if not read:
				count += 1

		return count

	def count_personal(self):
		return len(self.personal_info)

	def count_sent(self):
		return len(self.sent_info)

	def count_draft(self):
		return len(self.draft_info)

	def count_allsms(self):
		return 	self.count()+self.count_sent()+self.count_draft()+self.count_personal()

	def load_message(self, filename):
		for i, info in enumerate(self.received_info):
			if info[0] == filename:
				file, t, read, ems, number, report, summary = info
				self.received_info[i] = (file, t, 1, ems, number, report, summary)
				self.save_infos()

		m = SmsMessage()
		m.load(filename)
		if not m.read:
			m.read = True
			m.save()
		return m

	def load_message_for_type(self, filename):
		m = SmsMessage()
		m.load(filename)
		return m

	def get_received_messages(self):
		def cmp_func(i1, i2):
			#assert len(i1) == 7
			#assert len(i2) == 7

			#최근 시간이 위로 올라오게
			return cmp(i2[1], i1[1])

		self.received_info.sort(cmp_func)
		return self.received_info

	def get_sent_messages(self):
		return self.sent_info

	def get_draft_messages(self):
		return self.draft_info

	def get_personal_messages(self):
		return self.personal_info

	def remove_all_sent(self):
		utils.remove_dir(self.sent_path)
		self.sent_info = []
		self.save_infos()
	def remove_all_draft(self):
		utils.remove_dir(self.draft_path)
		self.draft_info = []
		self.save_infos()

	def remove_all_received(self):
		utils.remove_dir(self.received_path)
		self.received_info = []
		self.save_infos()

	def remove_all_saved(self):
		utils.remove_dir(self.personal_path)
		self.personal_info = []
		self.save_infos()

	def remove_all(self):
		self.remove_all_received()
		self.remove_all_saved()
		self.remove_all_sent()
		self.remove_all_draft()

	def get_inbox_list(self):
		import uiconfig
		_list = []
		boxtype = 'sms'
		date = 0
		title = ''
		icon = ''
		focus = 0
		for file,t,read,ems,number,report,summary in self.get_received_messages():
			date = t
			if number:
				from phonedb import phonedb
				number = phonedb.get_name(number)
				title = number
			else:
				title = summary

			if ems:
				if read:
					icon = uiconfig.list_icon_ems_read
				else:
					icon = uiconfig.list_icon_ems_new
			elif report:
				if read:
					icon = uiconfig.list_icon_sms_notify_read
				else:
					icon = uiconfig.list_icon_sms_notify_new
			else:
				if read:
					icon = uiconfig.list_icon_sms_read
				else:
					icon = uiconfig.list_icon_sms_new
			_list.append(('sms', date, title, icon, focus))
			focus += 1
		return _list
'''
class MessageManagerBase_KT:
	def __init__(self):
		self.received_path = ''
		self.received_info_path = ''
		self.saved_path = ''
		self.saved_info_path = ''
		self.sent_path = ''
		self.sent_info_path = ''
		self.draft_path = ''
		self.draft_info_path = ''

		self.received_info = []
		self.saved_info = []
		self.sent_info = []
		self.draft_info = []

	def getReceivedPath(self):
		return self.received_path

	def setReceivedPath(self, received_path):
		self.received_path = received_path

	def getReceivedInfoPath(self):
		return received_info_path

	def setReceivedInfoPath(self, received_info_path):
		self.received_info_path = received_info_path

	def getSavedPath(self):
		return self.saved_path

	def setSavedPath(self, saved_path):
		self.saved_path = saved_path

	def getSavedInfoPath(self):
		return saved_info_path

	def setSavedInfoPath(self, saved_info_path):
		self.saved_info_path = saved_info_path

	def getSentPath(self):
		return self.sent_path

	def setSentPath(self, sent_path):
		self.sent_path = sent_path

	def getSentInfoPath(self):
		return sent_info_path

	def setSentInfoPath(self, sent_info_path):
		self.sent_info_path = sent_info_path

	def getDraftPath(self):
		return self.draft_path

	def setDraftPath(self, draft_path):
		self.draft_path = draft_path

	def getDraftInfoPath(self):
		return draft_info_path

	def setDraftInfoPath(self, draft_info_path):
		self.draft_info_path = draft_info_path
		
	def reload(self):
		self.received_info = []
		self.saved_info = []
		self.sent_info = []
		self.draft_info = []

		try:
			if self.received_info_path:
				for messageInfo in file(self.received_info_path):
					messageInfo = messageInfo.strip()
					if not messageInfo:
						continue

					tokens = messageInfo.split('|')
					if os.path.exists(tokens[0]):
						self.received_info.append(tokens)
		except IOError:
			pass

		try:
			if self.saved_info_path:
				for messageInfo in file(self.saved_info_path):
					messageInfo = messageInfo.strip()
					if not messageInfo:
						continue

					tokens = messageInfo.split('|')
					if os.path.exists(tokens[0]):
						self.saved_info.append(tokens)
		except IOError:
			pass

		try:
			if self.sent_info_path:
				for messageInfo in file(self.sent_info_path):
					messageInfo = messageInfo.strip()
					if not messageInfo:
						continue

					tokens = messageInfo.split('|')
					if os.path.exists(tokens[0]):
						self.sent_info.append(tokens)
		except IOError:
			pass

		try:
			if self.draft_info_path:
				for messageInfo in file(self.draft_info_path):
					messageInfo = messageInfo.strip()
					if not messageInfo:
						continue

					tokens = messageInfo.split('|')
					if os.path.exists(tokens[0]):
						self.draft_info.append(tokens)
		except IOError:
			pass

		if config.mms_debug:
			print 'RECEIVED INFO ===================='
			print self.received_info
			print 'SAVED INFO ===================='	
			print self.saved_info
			print 'SENT INFO ===================='		
			print self.sent_info
			print 'DRAFT INFO ===================='
			print self.draft_info
		
	def save_infos(self, boxType=None):
		if boxType == IN_BOX:
			f = open(self.received_info_path, 'w')
			for data in self.received_info:
				f.write('|'.join(data))
				f.write(mms_net_define.CRLF)
			f.close()
		elif boxType == SENT_BOX:
			f = open(self.sent_info_path, 'w')
			for data in self.sent_info:
				f.write('|'.join(data))
				f.write(mms_net_define.CRLF)
			f.close()
		elif boxType == OUT_BOX:
			f = open(self.saved_info_path, 'w')
			for data in self.saved_info:
				f.write('|'.join(data))
				f.write(mms_net_define.CRLF)
			f.close()
		elif boxType == DRAFT_BOX:
			f = open(self.draft_info_path, 'w')
			for data in self.draft_info:
				f.write('|'.join(data))
				f.write(mms_net_define.CRLF)
			f.close()
		else:
			print 'ERROR in save_infos'

	def saveReceivedMessage(self, receivedMessage):
		path = self.received_path
		info = self.received_info

		if len(info) >= config.message_entry_max:
			#import basemodel
			#raise basemodel.StorageFullError, 'Storage Full'
			return False

		smsInfoHandler = SmsInfoHandler()

		smsInfoHandler.copyTempToNormal(path, receivedMessage.getSipAbsMessagePath())
		smsInfoHandler.setSmsMessageType(receivedMessage.mmsMessageHandler.mmsHeaderHandler.getMmsMessageType())
		smsInfoHandler.setMessageTime(receivedMessage.mmsMessageHandler.mmsHeaderHandler.getMmsDate())
		smsInfoHandler.setIsRead(mms_net_define.NO)
		smsInfoHandler.setSender(receivedMessage.mmsMessageHandler.mmsHeaderHandler.getMmsFrom())	
		smsInfoHandler.setReceiver(receivedMessage.mmsMessageHandler.mmsHeaderHandler.getMmsTo())	
		smsInfoHandler.setSmsSubject(receivedMessage.mmsMessageHandler.mmsHeaderHandler.getMmsSubject())
		
		if mms_net_define.DEBUG_MMS_NET:
			smsInfoHandler.printVar(1)
		
		info.insert(0, smsInfoHandler.makeInfoList())

		self.save_infos(IN_BOX)

		return True
		
	def insert_msg(self, m, boxType=0):
		if IN_BOX == boxType:
			path = self.received_path
			info = self.received_info
		elif OUT_BOX == boxType:
			path = self.saved_path
			info = self.saved_info
		elif SENT_BOX == boxType:
			path = self.sent_path
			info = self.sent_info
		elif DRAFT_BOX == boxType:
			path = self.draft_path
			info = self.draft_info
		else:
			pass

		if len(info) >= config.message_entry_max:
			import basemodel
			raise basemodel.StorageFullError, 'Storage Full'

		smsInfoHandler = SmsInfoHandler()

		# m ==> SmsIsmcMessage_Send
		smsInfoHandler.copyTempToNormal(path, m.getSipAbsMessagePath())
		smsInfoHandler.setMessageTime(m.ismcMessageHandler.makeTimeStamp())
		smsInfoHandler.setIsRead(mms_net_define.NO)
		smsInfoHandler.setReplyTo(m.getSipReplyTo())	
		smsInfoHandler.setReceiver(m.getTargetFullName())	
		smsInfoHandler.setSmsMessageType(m.getSipContentType())
		smsInfoHandler.setSmsSubject(m.ismcMessageHandler.getIsmcSubject())
		
		if mms_net_define.DEBUG_MMS_NET:
			smsInfoHandler.printVar(1)
		
		info.insert(0, smsInfoHandler.makeInfoList())

		self.save_infos(boxType)

	def remove_msg(self, smsInfoHandler):
		filename = smsInfoHandler.getFilename()

		boxType = smsInfoHandler.getBoxType()
		if boxType == IN_BOX:
			l = list_get(self.received_info, filename)
			if l:
				self.received_info.remove(l)
			else:
				print 'ERROR in list_get()'
		elif boxType == SENT_BOX:
			l = list_get(self.sent_info, filename)
			if l:
				self.sent_info.remove(l)
			else:
				print 'ERROR in list_get()'
		elif boxType == OUT_BOX:
			l = list_get(self.saved_info, filename)
			if l:
				self.saved_info.remove(l)
			else:
				print 'ERROR in list_get()'
		elif boxType == DRAFT_BOX:
			l = list_get(self.draft_info, filename)
			if l:
				self.draft_info.remove(l)
			else:
				print 'ERROR in list_get()'

		utils.remove_file(filename)
		
		self.save_infos(boxType)

	def count_received(self):
		return len(self.received_info)

	def count_unread(self):
		count = 0
		for info in self.received_info:
			if info[2] == mms_net_define.NO: 
				count += 1
		return count

	def count_saved(self):
		return len(self.saved_info)

	def count_sent(self):
		return len(self.sent_info)

	def count_draft(self):
		return len(self.draft_info)

	def count_allsms(self):
		return 	self.count_received()+self.count_sent()+self.count_draft()+self.count_saved()

	def load_message(self, filename, boxType=IN_BOX):
		infos = None
		if boxType == IN_BOX:
			infos = self.received_info
		elif boxType == OUT_BOX:
			infos = self.saved_info
		elif boxType == SENT_BOX:
			infos = self.sent_info
		elif boxType == DRAFT_BOX:
			infos = self.draft_info

		selectedInfo = ''
		
		for i, info in enumerate(infos):
			if info[0] == filename:
				selectedInfo = info
				smsInfoHandler = SmsInfoHandler(info)
				smsInfoHandler.setIsRead(mms_net_define.YES)
				infos[i] = smsInfoHandler.makeInfoList()
				self.save_infos(boxType)
				break

		self.ismcMessageHandler = IsmcMessageHandler()
		self.ismcMessageHandler.parse(filename)

		return self.ismcMessageHandler

	def cmp_func(self, a, b):
		return cmp(b[1], a[1])

	def getReceivedInfo(self):
		self.received_info.sort(self.cmp_func)
		return self.received_info

	def getSentInfo(self):
		self.sent_info.sort(self.cmp_func)
		return self.sent_info

	def getSavedInfo(self):
		self.saved_info.sort(self.cmp_func)
		return self.saved_info

	def getDraftInfo(self):
		self.draft_info.sort(self.cmp_func)
		return self.draft_info

	def remove_all_received(self):
		utils.remove_dir(self.received_path)
		self.received_info = []
		self.save_infos(IN_BOX)

	def remove_all_sent(self):
		utils.remove_dir(self.sent_path)
		self.sent_info = []
		self.save_infos(SENT_BOX)

	def remove_all_saved(self):
		utils.remove_dir(self.saved_path)
		self.saved_info = []
		self.save_infos(OUT_BOX)

	def remove_all_draft(self):
		utils.remove_dir(self.draft_path)
		self.draft_info = []
		self.save_infos(DRAFT_BOX)

	def remove_all(self):
		self.remove_all_received()
		self.remove_all_saved()
		self.remove_all_sent()
		self.remove_all_draft()

'''
class SMSManager(MessageManagerBase):
	draft_path = config.sms_draft_path
	draft_info_path = config.sms_draft_info_path
	sent_path = config.sms_sent_path
	sent_info_path = config.sms_sent_info_path
	received_path = config.sms_received_path
	received_info_path = config.sms_received_info
	personal_path = config.sms_saved_path
	personal_info_path = config.sms_personal_info
'''
class SMSManager_KT(MessageManagerBase_KT):
	def __init__(self):
		MessageManagerBase_KT.__init__(self)

		utils.make_dir(config.sms_received_path_KT)
		self.setReceivedPath(config.sms_received_path_KT)
		self.setReceivedInfoPath(config.sms_received_info_KT)

		utils.make_dir(config.sms_saved_path_KT)
		self.setSavedPath(config.sms_saved_path_KT)
		self.setSavedInfoPath(config.sms_saved_info_KT)

		utils.make_dir(config.sms_sent_path_KT)
		self.setSentPath(config.sms_sent_path_KT)
		self.setSentInfoPath(config.sms_sent_info_path_KT)

		utils.make_dir(config.sms_draft_path_KT)
		self.setDraftPath(config.sms_draft_path_KT)
		self.setDraftInfoPath(config.sms_draft_info_path_KT)

		self.reload()


smsmgr = SMSManager_KT()
import mmsmanager