Newer
Older
Import / projects / LGN-IP3870 / t / orig / vmHandler.py
# -*- coding: euc-kr -*-

#-------------------------------------------------------------------------------
# Name:		vmHandler
# Purpose:	 MMI와 VM간에 사용되는 함수를 정의한다.
#
# Author:	  류호창
#
# Created:	 14-03-2008
# Copyright:   (c) LG-Nortel 2007
# Licence:	 <Ryoo Ho Chang GGU!>
#-------------------------------------------------------------------------------
import os
import socket

import vmConfig
import runtime
from runtime import mmiDebug as MD 
import config
import status
import utils
import shutil
from setting import setting 

class VmHandler:
	MSG_ITEM_LENGTH			= 12
	SOCKET_BUF_SIZE			= 2048

	# define goto target
	IDLE = 'idle'
	BACK = 'back'
	PAUSED = 'paused'
	
	MMSC = 'MMSC'
	MULTIMEDIA = 'MULTIMEDIA'
	BROWSER = 'BROWSER'
	MMI = 'MMI'
	BANKING = 'BANKING'
	

	# FBTOP
	FOREGROUND_MMI = 'fbtop 1'
	FOREGROUND_BROWSER = 'fbtop 2'
	FOREGROUND_VM = 'fbtop 3'
	
	def __init__(self):
		self.vmHandler_pid = None
		self.vmClientSocket = None
		self.vmReceveHandler = None
		self.vmPid = None
		self.vmAliveTimer = None
		self.smsPlayTimer = None
		self.with_error = False
		#self.regi_status = False
		self.runVmHandler()
		# KA: [20080522] Init info 전달 (model/swV/hwV/serialNUM/MAC)
		if self.vmReceveHandler:
			self.setTerminalInitInformation()
		# KA: [20080522] Init info 전달 (model/swV/hwV/serialNUM/MAC) ==

		self.channel = None
		self.baseStatus = None
		self.toAddress = None
		self.contentType = None
		self.subject = None
		self.filePath = None
		self.filePathForTempMessage = '/tmp/tempMessageForSMS'
		self.replyUser = None
		
	# 처음 JVM server를 살리고 처음 한번 보내는 system info 
	def setTerminalInitInformation(self):
		import os, phonesetting
		model, hwver, swver = phonesetting.getVersion()
		serialnumber = phonesetting.getSerialNumber()
		macaddress = phonesetting.getMACNumber()
		mmsServer = setting.mms_http_server
		#mmsServer = config.MMS_HTTP_SERVER
		lang = setting.lang
      
		self.VM_TERMINAL_INIT_INFO_SET(model, swver, hwver, serialnumber, macaddress, mmsServer, lang)
		print 'ka...########## info=', model, swver, hwver, serialnumber, macaddress, mmsServer, lang
	# 처음  reigister 성공하고 한번 보내는 info 
	def setTerminalInformation(self):
		#print 'ka.....................regi_status=', self.regi_status
		if runtime.vdciapp.vm_register:
			return
			
		from vdcisetting import vdci_setting
		import profile

		import phonesetting
		terminalIp = '0.0.0.0'
		terminalIpInfo = phonesetting.getIpAddress()
		if terminalIpInfo:
			terminalIp = terminalIpInfo[0]
		
		telephoneNumber = vdci_setting.tel_num
		domain = vdci_setting.domain
		password = setting.pin

		if profile.profile.get_profile() == 2:
			if status.wifi_connected:
				connection = '1' #success
			else:
				connection = '0' # fail
		else:
			if status.LanConnected:
				connection = '1'
			else:
				connection = '0'
	
		#register_status = str(status.registered_status) #success -1 / fail -0
		import ntptime
		ntpTime = ntptime.timediff()
		runtime.vdciapp.vm_register = True

		# for key tone
		#keytone profile index/keytone volume/효과음 profile index/효과음 volume 
		buttonIndex = setting.button_effect_index # 0 해제 (1~4)
		effectIndex = setting.setting_effect_index # 0 해제  (1~3)
		buttonVolume = config.keytone[setting.keytone_volume-1]
		effectVolume = config.effect_sound[setting.effect_volume-1]

		self.VM_TERMINAL_INFO_SET(terminalIp, telephoneNumber, domain, password, connection, ntpTime, buttonIndex, buttonVolume, effectIndex, effectVolume)

	def keepMMSMessage(self, channel, baseStatus, toAddress, contentType, subject, filePath, replyUser):
		self.channel = channel
		self.baseStatus = baseStatus
		self.toAddress = toAddress
		self.contentType = contentType
		self.subject = subject
		self.filePath = filePath
		self.replyUser = replyUser

		if status.TEMP_MSG_CONDITION:
			shutil.copyfile(self.filePath, self.filePathForTempMessage)

	def getMMSInfoForMessageTest(self):
		return [self.baseStatus, self.toAddress, self.contentType, self.subject, self.filePathForTempMessage, self.replyUser]
		
	def sendMessageWithDectConfirm(self):
		self.VM_SMMS_RECV_REQUEST(self.baseStatus, self.toAddress, self.contentType, self.subject, self.filePath, self.replyUser)
		

	def jvmServerStart(self):
		MD.mmiTrace('### ### JVM Server START ### ###')
		try:
			os.unlink(config.vm_socket_path)
		except OSError:
			pass

		self.vmPid = os.fork()
		if self.vmPid == 0:
			try:
				os.execlp('jvm-ipc-server','jvm-ipc-server')
				#os.execlp('jvm-ipc-server','jvm-ipc-server', '-classpath', '\"__xvmrom__.jar:DownloadBox.jar:MediaPlayer.jar:MMSClient.jar\"', '-heapsize','8M')
				#os.execlp('sh', 'sh', '/usr/local/bin/jvm-run.sh')
			except:
				os._exit(1)
				
	def runVmHandler(self):
		MD.mmiTrace('VmHandler.runVmHandler()')

		self.jvmServerStart()

		import time
		time.sleep(3)
		
		self.vmClientSocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
		self.vmClientSocket.setblocking( 1 )

		import time
		try_connect = 0
		while try_connect < 5:
			try_connect += 1
			connected = True
			try:
				self.vmClientSocket.connect(config.vm_socket_path)
			except:
				connected = False

			if connected:
				MD.mmiTrace('**  jvm_socket connected! **')
				import evas
				self.vmReceveHandler=runtime.evas.input_add(self.vmClientSocket.fileno(), evas.INPUT_READ, self.messageHandlerFromVm)
				break
			else: # sock connect error, retry..
				MD.mmiTrace('** jvm_socket connect failed, retry', try_connect, '**')
				time.sleep(1)

	# msglen | event | data1 | data2 | data3 | data4 | data5 | data6 | data7 | data8 | data9 | data10
	def messageHandlerFromVm(self,vmClientSocket,type):
		import status
		try:
			socketMessage = self.vmClientSocket.recv( self.SOCKET_BUF_SIZE )
		except:
			self.with_error = True
			MD.mmiException('messageHandlerFromVm')
			return
			
		if len( socketMessage ) == 0:	# Disconnected from unix socket
			if self.vmReceveHandler != None:
				runtime.evas.input_remove(self.vmReceveHandler)
				self.vmReceveHandler = None
			return

		receivedMessage = socketMessage.split('|')

		messages = []
		while receivedMessage:
			messages.append(receivedMessage[:self.MSG_ITEM_LENGTH])
			receivedMessage = receivedMessage[self.MSG_ITEM_LENGTH:]
			if len(receivedMessage) == 1:
				break

		for message in messages:
			#print '[MMI] ', message
			
			event = message[1]
			data = message[2:]

			intEvent = int(event)
			#MD.mmiTrace('MESSAGE : VM --> BASE :: ', vmConfig.DICT_V2B_FUNCTION[intEvent])
			self.V2B_messageRun(vmConfig.DICT_V2B_FUNCTION[intEvent], event, data)

		return True

	def V2B_messageRun(self, cmd, *param):
		if hasattr(self, cmd):
			func = getattr(self, cmd)
			func(param)

	def VM_CHECK_KEEP_ALIVE_RESP(self, V2B_message):
		event, data = V2B_message		

	def VM_STEREO_SOUND_OPEN(self, V2B_message):
		event, data = V2B_message

	def VM_STEREO_SOUND_CLOSE(self, V2B_message):
		event, data = V2B_message

	def VM_STEREO_VOLUME_SET(self, V2B_message):
		event, data = V2B_message

	def VM_SMMS_SEND_REQUEST(self, V2B_message):
		event, data = V2B_message

		toAddress, replyUser, contentType, subject, filePath, length = data[:6]

		if toAddress == 'mms' or toAddress =='MMS':
			#domainAddress = 'ktwibro.net'
			#domainAddress = 'ktann.com'
			domainAddress = setting.mms_host
			useraddr = ''
			domainAddress2 = ''
		else:
			domainAddress = setting.sms_host
			#domainAddress = 'ismc.ann.com'
			#useraddr = '1549'
			useraddr = setting.sms_user
			#domainAddress2 = 'ismc.ann.com'
			domainAddress2 = domainAddress

		MD.mmiTodo('관리자 모드에서 설정된 값으로 변경해야 함.')
		uriType = '0' # sip-uri
		if runtime.vdciapp:
			runtime.vdciapp.send_mesg(code1='m', code2='m', \
				mesg1=toAddress, \
				mesg2=domainAddress, \
				mesg3=contentType, \
				mesg4=subject, \
				mesg5=filePath, \
				mesg6=replyUser, \
				mesg7=useraddr,\
				mesg8=domainAddress2,\
				mesg9=uriType)
		
	def VM_SMMS_MMI_NOTIFY(self, V2B_message):
		event, data = V2B_message
		data = data[0]

		if data == 'mms:low-storage':
			MD.mmiTrace('********* LOW STORAGE *******')
			status.low_storage_in_message = True
			
		elif data.startswith('mms:receive-completed'):
			MD.mmiTrace('********* NEW MMS MESSAGE RECEIVED  *******')
			number = data.split(';')[1]
			date = data.split(';')[2]
			status.mms_received_count += 1			
			status.mms_received_info = number+ ' ' +date
			MD.mmiTrace('MESSAGE', status.mms_received_info)
			#print 'ka............. runtime.eaHandler.isAppInUse() =',  runtime.eaHandler.isAppInUse()
			#print 'ka............status.mms_received_count=', status.mms_received_count
			
			setting.set_sms_missed(True) # for top bar
			if runtime.manager.stage.get_name() == 'idle':
				runtime.manager.stage.ui.update_sms_icon()

			if status.low_storage_in_message == True:
				status.low_storage_in_message = False
				full_flag = True
			else:
				full_flag = False

			# screen saver 동작 중인 경우 STOP
			#if status.slideshow_running:
			#	setting.stop_slideshow()
			setting.reset_screen_saver_timer()
				
			
			# KA: [20080609] sms notify
			if not runtime.eaHandler.isAppInUse():					
				if runtime.manager.stage.get_name() == 'idle' or \
					runtime.manager.stage.get_name() == 'missed_message':
					runtime.manager.change_stage(MessageNotifyStage(full_flag), True)
				else:
					runtime.manager.stage.SMS_Notify_show()
			else:
				destination = runtime.eaHandler.getForeground().getName()
				#print '[MMI] message receive -destination=', destination
				if destination == 'MMI':
					if runtime.manager.stage.get_name() == 'idle' or \
						runtime.manager.stage.get_name() == 'missed_message':
						runtime.manager.change_stage(MessageNotifyStage(full_flag), True) 
					else:
						runtime.manager.stage.SMS_Notify_show()				
				elif destination == 'BROWSER':
					runtime.myannapp.send_message_received()
					#utils.player.play_message_effect()
					self.playNotify()
				else:
					self.EVT_APP_MESSAGE_RECEIVED()
					#utils.player.play_message_effect()
					self.playNotify()
					
		elif data.startswith('mms:notify-sound-off'):
			self.playClear()
			
		elif data.startswith('mms:inbox-read'):
			self.playClear()
			#'mms:inbox-read(0)'
			pos_1 = data.find('(')
			pos_2 = data.find(')')
			noReadMsg = data[pos_1+1:pos_2]
			if noReadMsg == '0' or noReadMsg == '-1': #-1전체 삭제
				setting.set_sms_missed(False)
				status.mms_received_count = 0				
			
		elif data == 'mms:receive-failed':
			pass
		elif data == 'mms:ready':
			pass
		elif data == 'mms:notify-internal:1':
			setting.set_message_interval(1)
		elif data == 'mms:notify-internal:120':
			setting.set_message_interval(120)
		elif data == 'mms:notify-internal:600':
			setting.set_message_interval(600)

	def playNotify(self):
		utils.player.play_message_effect()

		if setting.message_interval != 1:
			self.smsPlayTimer = utils.Timer(setting.message_interval * 1000, self.playByInterval)
			#self.play_timer = utils.Timer(10000, self.playByInterval)
	def playByInterval(self):
		utils.player.play_message_effect()
		return True

	def playClear(self):
		self.smsPlayTimer = None

		
	def VM_GOTO_MMI_PROCESS(self, V2B_message):
		event, data = V2B_message

		command = data[0].split(':')[1]
		MD.mmiTrace('VM_GOTO_MMI_PROCESS::command = ', command)

		# 2008.07.02
		self.AliveVM()

		if command == self.IDLE:
			runtime.eaHandler.deactivateApplication(gotoIdle=True)
			if runtime.eaHandler.pauseTimer:
				#print 'ka....######## RedAck --- go to Incoming'
				runtime.eaHandler.rcvPauseAck()
			
		elif command == self.BACK:
			# manager.py에서 EaHandler를 이용할 것.
			# 현재 MMI와 동일하게 구현함.
			runtime.eaHandler.deactivateApplication()
			if runtime.eaHandler.pauseTimer:
				#print 'ka....######## BackAck --- go to Incoming'
				runtime.eaHandler.rcvPauseAck()
			
		elif command == self.MMSC:
			self.EVT_APP_SET_FOREGROUND(self.MMSC)
		elif command == self.MULTIMEDIA:
			self.EVT_APP_SET_FOREGROUND(self.MULTIMEDIA)		
		elif command == self.BROWSER:
			#self.VM_KEY_STOP()
			#status.MMI_KEY_BLOCK = False
			#os.system(self.FOREGROUND_BROWSER)
			runtime.eaHandler.gotoBrowser()			
		elif command == self.MMI:		
			self.VM_KEY_STOP()
			status.MMI_KEY_BLOCK = False
			os.system(self.FOREGROUND_MMI)
		elif command == self.PAUSED:
			runtime.eaHandler.rcvPauseAck()
		

	def VM_PHONEBOOK_SELECT(self, V2B_message):
		event, data = V2B_message

		if data[0] == 'phonebook:selection':
			runtime.eaHandler.openPhonebook('MMSC')
		elif data[0] == 'phonebook:group_selection':
			runtime.eaHandler.openGroupbook('MMSC')
		else: # phonebook:addtelnum:07077000126
			number = data[0].split(':')[2]
			runtime.eaHandler.openAddPhonebook('MMSC', data=number)

	def VM_VDCI_CALL_REQUEST(self, V2B_message):
		event, data = V2B_message
		MD.mmiTrace('VM_VDCI_CALL_REQUEST::data = ', data)
		# 2008.07.02
		self.AliveVM()
		
		data = data[0]
		#number = data[1]
		if data.find('from:') != -1:
			source = data.split('from:')[1]
			number = ''
		else:
			# 이 경우에만 number가 존재 
			source = 'MMSC'
			number = data.split('tel://')[1]
			# QA:10-35:메시지 수신 확인시 popup 창 있을때 Green키 누르는 경우 
			if number == 'null':
				number = ''
			
		if data.find('h_vtel') != -1:
			#source = data.split('from:')[1]
			#number = data[9:]
			#if len(number):
			#	runtime.eaHandler.startVideoCall(self.MMSC, number)
			#else:
			runtime.eaHandler.startCallWithoutNumber(source, number)
		elif data.find('h_tel') != -1:
			#source = data.split('from:')[1]
			#number = data[8:]
			#if len(number):
			#	runtime.eaHandler.startAudioCall(self.MMSC, number)
			#else:
			runtime.eaHandler.startCallWithoutNumber(source, config.OffHook)
		# video key에 의한 비디오 콜
		elif data.find('vtel') != -1:
			#number = data[7:]
			if len(number):
				runtime.eaHandler.startVideoCall(source, number)
			else:
				runtime.eaHandler.startCallWithoutNumber(source, config.Video)
		# audio key에 의한 오디오 콜	
		elif data.find('tel') != -1:

			if len(number):
				runtime.eaHandler.startAudioCall(source, number)
			else:
				runtime.eaHandler.startCallWithoutNumber(source, config.Green)

	def VM_WAP_BROWSER_REQUEST(self, V2B_message):
		event, data = V2B_message
		runtime.eaHandler.startWAPfromBank()
		
	def VM_SMMS_FULL(self, V2B_message):
		event, data = V2B_message

	def VM_SYNC_NOTI(self, V2B_message):
		event, data = V2B_message

	def VM_GET_INFO(self, V2B_message):
		#register 상태와 link connection 상태를 알린다. 
		regiStatus = status.get_regstatus()
		import profile
		cur_profile = profile.profile.get_profile()	
		conStatus = 0
		if cur_profile == 1:
			if runtime.peek_lanlink():
				conStatus = 1
		else:
			if runtime.peek_wifilink():
				conStatus = 1
				
		event  = str(vmConfig.VM_GET_INFOACK)
		self.B2V_sendMessage(event, str(regiStatus), str(conStatus))
	
	#def VM_GET_INFOACK (self):
	#	event  = str(vmConfig.VM_GET_INFOACK)
	#	self.B2V_sendMessage(event, regiStatus, conStatus)
		
	def VM_SET_INFO_TO_MMI(self, V2B_message):
		event, data = V2B_message
		if data[0] == 'k.BELL_MMS_RECEIVED':
			#melody = unicode(data[1], 'utf-8').encode('euc-kr')
			melody = data[1]
			melody = melody.replace(config.message_effect_VM_dir, config.message_effect_dir)
			setting.set_message_effect(melody)			
			
		elif data[0] == 'k.IDLE_SCREEN':
			full_path = data[1]
			file = full_path.split('/usr/local/lgvp/')[1]
			setting.bg_image_file = file
			import baseui
			baseui.change_bg(runtime.evas, file)
		elif data[0] =='k.BELL':
			audio_file = data[1]
			# KA: [20080527] for test- mmf ring
			setting.mmf_external_ring = ''
			if audio_file.endswith('mmf'):
				setting.mmf_external_ring = audio_file
				os.system('cp \"%s\" /mfs/ram/mmf/ring.mmf'%audio_file)
				audio_file = '/mfs/ram/mmf/ring.mmf'
			# KA: [20080527] for test- mmf ring ==			
			setting.external_ring = audio_file

	def VM_MULTIMEA_BACK_IMAGE(self, V2B_message):
		event, data = V2B_message
		#print 'ka....background image = ',  unicode(data[1], 'euc-kr').encode('utf-8')

		full_path = data[1]
		file = full_path.split('/usr/local/lgvp/')[1]
		#try:
		#	full_path = unicode(full_path, 'utf-8').encode('euc-kr')
		#except:
		#	pass
		setting.bg_image_file = file
		import baseui
		baseui.change_bg(runtime.evas, file)	


	# msglen | event | data1 | data2 | data3 | data4 | data5 | data6 | data7 | data8 | data9 | data10 |	
	def B2V_sendMessage(self, event, data1='', data2='', data3='', data4='', data5='', data6='', data7='', data8='', data9='', data10=''):
		intEvent = int(event)
		MD.mmiTrace('MESSAGE : BASE --> VM :: ', vmConfig.DICT_B2V_FUNCTION[intEvent])
		#MD.mmiTrace('data1 = ', data1)
		#MD.mmiTrace('data2 = ', data2)
		#MD.mmiTrace('data3 = ', data3)
		#MD.mmiTrace('data4 = ', data4)
		#MD.mmiTrace('data5 = ', data5)
		#MD.mmiTrace('data6 = ', data6)
		#MD.mmiTrace('data7 = ', data7)
		#MD.mmiTrace('data8 = ', data8)
		#MD.mmiTrace('data9 = ', data9)
		#MD.mmiTrace('data10 = ', data10)

		data = [data1, data2, data3, data4, data5, data6, data7, data8, data9, data10]
		data.insert(0, event)
		B2V_messageString = '|'.join(data) + '|'
		B2V_messageString = str(len(B2V_messageString)) + '|' + B2V_messageString
		

		#MD.mmiTrace('B2V_messageString = ', B2V_messageString)
			
		if self.vmClientSocket != None:
			try:
				self.vmClientSocket.send(B2V_messageString)
			except:
				pass

	def EVT_APP_MESSAGE_RECEIVED(self):
		event  = str(vmConfig.EVT_APP_MESSAGE_RECEIVED)
		self.B2V_sendMessage(event)
	
	def EVT_APP_PAUSE(self):
		event  = str(vmConfig.EVT_APP_PAUSE)
		self.B2V_sendMessage(event)
		
	def EVT_APP_MIDLET_PAUSE(self, application):
		event  = str(vmConfig.EVT_APP_MIDLET_PAUSE)
		self.B2V_sendMessage(event, application)
		
	def EVT_APP_MIDLET_RESUME(self, application, language):
		event  = str(vmConfig.EVT_APP_MIDLET_RESUME)
		self.B2V_sendMessage(event, application, language)	

	def EVT_APP_RESUME(self):
		event  = str(vmConfig.EVT_APP_RESUME)
		self.B2V_sendMessage(event)

	def EVT_APP_SHUTDOWN(self):
		event  = str(vmConfig.EVT_APP_SHUTDOWN)
		self.B2V_sendMessage(event)

	def EVT_APP_SET_FOREGROUND(self, application):
		event  = str(vmConfig.EVT_APP_SET_FOREGROUND)
		self.B2V_sendMessage(event, application)

	def EVT_APP_START(self, MIDlet):
		event  = str(vmConfig.EVT_APP_START)
		self.B2V_sendMessage(event, MIDlet)

	def EVT_APP_STOP(self):
		event  = str(vmConfig.EVT_APP_STOP)
		self.B2V_sendMessage(event)

	def EVT_APP_LIST(self):
		event  = str(vmConfig.EVT_APP_LIST)
		self.B2V_sendMessage(event)

	def EVT_APP_MESSAGE(self, name, data):
		event  = str(vmConfig.EVT_APP_MESSAGE)
		self.B2V_sendMessage(event, name, data)

	def ERR_SIP_UNREGISTERED(self):
		event  = str(vmConfig.ERR_SIP_UNREGISTERED)
		self.B2V_sendMessage(event)

	def ERR_NETWORK_LINE_OUT(self):
		event  = str(vmConfig.ERR_NETWORK_LINE_OUT)
		self.B2V_sendMessage(event)

	def ERR_SIP_REGISTERED(self):
		event  = str(vmConfig.ERR_SIP_REGISTERED)
		self.B2V_sendMessage(event)

	def ERR_NETWORK_LINE_IN(self):
		event  = str(vmConfig.ERR_NETWORK_LINE_IN)
		self.B2V_sendMessage(event)

	def VM_CHECK_KEEP_ALIVE(self):
		event  = str(vmConfig.VM_CHECK_KEEP_ALIVE)
		self.B2V_sendMessage(event)

	def VM_GET_EXECUTION_LIST(self):
		pass

	def VM_GET_FOREGROUND_ID(self):
		pass

	def VM_SMMS_RECV_REQUEST(self, baseStatus, toAddress, contentType, subject, filePath, replyUser):
		event  = str(vmConfig.VM_SMMS_RECV_REQUEST)
		from os.path import getsize 
		length = str(getsize(filePath))
		#print 'ka............................baseStatus=', baseStatus

		self.B2V_sendMessage(event, baseStatus, toAddress, replyUser, contentType, subject, filePath, length)

	def VM_SMMS_SEND_RESULT(self, code, reason):
		event  = str(vmConfig.VM_SMMS_SEND_RESULT)

		self.B2V_sendMessage(event,  code, reason)

	def VM_COOKIE_UPDATE_REQ(self, path=None):
		event = str(vmConfig.VM_COOKIE_UPDATE_REQ)
		self.B2V_sendMessage(event, path)

	def VM_TERMINAL_INFO_SET(self, ip, telephoneNumber, domain, password, connection, ntptime, buttonIndex, buttonVolume, effectIndex, effectVolume):
		#LINE CON =0 /1 , REGI=1 /0
		event = str(vmConfig.VM_TERMINAL_INFO_SET)
		self.B2V_sendMessage(event, ip, telephoneNumber, domain, password, connection, str(ntptime), str(buttonIndex), str(buttonVolume), str(effectIndex), str(effectVolume))

	def VM_TERMINAL_INIT_INFO_SET(self, model, sw, hw, serial, mac, mmsServer, language):
		event = str(vmConfig.VM_TERMINAL_INIT_INFO_SET)
		self.B2V_sendMessage(event, model, sw, hw, serial, mac, mmsServer, language)
	
	def VM_KEY_STOP(self):
		event  = str(vmConfig.VM_KEY_STOP)
		self.B2V_sendMessage(event)

	def VM_KEY_START(self):
		event  = str(vmConfig.VM_KEY_START)
		self.B2V_sendMessage(event)

	# KT 서비스 신청
	def VM_KT_SERVICES(self, services):
		event  = str(vmConfig.VM_KT_SERVICES)
		self.B2V_sendMessage(event, services)
		
	def VM_REDKEY_PRESSED(self):
		if not self.vmAliveTimer and not runtime.eaHandler.pauseTimer:
			print 'ka...############ waitRed----------'
			self.vmAliveTimer = utils.Timer(10 * 1000, self.reRunVmHandler)
			event  = str(vmConfig.VM_REDKEY_PRESSED)
			self.B2V_sendMessage(event)
		else:
			print 'ka...### Red key / Pause timer started!! ignore~~'		
			
		
	def VM_REDKEY_RELEASED(self):
		event  = str(vmConfig.VM_REDKEY_RELEASED)
		self.B2V_sendMessage(event)

	def AliveVM(self):
		print 'ka...############ rcvRedAck----------'
		self.vmAliveTimer = None

	def VM_KEEP_APP(self, V2B_message):
		#event, data = V2B_message	
		self.AliveVM()
		
	def reRunVmHandler(self):
		self.vmAliveTimer = None
		import os, time
		print 'ka.....### reRunVmHandler------------'
		os.system('fbtop 1')
		time.sleep(0.5)
		os.system('killall python')
		#os.system('reboot')		
		#self.killJVM()	
		#runtime.vmHandler = VmHandler()

	def killJVM(self):
		def killall(name, sig):
			for pid in os.listdir('/proc'):
				cmdline_path = '/proc/%s/cmdline' % pid
				if os.path.exists(cmdline_path):
					try:
						pid = int(pid)
					except ValueError:
						continue

					if open(cmdline_path).read().startswith(name):
						os.kill(pid, sig)

		#if self.run_recv_thread != None:
		#	runtime.evas.input_remove(self.run_recv_thread)
		#	self.run_recv_thread = None

		if self.vmPid:
			try:
				import signal, time
				os.kill(self.vmPid, signal.SIGKILL)
				os.waitpid(self.vmPid, 0)

				killall('jvm-ipc-server', signal.SIGKILL)
			except:
				pass
				
			def hdl_sigchld(signum, frame):  # clean a zombie
				try:
				    	while 1:
	    					print 'os wait pid 6'
					        if os.waitpid(0, os.WNOHANG): raise OSError

				except OSError:
				   	pass

			self.vmPid = None
			signal.signal(signal.SIGCHLD, hdl_sigchld)
			os.unlink(config.vm_socket_path)
			os.system('rm -rf /tmp/Embider/')
			

	
from basemodel import Stage	
class MessageStatusNotifyStage(Stage):
	name  = 'message_status_notify'
	
	def __init__(self):
		self.ui = MessageStatusNotifyUI(num_mms, uiconfig.baloon_message_mms_icon)
		self.ui.show_bg = True

	'''
	def update_num_mms(self):
		self.ui.set_num_mms(num_mms)
		icon = uiconfig.baloon_message_mms_icon
		icon_name, pos = icon
		self.ui.remove(self.ui.icon)
		self.ui.icon = utils.put_image(icon_name, pos)
		self.ui.add(self.ui.icon)
	'''
	def handle_key(self, key):
		if key == config.Menu1:
			runtime.eaHandler.readNewMessage(destination='MMS')
			runtime.manager.back_stage()			
		elif key == config.Menu2:
			runtime.manager.back_stage()
		else:
			return self.ui.handle_key(key)
		return True

from baseui import BaloonUI
import uiconfig
class MessageStatusNotifyUI(BaloonUI):
	def __init__(self, icon=uiconfig.baloon_message_mms_icon):
		BaloonUI.__init__(self, _('VIEW'), _('EXIT'), '', icon)

		if status.low_storage_in_message:
			message = _('Message received!')
		else:
			message = _('Message received![almost Full]')

		self.messageStatusNotifyMessage = runtime.evas.text(text=message, font=uiconfig.idle_sms_font, color=uiconfig.idle_sms_color)
		self.messageStatusNotifyMessage.pos = uiconfig.idle_sms_pos
		self.add(self.messageStatusNotifyMessage)

		if status.low_storage_in_message:
			name, pos = uiconfig.idle_icon_messagefull
			sms_fullimage = utils.put_image(name, pos)
			self.add(sms_fullimage)
		else:
			name, pos = uiconfig.idle_sms_icon
			self.sms_image = utils.put_image(name, pos)
			self.add(self.sms_image)

	def set_num_mms(self, num_mms):
		self.num_mms = num_mms
		if self.num_mms == 1:
			message = _('1 MMS received!')
		else:
			message = '%d' % self.num_mms + ' ' + _('MMS received.')
		self.t.text = message

# KA: [20080523] VM SMS수신
import ui
class MessageNotifyStage(Stage):
	name = 'missed_message'
	def __init__(self, full_flag = False):
		#from phonedb import phonedb
		#caller_name = phonedb.get_name(number)
		#self.caller_name = utils.resize_text(caller_name, uiconfig.incoming_call_text_width, uiconfig.incoming_call_font)[0]
		self.play_timer = None
		msg_num = status.mms_received_count
		info = status.mms_received_info
		number, date = info.split(' ')
		# make date - 2008/05/30/17:40 /21
		'''
		yy = date[:4]
		mon = date[4:6]
		day = date[6:8]	
		hour = date[8:10]
		min = date[10:12]
		date = yy + '/' + mon + '/' + day + ' ' + hour + ':' + min
		'''
		# make date - 05/30 05:40PM
		yy = int(date[:4])
		mon = int(date[4:6])
		day = int(date[6:8])	
		hour = int(date[8:10])
		min = int(date[10:12])
		'''
		if hour > 12:
			date = "%02d/%02d %02d:%02dPM" % (mon, day, (hour-12), min)
		elif hour == 12:
			date = "%02d/%02d %02d:%02dPM" % (mon, day, hour, min)
		else:
			date = "%02d/%02d %02d:%02dAM" % (mon, day, hour, min)
		'''
		if hour > 12:
			date = "%02d/%02d %s%02d:%02d" % (mon, day, _('PM'), (hour-12), min)
		elif hour == 12:
			date = "%02d/%02d %s%02d:%02d" % (mon, day, _('PM'), hour, min)
		elif hour == 0:
			date = "%02d/%02d %s%02d:%02d" % (mon, day, _('AM'), (hour+12), min)
		else:
			date = "%02d/%02d %s%02d:%02d" % (mon, day, _('AM'), hour, min)
			
		from phonedb import phonedb
		name = phonedb.get_name(number)
		if name == '1549':
			name = _('KT SMS Center')
		if name.isdigit():
			name = utils.conv_telnum(name)
		if full_flag:
			#msg = name+ _('Message received') +'\n' + _('Message inbox is full') + '\n' + date
			msg = _('New message received.') + '\n' + name + '\n' + date + '\n' + _('Message inbox is full')
		else:
			#msg = name+ ' ' + _('Message received')+ '\n' + date
			msg = _('New message received.') + '\n' + name + '\n' + date
		self.ui = ui.MessageNotifyUI(msg)
		self.play_notify()
		setting.set_sms_missed(True) # for top bar
		
	def play_notify(self):
		utils.player.play_message_effect()

		if setting.message_interval != 1:
			self.play_timer = utils.Timer(setting.message_interval * 1000, self.playByInterval)
			#self.play_timer = utils.Timer(10000, self.playByInterval)
	def playByInterval(self):
		utils.player.play_message_effect()
		return True
			
	def MMSC_goto_init(self):
		from eaHandler import EaHandler
		runtime.eaHandler.startAsInitialMode()
		
	def destroy(self):
		status.mms_received_count = 0
		self.play_timer = None
		Stage.destroy(self)
		
	def handle_key(self, key):
		#runtime.mmedia.unload()		#vc02를 clear	
		if key in (config.Menu1, config.ok):
			status.mms_received_count = 0
			runtime.manager.back_stage()
			from eaHandler import EaNotifyStage
			runtime.manager.stack_stage(EaNotifyStage('AudoCall : In Use By MMSC'))
			runtime.eaHandler.activateApplication(destination = 'MMSC')
			runtime.vmHandler.EVT_APP_SET_FOREGROUND('MMSC')
			runtime.eaHandler.readNewMessage()
			return True
		elif key == config.Menu4 or key == config.Red:
			status.mms_received_count = 0
			from model import IdleStage
			runtime.manager.change_stage(IdleStage, True)
			#self.MMSC_goto_init()
			return True
		else:
			return False
		#return True

# KA: [20080523] VM SMS수신 ==