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 ''