Newer
Older
Import / projects / LGN-IP3870 / t / orig / syncHandler.py

from roxiadebug import *
import syncML
from setting import setting

NAME, GROUP, PRIORITY, HOME, MOBILE, OFFICE, SPEED, EMAIL, MELODY, SNAPSHOT, CDATE, MDATE = range(12)
# nab-syncml.ktann.com /
class SyncML:
	def __init__(self):
		self.synccode = '200' # 200 two way / 203 REFRESH_FROM_CLIENT 올리기 / 205 REFRESH_FROM_SERVER 내려받기
		self.userid = ''
		self.userpwd = ''
		self.terminal = ''
		self.filepath = '/usr/local/lgvp/sync'
#		dict ={'synccode':'', 'userid':'','userpwd':'','terminal':'', 'filepath':'/usr/local/lgvp/sync'}
#		self.keys = dict.keys()
		self.set_user_type()
		self.deleted_db = []	

	def get_image(self):
		syncML.download_img()
		
	def put_image(self):
		syncML.upload_img()

	
	def sync_start_phonebook(self): 
		roxia_event('SyncML.start_phonebook')
		if not self.load_phonebook():
			print '[SYNC] load DB: fail'
			return False
		print '[SYNC] load DB: success'
		
		#import os
		#os.system('cp sync/addressbook_ann sync/addressbook_ann_load')
		
		# result : 1 = error 0: OK
		setting.set_sync_complete(1) # complete false
		result = syncML.start_sync()
				

	# 이 함수는 성공이든 실패든, syncDB를 다운 받는다. 
	def get_syncResult(self):
		setting.set_sync_complete(0) # complete True
		result =syncML.get_result()
		if result == 0: ##################### cookies 인증 실패 후에도 성공 event를 받음;;
			print '[SYNC] sync result: success'
			self.down_phonebook()
			return result
		elif result == 1:
			print '[SYNC] sync result: ING'
			return result	
		else: # -1
			print '[SYNC] sync result: fail'
			self.down_phonebook()
			return result
	
		
	def sync_stop(self):
		roxia_event('SyncML.stop_sync')
		syncML.stop_sync()

                   
	def sync_start_infomation(self):
		roxia_event('SyncML.start_information')
		syncML.start_sync()

	def load_phonebook(self):
		# MMI phonenumber.txt --> sync/phonebook 으로 변환
		import struct
		self.db = [] # syncML common DB
		self.deleted_db = []	# syncML deleted DB

		from phonedb import phonedb
		# KA...for test
		#phonedb.sort_cdate()
		
		#fp = open('phonenumber_test.txt','w')
		#for item in phonedb.db:
		#	fp.write('\t'.join(item) + '\n')
		#fp.close()
		

		for item in phonedb.db:
			#print 'ka.............phonedb.db=', phonedb.db, len(phonedb.db)
			# syncML common DB
			# ---      v       n        g          p          h        m       c          e        cd    md ----#
			#db = '%s%-40s\0%-40s\0%-1s\0%-30s\0%-30s\0%-30s\0%-30s\0%-14s\0%-14s\0\r\n' % ('1', \
			#item[NAME], item[GROUP], item[PRIORITY], item[HOME], item[MOBILE], item[OFFICE], \
			#item[EMAIL], item[CDATE], item[MDATE])
			#item[NAME]
			name= unicode(item[NAME], 'utf-8').encode('euc-kr')		
			from groupdb import groupdb
			index = item[GROUP]
			group = groupdb.get_name(int(index))
			group = unicode(group, 'utf-8').encode('euc-kr')
			
			valid = struct.pack('1s', '1')
			#name = struct.pack('31s', item[NAME])
			name = struct.pack('31s', name)
			group = struct.pack('31s', group)
			priority = struct.pack('2s', item[PRIORITY])
			home = struct.pack('31s', item[HOME])
			mobile = struct.pack('31s', item[MOBILE])
			office = struct.pack('31s', item[OFFICE])
			email = struct.pack('65s', item[EMAIL])
			image = struct.pack('129s', '')
			cdate = struct.pack('18s', item[CDATE])
			mdate = struct.pack('15s', item[MDATE])
			crlf = struct.pack('2s', '\r\n')

			db= valid + name+group+priority+home+mobile+office+email+image + cdate+mdate+crlf
			self.db.append(db)

			# syncML deleted DB
			deleted_db = item[CDATE], item[SPEED], item[MELODY], item[SNAPSHOT]
			self.deleted_db.append(deleted_db) 
		
		#print 'ka... syncdb=', self.db
		#print 'ka...deleted syncdb=', self.deleted_db		

		# DB 를 300개 size로 맞춰준다. 

		for i in range(500):
			if len(self.db) < 500:
				db = struct.pack('385s', '') + struct.pack('2s', '\r\n')
				self.db.append(db)
			else:
				break;

		fp = open('sync/addressbook_ann','w')
		for item in self.db:
			#fp.write(item+'\n')
			fp.write(item)
		fp.close()

		# for delete item
		fp = open('sync/addressbook_del','w')
		for item in self.deleted_db:
			fp.write('\t'.join(item) + '\n')	
		fp.close()	
		
		# for test
		#import os
		#os.system('cp sync/addressbook_ann sync/addressbook_test')
		return True
			
	def down_phonebook(self):
		# sync/phonebook 을 --> MMI phonenumber.txt 으로 변환
		self.db=[]

		for line in file('sync/addressbook_ann'):
			#NULL값으로 채워지는 경우가 존대 --> null이면 return
			value = line[:1]
			if value != '1':
				#print 'ka.......########### finish DB'
				continue
			else:
				pass

			item = []
#			try:
			line = line[1:]

			name = line[:31].strip('\x00')
			name = unicode(name, 'euc-kr').encode('utf-8')
			item.append(name)
			
			line = line[31:]
			
			group = line[:31].strip('\x00')
			group = unicode(group, 'euc-kr').encode('utf-8')
			from groupdb import groupdb
			group_index = groupdb.get_group_index(group)			
			item.append(str(group_index))
			
			line = line[31:]

			priority = line[:2].strip('\x00')
			if priority not in ('0', '1', '2'):
				priority = '0'
			item.append(priority)
			
			line = line[2:]
			item.append(line[:31].strip('\x00'))
			line = line[31:]
			item.append(line[:31].strip('\x00'))
			line = line[31:]
			item.append(line[:31].strip('\x00'))
			line = line[31:]
			# SPEED
			item.append('')
			# EMAIL
			item.append(line[:65].strip('\x00'))
			line = line[65:]
			#item.append(line[:129].strip('\x00'))
			line = line[129:]
			# deleted data --SPEED, MELODY, SNAPSHOT
			
			item.append('')
			item.append('')
			
			item.append(line[:18].strip('\x00')) # cdate
			line = line[18:]
			item.append(line[:15].strip('\x00')) # mdate
			
			self.db.append(item)
#			except:
#				pass
		#print 'ka........... download db=', self.db

		# syncML deleted DB add
		self.restore_deleteDB()

	def restore_deleteDB(self):
		# check deleteDB		
		self.deleted_db = self.load_deleted_db()
		#print 'ka..........######### deleted_db=', self.deleted_db
		if self.deleted_db:
			for item in self.db: #sync result DB 안에서 검색 - 생성일이 같은 놈이 존재하면 add
				for d_item in self.deleted_db:
					if item[CDATE] == d_item[0]:
						item[SPEED] = d_item[1]
						item[MELODY] = d_item[2]
						item[SNAPSHOT] = d_item[3]
	
		self.save_to_phoneDB()

	def load_deleted_db(self):
		self.deleted_db = []
		for line in file('sync/addressbook_del'):
			#try:
			item = line[:-1].split('\t')
			self.deleted_db.append(item)
			#except:
			#	pass
		return self.deleted_db

	def save_to_phoneDB(self):
		fp = open('phonenumber.txt','w')
		for item in self.db:
			fp.write('\t'.join(item) + '\n')
		fp.close()
		
		from phonedb import phonedb
		phonedb.load_db()

	def set_user_type(self):
		from vdcisetting import vdci_setting
		value = vdci_setting.tel_num
		fp = open('syncpara.cfg','r')
		data = []
		for line in fp.readlines():
			if line.find('USERID') >= 0:
				line = "[USERID]%s\n"%value
			if line.find('USERPWD') >= 0:
				line = "[USERPWD]%s\n"%value
			data.append(line)
		fp.close()
		
		fp = open('syncpara.cfg','w')
		for line in data:
			fp.write(line)
		fp.close()
		
	def set_sync_type(self, index):
		if index == 0:
			value = '200'
		elif index == 1:
			value = '203'
		else:
			value = '205'
			
		fp = open('syncpara.cfg','r')
		data = []
		for line in fp.readlines():
			if line.find('COOKIE') >= 0:
				cookies = self.load_cookies()
				line = "[COOKIE]%s\n"%cookies
			if line.find('SYNCCODE') >= 0:
				line = "[SYNCCODE]%s\n"%value
			data.append(line)
		fp.close()

		fp = open('syncpara.cfg','w')
		for line in data:
			fp.write(line)
		fp.close()
		
	def get_sync_type(self):
		code = '200'
			
		fp = open('syncpara.cfg','r')
		for line in fp.readlines():
			if line.find('SYNCCODE') >= 0:
				code = line.split(']')[1]
		fp.close()
		print '[SYNC] get sync code=', code
		return code
		

	def load_cookies(self):
		fname = config.SYNC_COOKIE_FILE
		import os
		if os.path.exists(fname) == False:
			return ''

		'''
		fp = open(fname,'r')		
		validate =''
		domain = ''
		for line in fp.readlines():
			if line.find('SSOValidate') >= 0:
				startPoint = line.find('SSOValidate') + 12 #SSOValidate=
				line = line[startPoint:]				
				endPoint = line.find(';')				
				validate = line[:endPoint]
				
			if line.find('domain') >= 0: 
				startPoint = line.find('domain') + 7 #domain=.ktann.com
				line = line[startPoint:] # endPoint
				endPoint = line.find(';')
				domain = line[:endPoint]	
		fp.close()		
		newData = validate+ ';' + domain		
		return newData
		'''
		
		fp = open(fname,'r')
		# 파일을 열어서 mcookies /ccookies 가 나눠진 SIP
		data = []
		for line in fp.readlines():
			if line.find('mcookie') >= 0:
				tmp = line.split('"')
				data = tmp[1]+tmp[3]

				tmp = data.split('|')
				newData = ''.join(tmp)		

			else:
				tmp = line.split('|')
				newData = ''.join(tmp)
		return newData


	def set_sync_server(self, value):
		fp = open('/usr/local/lgvp/slib.cfg','r')
		data = []
		for line in fp.readlines():
			if line.find('HostDomain') >= 0:
				server = line.split(']')[1]
				line = "[HostDomain]%s\n"%value
			data.append(line)
		fp.close()
		
		fp = open('/usr/local/lgvp/slib.cfg','w')
		for line in data:
			fp.write(line)
		fp.close()

	def get_sync_server(self):
		fp = open('/usr/local/lgvp/slib.cfg','r')
		server = ''
		for line in fp.readlines():
			if line.find('HostDomain') >= 0:
				server = line.split(']')[1].strip()
		fp.close()
		return server
	

	# class가 import 되는 순간에 불리워 진다. (__init__)
		'''
	def __setattr__(self, name, value):
		print 'ka.....name=%s, value=%s'%(name, value)
		v = self.__dict__.get(name, 'none')
		print 'ka....v=', v
		self.__dict__[name] = value
		if v != 'none' and v != value:
			print key, v, value
#			self.save()
#		elif v != 'none':
#			#print key, v, value
#			pass


	def _save(self):
		#text = text.upper()
		f_name = 'syncpara.cfg'
		fp = open(f_name, 'w')
		for name, value in self.__dict__.items():
			fp.write("[%s]%s\n" % (name, repr(value)))

		self._save_tag = 0
		return False
	'''


sync = SyncML()