Newer
Older
Import / projects / LGN-IP3870 / t / new / groupdb.py
# -*- encoding: koi8-r -*-

from roxiadebug import *
#from phonedb import phonedb
import runtime

INDEX, NAME, MELODY = range(3)
record = 'index', 'name', 'melody'

class NamedListMetaClass(type):
	def __init__(cls, cls_name, bases, attrs):
		# cls -> cls_name을 갖는 class
		members = attrs['members']
		member_list = members.split()
		setattr(cls, '__slots__', ())
		def property_factory(index):
			def property_get(self):
				return self[index]
			def property_set(self, v):
				self[index] = v
			return property_get, property_set
		for i, member in enumerate(member_list):
			setattr(cls, member, property(*property_factory(i)))
		super(NamedListMetaClass, cls).__init__(cls_name, bases, attrs)
	def __call__(self, *args):
		# self: class
		instance = super(NamedListMetaClass, self).__call__(args)
		return instance

class GroupItem(list):
	__metaclass__ = NamedListMetaClass
	members = 'index name melody'
	def __init__(self, args):
		if not args:
			list.__init__(self, [''] * len(self.members.split()))
		elif len(args) == 1:
			list.__init__(self, *args)
		else:
			list.__init__(self, args)
	def is_valid(self):
		return self[0] or self[1]

class GroupDB:
	def __init__(self):
		self.db = []
		try:
			self.load_db()
		except:
			pass
			
	def new_item(self, item=None):
		if item: GroupItem(item)
		return GroupItem()

	def get_item(self, i):
		return self.db[i]
		
	def is_empty(self):
		return len(self.db) == 0

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

	def set_name(self, index, name):
		item = self.db[index]
		item[NAME] = name
		self.save()

	def set_melody(self, index, path='', name=''):
		item = self.db[index]
		if path != '' and name != '':
			path = path.split('/usr/local/lgvp/')[1]
			item[MELODY] = path + name
		else:
			item[MELODY] = ''
		self.save()
	
	def check_name(self, name):
		for item in self.db:
			if name == item[NAME]:
				return False
		return True
	
	def get_group_index(self, name):
		for item in self.db:
			if name == runtime.evas.pre_parse(item[NAME]):
				return item[INDEX]
		return 0 # default group index =0

	# KA: [20080428] groupdb count members
	def get_group_len(self):
		return len(self.db)

	def get_group_total_members(self):
		num = len(self.db)
		count =[]
		for i in range(num):
			from phonedb import phonedb
			_count = phonedb.get_group_number_of_members(i)
			count.append(_count)
		return count
	# KA: [20080428] groupdb count members
	
	def get_group_list(self):
		names = []
		for item in self.db:
			names.append(item[NAME])
		return names
		
	def get_name(self, index):
		if index < 0:
			return ''
		item = self.db[index]
		return item[NAME]
		
	def get_melody(self, index):
		item = self.db[index]
		return item[MELODY]

	def get_melody_dir(self, index):
		#audio_dirs = [_('None'), _('Basic bell'), _('Sweet bell'), _('Merry bell'), _('Classic bell'), _('Effect bell'), _('Download bell'), _('Recorded bell')]
		audio_dirs = [_('None'), _('Basic bell'), _('Sweet bell'), _('Merry bell'), _('Classic bell'), _('Effect bell')]
		
		item = self.db[index]
		if item[MELODY]:

			if item[MELODY].startswith('audios/audios/recorded'):
				index = 7
			else:
				path = item[MELODY].split('audios/ring/')[1]
				if path.startswith('Basic'):
					index = 1
				elif path.startswith('Sweet'):
					index = 2
				elif path.startswith('Merry'):
					index = 3
				elif path.startswith('Classic'):
					index = 4
				elif path.startswith('Effect'):
					index = 5
				elif path.startswith('download'):
					index = 6
				else:
					index = 0
			print '[groupDB] get_melody_dir=', index
			return index
		else:
			return 0
		

	def get_melody_file(self, index):		
		item = self.db[index]
		melody_name = item[MELODY]
		slash = item[MELODY].rfind('/')
		if slash >=0:
			melody_name = item[MELODY][slash+1:]
		if config.mmi_debug: print '[groupDB] get_melody_file=', melody_name		
		#dot = melody_name.rfind('.')
		#if dot >= 0:
		#	melody_name = melody_name[:dot]
		return melody_name


	def check_index(self):
		index = []
		for item in self.db:
			index.append(int(item[INDEX]))
		index.sort()
		max_index = index[len(index)-1]
		return max_index+1
	
	def insert_item(self, name , melody):
		item = self.new_item()
		# index 중복 체크
		index = self.check_index()
		item[INDEX] = str(index)
		item[NAME] = name
		item[MELODY] = melody
		try:
			assert len(item) == 3
		except:
			try:
				import traceback
				traceback.print_exc()
			except:
				pass
			return
		self.db.append(item)
		#if item[SNAPSHOT]:
		#	snapshot = item[SNAPSHOT]
		#	item[SNAPSHOT] = ''
		#	self.update_snapshot(item, snapshot)
		self.sort()
		self.save()

	def remove(self, index):
		#assert 0 <= index < len(self.db)
		item = self.db[index]
		#if item[SNAPSHOT]:
		#	self.update_snapshot(item, '')
		del self.db[index]
		self.save()

	def sort(self):
		def sort_func(x, y):
			xname = int(x[0])
			yname = int(y[0])
			return cmp(xname, yname)
		self.db.sort(sort_func)

	def load_db(self):
		import os
		modifyed = False

		for line in file('group.txt'):
			try:
				item = line[:-1].split('\t')
				if item[MELODY] != '':
					melody_file = config.audio_root_dir + item[MELODY]
					if not os.access(melody_file, os.F_OK):
						item[MELODY] = ''
						modifyed = True
				self.db.append(item)
			except:
				pass
		self.sort()
		if modifyed==True:
			self.save()

	def valid_check(self):
		import os
		modify = False
		for item in self.db:
			if item[MELODY] != '':
				melody_file = config.audio_root_dir + item[MELODY]
				if not os.access(melody_file, os.R_OK):
					item[MELODY] = ''
					modify = True
		if modify == True:
			self.sort()
			self.save()

	def save(self):
		fp = open('group.txt','w')
		for item in self.db:
			fp.write('\t'.join(item) + '\n')

	def reset(self):		
		remains = []
		for item in self.db:
			if int(item[INDEX]) in range(config.group_minimum_db):
				remains.append(item)
		self.db = remains
		self.save()

	def __del__(self):
		pass
		#print 'phonedb destroy'


groupdb = GroupDB()
if __name__ == '__main__':	
	groupdb.save()