Newer
Older
Import / projects / LGN-IP3870 / t / new / calldb.py
import config, utils
from phonedb import phonedb, NamedListMetaClass

CALL_DIALED, CALL_MISSED, CALL_RECEIVED = range(3)

class CallLogItem(list):
	__metaclass__ = NamedListMetaClass
	members = 'number time duration video_time video_duration call_type viewed CLIP_name numberofcalls numberofvcalls'
	def __init__(self, args):
		if len(args) == 1:
			list.__init__(self, *args)
		else:
			list.__init__(self, args)

class CallDB:
	def __init__(self, type, file, size):
		self.type = type
		self.file = file
		self.size = size
		self.db = []
		try:
			self.load_db()
		except:
			pass

	def load_db(self):
		if not self.file: return
		db = []
		for line in file(self.file):
			#ka...CLIP name
			#item[1:] = [int(x) for x in item[1:]]
			#db.append(CallLogItem(item + [1, 0]))
			item = line.split(',')
			item[1:7] = [int(x) for x in item[1:7]] # 1~7
			if len(item) == 7: #old DB
				item.append('None') # None 값을 문자열로 DB에 추가
			item = item[:8] #0~8
			db.append(CallLogItem(item + [1, 0]))
		self.db = db

	def reset(self):
		self.db = []
		self.save_db()

	def save_db(self):
		if not self.file: return
		fp = open(self.file, 'w')
		for item in self.db:
			try:
				if not item[7]:
					item[7] = 'None' # None 값을 문자열로 DB에 적는다. 
				s = "%s,%d,%d,%d,%d,%d,%d,%s,\n" % tuple(item[:-2])
				fp.write(s)
			except:
				print item
				print '(====================== callog save error ====================)'

	def get_count(self, number):
		count = 0
		for item in self.db:
			if number == item[0]:
				count += 1
		return count


	def get_list(self):
		calls = []
		
		find = phonedb.find
		get_item = phonedb.get_item
		for i, item in enumerate(self.db):
			
			number = item[0]
			calltype = item[5]
			CLIP_name = item[7]
			if item[3]:
				calltime = item[3]	# videocall
			else:
				calltime = item[1]	# voicecall
			if CLIP_name != 'None':
				name = CLIP_name +  '(' + utils.conv_telnum(number) + ')'
				snapshot = ''
			else:
				name = utils.conv_telnum(number)
				snapshot = ''
			calls.append((name, calltype, calltime, snapshot, i))

		'''
	def get_list(self):
		calls = []
		
		find = phonedb.find
		get_item = phonedb.get_item
		for i, item in enumerate(self.db):
			number = item[0]
			calltype = item[5]
			CLIP_name = item[7]
			if item[3]:
				calltime = item[3]	# videocall
			else:
				calltime = item[1]	# voicecall
			if CLIP_name != 'None':
				name = CLIP_name
			else:
				phonedb_index = find(number)
				if phonedb_index >= 0:
					name = get_item(phonedb_index)[0] + '(' + utils.conv_telnum(number) + ')'
					snapshot = get_item(phonedb_index)[9]
					if not name:
						name = utils.conv_telnum(number)
						snapshot = ''
				else:
					name = utils.conv_telnum(number)
					snapshot = ''
			
			calls.append((name, calltype, calltime, snapshot, i))
		'''
			
		def sort():
			def sort_func(x, y):
				xname = int(x[2])
				yname = int(y[2])
				return -(cmp(xname, yname))
			calls.sort(sort_func)
		sort()
		return calls


	def add(self, item):
		self.db.insert(0, CallLogItem(item))
		if len(self.db) > self.size:
			self.db = self.db[:self.size]
		self.save_db()

	def remove(self, index):
		if index >= 0 and index < len(self.db):
			del self.db[index]
			self.save_db()

		else:
			print 'Db remove: index is invalid: type = ', self.type, 'db size', len(self.db), 'index', index

	def get_detail(self, index):
		return self.db[index]

	# #### test
	def get_total_num(self):
		for i, item in enumerate(self.db):
			pass
		return i+1

class MissedCallDB(CallDB):
	def add(self, number, time, duration, vtime=0, vduration=0, CLIP_name=None):
		#org--CallDB.add(self,[number, time, 0, 0, 0, CALL_MISSED, 0, 1, 0])
		#ka...name 2006.10.24

		if time == None:
			time = 0
		if duration == None:
			duration = 0
		if vtime == None:
			vtime = 0
		if vduration == None:
			vduration = 0
			
		# CLIP_name 을 phonebook NAME으로 저장
		CLIP_name = phonedb.get_name_by_number(number)
			
		CallDB.add(self,[number, time, duration, vtime, vduration, CALL_MISSED, 0, CLIP_name, 1, 0])

class DialedCallDB(CallDB):
	def add(self, number, time, duration, vtime=0, vduration=0, CLIP_name=None):
		#org--CallDB.add(self,[number, time, duration, vtime, vduration, CALL_DIALED, 1, 1, 0])
		#ka...name 2006.10.24

		if time == None:
			time = 0
		if duration == None:
			duration = 0
		if vtime == None:
			vtime = 0
		if vduration == None:
			vduration = 0
			
		# CLIP_name 을 phonebook NAME으로 저장
		CLIP_name = phonedb.get_name_by_number(number)	

		CallDB.add(self,[number, time, duration, vtime, vduration, CALL_DIALED, 1, CLIP_name, 1, 0])

class ReceivedCallDB(CallDB):
	def add(self, number, time, duration, vtime=0, vduration=0, CLIP_name=None):
		#org--CallDB.add(self,[number, time, duration, vtime, vduration, CALL_RECEIVED, 1, 1, 0])
		#ka...name 2006.10.24

		if time == None:
			time = 0
		if duration == None:
			duration = 0
		if vtime == None:
			vtime = 0
		if vduration == None:
			vduration = 0
			
		# CLIP_name 을 phonebook NAME으로 저장
		CLIP_name = phonedb.get_name_by_number(number)

		CallDB.add(self,[number, time, duration, vtime, vduration, CALL_RECEIVED, 1, CLIP_name, 1, 0])

missed_calls = MissedCallDB('missed', 'missed.txt', config.missed_db_size)
received_calls = ReceivedCallDB('received', 'received.txt', config.received_db_size)
dialed_calls = DialedCallDB('dialed', 'dialed.txt', config.dialed_db_size)
performed_calls = dialed_calls

db_lists = {'missed':missed_calls, 'received':received_calls, 'dialed':dialed_calls, \
	CALL_MISSED:missed_calls, CALL_RECEIVED:received_calls, CALL_DIALED:dialed_calls}

def get_vcount(calltype, number):
	db = db_lists.get(calltype)
	count = 0
	db.load_db()
	for item in db.db:
		if number == item[0]:
			if int(item[4]) != 0:
				count += 1
	return count

def get_list(call):
	db = db_lists.get(call)
	if db:
		return db.get_list()
	if call == 'performed':
		return performed_calls.get_list()


	'''
def get_recent_list():
	recent_list = []
	call_history_type = 'dialed', 'missed', 'received'
	
	for i in range(3):
		sub_calllist = get_list(call_history_type[i])	# make individual list
		if len(sub_calllist):		# make total list
			for i in range(len(sub_calllist)):
				recent_list.append(sub_calllist[i])
	def sort():
		def sort_func(x, y):
			xname = x[2]
			yname = y[2]
			return -(cmp(xname, yname))	# newer time is upper
		recent_list.sort(sort_func)
	sort()
	
	mesg_detail = calldb.get_detail(call_history_type[recent_list[self.ui.get_focus()][1]], recent_list[self.ui.get_focus()][4])			
	status.dial_number = mesg_detail.number
	self.handle_call(False)
	return recent_list[0]
	'''


def add_call_log(call, *item):
	# for recent call log
	from setting import setting
	number = item[0]
	if not number == '' or not number =='anonymous':
		setting.recent_number = number
		setting.save()
	# for recent call log ==

	db = db_lists.get(call)
	if db:
		item_list = list(item)
		# anonymous 인 경우에는 '' 로 변환
		if item_list[0] =='anonymous':
			item_list[0] = ''	
		if len(item_list[0]) > config.max_phone_number:
			num = item_list[0]
			num = num[:config.max_phone_number]
			item_list[0] = num
		item = tuple(item_list)	
		db.add(*item)

def delete_db(call):
	db = db_lists.get(call)
	if db:
		db.reset()
	elif call == 'all':
		missed_calls.reset()
		received_calls.reset()
		dialed_calls.reset()
		performed_calls.reset()

def is_empty(call):
	db = db_lists.get(call)
	if db:
		return not db.db
	if call == 'all':
		return not (received_calls.db  or dialed_calls.db or missed_calls.db)

def remove_call_log(call, index):
	db = db_lists.get(call)
	if db:
		db.remove(index)
		return
	if call == 'performed':
		performed_calls.remove(index)

def save_db(call):
	db = db_lists.get(call)
	if db:
		db.save_db()

def count_db(call, number):
	db = db_lists.get(call)
	if db:
		return db.get_count(number)

def get_detail(call, index):
	db = db_lists.get(call)
	if db:
		return db.get_detail(index)
	if call == 'performed':
		return performed_calls.get_detail(index)

def set_viewed(call, number):
	db = db_lists.get(call)
	if db:
		for item in db.db:
			if item[0] == number:
				item.viewed = 1

# IdleUI 의 아이콘을 표시하기 위해 사용
def has_unread_missed_call():
	for item in missed_calls.db:
		if not item.viewed:
			return True
	return False

# eicho add 06.10.16
#detail = calldb.get_detail('dialed', 0)
def getNumber_Redial():
	index = 0
	Item_Redial = ''
	
	def Is_Number_In_TdEService(number):
		for feature_num in config.supp_feature_list :
			numbers = '%s' % number
			if numbers.startswith(feature_num):
				#print '######### calldb.number=', number, ' / featureNum=', feature_num
				#print '######### calldb.Is_Number_In_TdEService, number=', number
				return True
			#else:
				#print '######### calldb.number=', number, ' / featureNum=', feature_num
		return False
		
	db = db_lists.get('dialed')
	total_num = db.get_total_num()
	#print 'total_num is ==> ', total_num
	if total_num >= 1:
		#print 'getNumber_Redial: len(db) = ', len(db)
		for index in range(0, total_num, 1):
			Item_Redial = db.get_detail(index)
			#print '## redial index = ', index, ' / dialed number=', Item_Redial.number
			if Is_Number_In_TdEService(Item_Redial.number):
				continue
			else:
				return Item_Redial.number
	else:
		print 'getNumber_Redial: db is not valid!!!'
		
	return ''