import runtime
import os
import signal
import os.path
from setting import setting
import time, ntptime
import evas
import config
from roxiadebug import *
import status
import profile
#MMW
import stat
#end of MMW
from mmedia import Mmedia
GETTEXT_MARKER = chr(3) #통신프로그램의 끝을 의미(아스키 3 = ETX)
#timer
class Timer:
def __init__(self, timeout, cb, *args):
self.timer = runtime.evas.timeout_add(timeout, cb, *args)
def __del__(self):
if self.timer:
runtime.evas.timeout_remove(self.timer)
class Idle:
def __init__(self, cb, *args):
self.tag = runtime.evas.idle_add(cb, *args)
def __del__(self):
if self.tag:
runtime.evas.idle_remove(self.tag)
class Input:
def __init__(self, fd, cb, *args):
self.tag = runtime.evas.input_add(fd, evas.INPUT_READ, cb, *args)
def __del__(self):
if self.tag:
runtime.evas.input_remove(self.tag)
def insert_translation_mark(s):
return GETTEXT_MARKER + s + GETTEXT_MARKER
def changefile_gif(filename):
import imghdr
result = imghdr.what(filename)
ext = ''
if not result:
ext = get_ext(filename)
result = ext.lower()
if ext.lower() == 'wbmp':
pass
if result in ('bmp', 'gif', 'jpeg', 'jpg', 'png'):
#if result in ('bmp', 'gif'):
if result in ('bmp'):
import uiconfig
if not os.access(uiconfig.gif_tempdir, os.R_OK):
make_dir(uiconfig.gif_tempdir)
remove_dir(uiconfig.gif_tempdir)
gif_name = ''
gif_name = filename.split('/')[-1]
dot = gif_name.rfind('.')
if dot >=0:
gif_name = gif_name[:dot]
gif_name = uiconfig.gif_tempdir + gif_name+'.png'
os.system('imlib2_conv ' + '%r'%filename + ' ' + '%r'%gif_name)
for i in range(30):
if os.path.exists(gif_name):
break
return gif_name
else:
return filename
else:
return '/usr/local/lgvp/images/image_error.png'
#이미지를 그려준다
# KA: [20080314] phonebook UI
def put_image(name, pos, img_rg = [0, 0], img_dir=''):
debugLogN('\tput_image:', name)
x,y = pos
if name != '':
runtime.evas.image_cache_flush()
# shchun: safety code when name == None
if len(name) == 0 or not os.access(name, os.R_OK):
import uiconfig
if not img_dir:
img_dir = uiconfig.image_dir
name = img_dir + name
#assert os.access(name, os.R_OK)
name = changefile_gif(name)
else:
pass
image = runtime.evas.image(pos=(x,y), file=name)
w, h = image.size_get()
if img_rg != [0,0]:
w, h = img_rg
image.fill_set(0, 0, w, h)
image.show()
return image
def image_file_resize(in_file, out_file, width, height):
return runtime.mmedia.image_file_resize(in_file, out_file, width, height)
#이미지 사이즈를 넘어온 인자값인 size로 변환한 이미지 오브젝트를 리턴한다
def put_image_sized(name, pos, size):
if not os.access(name, os.R_OK):
import uiconfig
name = uiconfig.image_dir + name
#assert os.access(name, os.R_OK)
name = changefile_gif(name)
image = runtime.evas.image(pos=pos, file=name)
image.size = size
w, h = size
image.fill_set(0, 0, w, h)
image.smooth_scale_set(0)
image.show()
return image
#이미지를 넘어온 인자값인 pos를 중심으로 하여 이미지를 그린다
def put_image_centered(name, pos):
x,y = pos
if not os.access(name, os.R_OK):
import uiconfig
name = uiconfig.image_dir + name
#assert os.access(name, os.R_OK)
name = changefile_gif(name)
image = runtime.evas.image(file=name)
w, h = image.size_get()
x -= w/2
y -= h/2
image.pos = x,y
image.size = w, h
image.smooth_scale_set(0)
image.fill_set(0, 0, w, h)
image.show()
return image
def image_sized(image, pos, size):
image.pos = pos
image.size = size
image.smooth_scale_set(0)
#image.fill_set(pos[0], pos[1], size[0], size[1])
image.fill_set(0,0, size[0], size[1])
image.show()
return True
def image_center_sized2(image, pos, size):
x, y = pos[0] - size[0]/2, pos[1] - size[1]/2
image.pos = x, y
image.size = size
image.smooth_scale_set(0)
#image.fill_set(pos[0], pos[1], size[0], size[1])
image.fill_set(0,0, size[0], size[1])
image.show()
return True
#이미지를 max_w, max_h의 사이즈 안에 들어가게 사이즈 조정을 하고 center_x, center_y를 중심으로 그린다
def image_center_sized(image, center_x, center_y, max_w, max_h):
orig_w, orig_h = image.size_get()
w = min(max_w, orig_w)
h = min(max_h, orig_h)
if orig_w > w or orig_h > h:
orig_w = float(orig_w)
orig_h = float(orig_h)
ratio = max(orig_w/w, orig_h/h)
w = int(orig_w/ratio)
h = int(orig_h/ratio)
x,y = center_x - w / 2, center_y - h/2
image.pos = x, y
image.size = w, h
image.smooth_scale_set(0)
image.fill_set(0, 0, w, h)
#디렉토리 내의 파일들을 (파일이름, 파일크기, 최근 상태변화 시간) 튜플로 리턴
def get_file_lists(dirname):
alists = []
for d in os.listdir(dirname):
if d == 'bluetooth_tmp.file':
continue
stat = os.stat(dirname + d)
# stat[0] : inode protection mode
if stat[0] & 0100000: #regular file
# stat[6] : ST_SIZE(file size)
# stat[8] : ST_MTIME(last modification time)
# stat[9] : ST_CTIME(LINUX:last metadata chage, Windows:creation time)
#alists.append((d, stat[6], stat[9]))
alists.append((d, stat[6], stat[8]))
alists.sort()
return alists
def get_img_file_lists(dirname):
alists = []
for d in os.listdir(dirname):
if d == 'bluetooth_tmp.file':
continue
if not d.lower().endswith('.jpg') and not d.lower().endswith('.png') and not d.lower().endswith('.gif') :
continue
stat = os.stat(dirname + d)
# stat[0] : inode protection mode
if stat[0] & 0100000: #regular file
# stat[6] : ST_SIZE(file size)
# stat[9] : ST_CTIME(creation time)
alists.append((d, stat[6], stat[9]))
alists.sort()
return alists
def get_ext_img_file_lists(dirname):
alists = []
for d in os.listdir(dirname):
if d == 'bluetooth_tmp.file':
continue
# if not d.lower().endswith('.jpg') and not d.lower().endswith('.png') and not d.lower().endswith('.gif') :
if not d.lower().endswith('.jpg') and not d.lower().endswith('.png'):
continue
file = dirname + d
# 1024x768 보다 큰 이미지는 skip
'''
tmp_w, tmp_h = get_img_size(file)
if tmp_w * tmp_h > 1024* 768:
continue
'''
stat = os.stat(file)
# stat[0] : inode protection mode
if stat[0] & 0100000: #regular file
# stat[6] : ST_SIZE(file size)
# stat[9] : ST_CTIME(creation time)
alists.append((d, stat[6], stat[9]))
alists.sort()
return alists
#디렉토리 내의 특정 확장자인 파일들을 (파일이름, 파일크기, 최근 상태변화 시간) 튜플로 리턴
def get_ext_file_lists(dirname, ext):
alists = []
for d in os.listdir(dirname):
if d == 'bluetooth_tmp.file':
continue
if not d.lower().endswith(ext) :
continue
stat = os.stat(dirname + d)
# stat[0] : inode protection mode
if stat[0] & 0100000: #regular file
# stat[6] : ST_SIZE(file size)
# stat[9] : ST_CTIME(creation time)
alists.append((d, stat[6], stat[9]))
alists.sort()
return alists
#dirname 디렉토리 안의 파일들의 갯수를 리턴
def get_file_count(dirname):
lists = get_file_lists(dirname)
if config.utils_debug:
print 'dirname, count:', len(lists)
return len(lists)
#특정 파일의 파일 사이즈를 리턴
def get_file_size(filename):
try:
return os.stat(filename)[6]
except:
return 0
#특정 파일의 수정 시간을 리턴
def get_mdate(filename):
return os.stat(filename)[8]
#timidity_command = "timidity --loop --no-anti-alias -E WPVSETOZ -s 8000Hz -EFresamp=d " + \
# "--no-mod-wheel --no-portamento --no-vibrato --no-trace-text-meta " + \
# "--output-mono --no-overlap-voice --no-temper-control --no-trace --quiet=y -W-"
#midiplay_command = "midiplay -1 20"
class MelodyPlayer:
def __init__(self):
self.pid = None
self.amr = None
self.mp3 = None
self.amr_record = None
self.camera_pid = None
self.videopid_record = None
self.videopid = None
self.video_record_save = False
self.old_sigchild = None # 0은 SIG_DFL이므로 조심
self.old_dspg_state = None
self.thumb_yuv = None
self.thumb_png = None
self.thumb_filename = ''
self.dspg_state = None
# answer delay 06.05.17
# self.tag_play_tup = 1 : wav
# self.tag_play_tup = 2 : amr
# otherwise : not used.
self.tag_play_tup = 0
self.camera_ok_timer = None
self.camera_cnt = 0
self.position = None
self.preview_wait_EC = False
self.amr_chg = None
# KA: [20070816] play DTMF
self.dtmf_play_pid = None
self.viewfinder = None
#self.msgPlayTimer = None
def play_ring(self, file, loop=True, change_state=True, videopos=(56, 80, 204, 256), vol_index=None):
'''
if profile.ip_mode == 0: # PSTN mode
self.play(file, loop, change_state, videopos)
else:
if status.incoming_umts_call: # answer delay - ring from UMTS - do not use TUP - 06.06.14
#if status.caller_number.startswith(config.UMTS_MNC_NUM):
if config.utils_debug: print '### debug UMTS - status.caller_number=', status.caller_number
self.play(file, loop, change_state, videopos)
else:
self.play(file, loop, change_state, videopos, onTup=True)
'''
#runtime.mmedia.audio_stop()
# mmf file downloaded from browser
runtime.mmedia.audio_stop()
if file.endswith('mmf'):
os.system('cp \"%s\" /mfs/ram/mmf/temp.mmf'%file)
file = '/mfs/ram/mmf/temp.mmf'
if vol_index != None:
# print "[yylee debug] ring volume:", vol_index
vol = config.ring_volume[vol_index-1]
else:
# print "[yylee debug] ring volume:", setting.ringer_volume
vol = config.ring_volume[setting.ringer_volume-1]
# 녹음벨 소리 보정
if file.endswith('amr'):
vol += 3
runtime.SP_context.SP_stereoPlayback()
if setting.ringer_volume == 0 and vol_index == None:
return
if file.endswith('mmf'):
runtime.mmedia.audio_play_sync(file, vol)
else:
runtime.mmedia.audio_play(file, vol, loop)
def stop_ring(self):
# print "[yylee debug] utils.stop_ring invoked"
runtime.mmedia.audio_stop()
runtime.SP_context.SP_stereoStopPlayback()
#runtime.mmedia.unload()
def play_alarm(self, file, loop=True, change_state=True, videopos=(56, 80, 204, 256), vol_index=None):
'''
if profile.ip_mode == 0: # PSTN mode
self.play(file, loop, change_state, videopos)
else:
if status.incoming_umts_call: # answer delay - ring from UMTS - do not use TUP - 06.06.14
#if status.caller_number.startswith(config.UMTS_MNC_NUM):
if config.utils_debug: print '### debug UMTS - status.caller_number=', status.caller_number
self.play(file, loop, change_state, videopos)
else:
self.play(file, loop, change_state, videopos, onTup=True)
'''
runtime.mmedia.audio_stop()
if vol_index != None:
# print "[yylee debug] alarm volume:", vol_index
runtime.SP_context.SP_stereoPlayback()
runtime.mmedia.audio_play(file, config.alarm_volume[vol_index-1], loop)
else:
# print "[yylee debug] alarm volume:", setting.alarm_volume
runtime.SP_context.SP_stereoPlayback()
runtime.mmedia.audio_play(file, config.alarm_volume[setting.alarm_volume-1], loop)
def stop_alarm(self):
# print "[yylee debug] utils.stop_alarm invoked"
runtime.mmedia.audio_stop()
runtime.SP_context.SP_stereoStopPlayback()
#runtime.mmedia.unload()
def play_stereo(self, file, loop=True, vol_index=None, gallery=False):
# mmf file downloaded from browser
runtime.mmedia.audio_stop()
if file.endswith('mmf'):
os.system('cp \"%s\" /mfs/ram/mmf/temp.mmf'%file)
file = '/mfs/ram/mmf/temp.mmf'
runtime.SP_context.SP_stereoPlayback()
# gallery flag는 IP3870의 Mic.가 KT의 당량 기준에 따라 작게 세팅되어있으므로 , 이를 보정하기 위해
# audio gallery에서 크게 재생해 주기 위함.
if vol_index != None:
if gallery:
vol = config.stereo_volume[vol_index-1]+3
else:
vol = config.stereo_volume[vol_index-1]
else:
if gallery:
vol = config.stereo_volume[setting.stereo_volume-1]+3
else:
vol = config.stereo_volume[setting.stereo_volume-1]
if file.endswith('mmf'):
runtime.mmedia.audio_play_sync(file, vol)
else:
runtime.mmedia.audio_play(file, vol, loop)
def play(self, file, loop=True, change_state=True, videopos=(0, 0, 272, 480), onTup=False, case=1):
#status.supervision_not_allowed = 1 # vpark 11.03
roxia_trace('MelodyPlayer.play() ~~~~~~~~~~~~~~~~~~~~')
if self.pid:
if config.utils_debug:
print '**********play_melody: kill old timidity'
self.stop(self.pid)
# 다시 한번 확인해보자. stop. (06.05.16)
elif self.tag_play_tup != 0: # not playing wav nor amr
#self.stop(onTup=True, tagp=self.tag_play_tup)
self.stop(onTup=True)
# options - waiting 에서의 melody play 시에는 ST_RINGER 모드로 바꾸지 않게끔
# if change_state:
# if status.phone_status not in (status.Disconnected, status.Dialing, status.PPPConnected):
# if config.utils_debug:
# print 'WARNING: melody play called when calling', runtime.manager.stage
# return
# Please modify here --KA
# self.old_dspg_state = runtime.dspg.get_state()
# KA: [20070724] .3gp인 경우 dspg_state: ST_MENU_REC 그럼 Volume ??
# if file.lower().endswith('.3gp'):
# runtime.dspg.set_state(runtime.dspg.ST_MENU_REC)
# else:
# runtime.dspg.set_state(runtime.dspg.ST_RINGER)
# setting.set_volume(setting.ringer_volume)
if config.utils_debug:
print 'play melody', file, 'loop =', loop, ', self.tag_play_tup=', self.tag_play_tup
# answer delay 06.05.23
self.tag_play_tup = 0
if not loop and not file.lower().endswith('.amr') and not file.lower().endswith('.3gp') and file != config.for_one_ring_melody:
def sigchld_handler(signum, stack):
if config.utils_debug:
print 'sigchild handler: pid=', self.pid
os.waitpid(self.pid, 0)
self.pid = None
signal.signal(signal.SIGCHLD, self.old_sigchild)
self.old_sigchild = None
if self.old_dspg_state != None:
runtime.dspg.set_state(self.old_dspg_state)
self.old_dspg_state = None
self.old_sigchild = signal.signal(signal.SIGCHLD, sigchld_handler)
if file.lower().endswith('.amr'):
if onTup==True and profile.ip_mode != 0:
if config.utils_debug:
print '=========================================='
print '**** utils.call play_amr_on_tup *****'
setting.set_volume(setting.ringer_volume)
self.tag_play_tup = self.play_amr_on_tup(file)
return self.pid
else:
return self.amr_play(file, loop)
if file.lower().endswith('.3gp') or file.lower().endswith('.mid'):
#print 'ka.... file=', file
# KA: [20070724] audio_play 추가
#if file.lower().startswith('/usr/local/lgvp/audios') or file.lower().endswith('arec.3gp'):
if file.lower().startswith('/usr/local/lgvp/audios') or file.lower().endswith('arec.mp4'):
#print 'ka.............audio'
return self.audio_play(file, videopos, loop)
else:
#print 'ka............video'
return self.video_play(file, videopos, loop)
# if file.lower().endswith('.mid'):
# runtime.dspg.set_state(runtime.dspg.ST_MIDI)
# setting.set_volume(setting.ringer_volume)
if file.lower().endswith('.mp3') or file.lower().endswith('.mp4'):
return self.play_mp3(file, videopos, loop)
#ka...3800 ringplay-playulaw-wav / Not call Tup
# if file.lower().endswith('.wav') and onTup==True and profile.ip_mode != 0:
# if config.utils_debug:
# print '=========================================='
# print '**** utils.call play_wav_on_tup *****'
# print '**** playing file : ', config.audio_root_dir + file
# print '**** profile.ip_mode = ', profile.ip_mode
# self.tag_play_tup = self.play_wav_on_tup(file)
#ka...3800 Temporary 2007.04.04 For play ring using playulaw
# return self.pid
# KA: [20080219] wav 파일만 아래 루틴을.. --- ringplay가 이곳을 안타게 되고 toneplay만 ~~
# KA: [20080213] wav play
# spkOffHook = runtime.SP_context.SPK_OffHook()
# if spkOffHook.next():
# spkOffHook.next()
# runtime.SP_context.SP_startPlayback()
# setting.set_volume(device=case)
#runtime.SP_context.SP_stereoPlayback()
# KA: [20080213] wav play ==
self.pid = os.fork()
if self.pid == 0:
# try:
#self.tag_play_tup = 0
midi_loop = 0
midiplay_command = ""
if file.endswith('.mid'):
if loop:
midi_loop = -1
else:
midi_loop = 1
file =(file,)
midiplay_command = "midiplay %d %d" % (midi_loop, config.MIDI_VOLUME)
else:
# KA: [20080226] tone play --> playulaw로 임시 변경
devices = runtime.SP_context.getCurrentDevice()
# if not devices: # default --1 -- ringing
# play_path = '1'
# runtime.SP_context.SP_stopPlayback()
# spkOnHook = runtime.SP_context.SPK_OnHook()
# if spkOnHook.next():
# spkOnHook.next()
# spkOnHook.next()
# else:
play_path = '1'
for device in devices:
from mmiSoundPath import SP_State
if device == SP_State.DEVICE_HS:
play_path = '0'
elif device == SP_State.DEVICE_SPK:
play_path = '1'
else:#device == SP_State.DEVICE_HSS1_TS1:
play_path = '2'
# KA: [20080226] tone play --> playulaw로 임시 변경 ==
if loop:
file = ('--loop', file, play_path)
else:
file = (file, play_path)
filename = file[-2]
if filename.lower().endswith('.mid'):
command = ('midiplay',) + tuple(midiplay_command.split()) + file
elif filename.lower().endswith('.wav'):
command = ('playulaw','playulaw') + file
elif filename.lower().endswith('.imy'):
command = ('playimy','playimy') + file
else:
if config.utils_debug:
print 'I cannot play this file', file
os._exit(1)
roxia_trace('play command:#', command)
os.execlp(*command)
# except:
# os._exit(1)
if config.utils_debug:
print 'player: pid=', self.pid, 'child handler', self.old_sigchild
return self.pid
#Roxia Begin cmlim 06.06.14
#def stop(self, pid='', onTup=False):
def stop(self, pid='', onTup=False, bmwi=False):
#Roxia End cmlim 06.06.14
if config.utils_debug:
print 'utils.stop() onTup = ', onTup
print 'utils.stop() tag_play_tup = ', self.tag_play_tup
#ka...3800 Temporary 2007.04.04 For play ring using playulaw
onTup = False
if onTup == True and runtime.vdciapp != None and self.tag_play_tup != 0 :
if self.tag_play_tup==1: # wav
self.stop_on_tup()
elif self.tag_play_tup==2: # amr
self.stop_amr_on_tup()
self.tag_play_tup = 0
if not config.dual_audio_volume:
if status.phone_status != status.VoiceConnected:
setting.set_volume(setting.audio_volume)
else:
#ka...3800 Temporary 2007.04.04 For play ring using playulaw
if self.tag_play_tup==1: # wav
self.stop_on_tup()
if config.utils_debug: print 'STOP media!!!!!! in utils.stop()!'
# eicho add 06.05.29
if self.camera_ok_timer:
self.camera_ok_timer = None
'''
if self.camera_pid:
if config.utils_debug: print 'camera preview_stop()'
self.preview_stop()
'''
self.preview_stop()
if not self.pid:
return
if pid != '' and self.pid != pid:
return
if config.utils_debug:
print 'child handler', self.old_sigchild
if self.old_sigchild != None:
if config.utils_debug:
print 'sigchild reset'
signal.signal(signal.SIGCHLD, self.old_sigchild)
self.old_sigchild = None
if config.utils_debug:
print 'stop melody: pid =', self.pid
if self.amr != None:
self.amr_end()
return
# KT DEMO 20080125
if self.mp3 != None:
self.mp3_end()
return
elif self.videopid != None:
#Roxia Begin cmlim 06.06.14
#self.video_end(False)
if bmwi and (runtime.manager.stage.name == 'videorecordstage' or runtime.manager.stage.name == 'video preview'):
pass
else:
self.video_end(False)
#Roxia End cmlim 06.06.14
return
# eicho add 06.05.27
elif self.camera_pid:
self.preview_stop()
return
# eicho add 06.06.02
elif self.amr_chg != None:
#self.stop_change_amr()
self.change_amr_end()
else:
# KA: [20080219]
# print 'ka...######## NO PID ---- wav!!'
# runtime.SP_context.SP_stopPlayback()
# spkOnHook = runtime.SP_context.SPK_OnHook()
# if spkOnHook.next():
# spkOnHook.next()
# spkOnHook.next()
# 0418 - vol 조절을 kill 한 다음으로 순서 변경
try:
os.kill(self.pid, signal.SIGKILL)
if config.utils_debug:
print 'now call waitpid', self.pid
os.waitpid(self.pid, 0)
except:
if config.utils_debug:
print 'fail to kill!!!'
# if not config.dual_audio_volume:
# if status.phone_status != status.VoiceConnected:
# setting.set_volume(setting.audio_volume)
# end
'''
if config.utils_debug:
print 'before dspg_state = ', runtime.dspg.get_state()
state = runtime.dspg.get_state()
if self.old_dspg_state != None and \
state != runtime.dspg.ST_V_HS_OFFHK_LPLAY and state != runtime.dspg.ST_HS_OFFHK:
runtime.dspg.set_state(self.old_dspg_state)
self.old_dspg_state = None
if config.utils_debug:
print 'after dspg_state = ', runtime.dspg.get_state()
'''
self.pid = None
#status.supervision_not_allowed = 0
def playing(self):
# answer delay 06.05.17
if self.tag_play_tup != 0:
return True
return self.pid
def play_video(self, file, xres, yres, xpos, ypos, vol_index=None, gallery=False):
if vol_index == None:
vol_index = setting.stereo_volume
if gallery:
vol = config.stereo_volume[vol_index-1] + 3
else:
vol = config.stereo_volume[vol_index-1]
runtime.SP_context.SP_stereoPlayback()
runtime.mmedia.unload()
runtime.mmedia.video_play(file, vol, xres, yres, xpos, ypos)
def stop_video(self):
# print "[yylee debug] utils.stop_video invoked"
runtime.mmedia.video_stop()
runtime.SP_context.SP_stereoStopPlayback()
#runtime.mmedia.unload()
#def msgPlayClear(self):
# self.msgPlayTimer = None
def play_message_effect(self, message_effect_file=None, vol_index=None):
path = config.message_effect_dir
if setting.message_effect_file:
message_effect_file = setting.message_effect_file
else:
message_effect_file = config.message_effect_default
def file_check():
filename = message_effect_file.split(path)[1]
# 무음.wav인 경우 음원이 존재하더라도 play하지 않는다.
if filename[-5] not in ('1', '2', '3', '4', '5'):
return False
for name in os.listdir(path):
if name == filename:
return True
return False
if not file_check():
return
# 5초내에 들어오는 메시지는 소리를 무시
#if self.msgPlayTimer:
# return
#self.msgPlayTimer = Timer(5*1000, self.msgPlayClear)
from mmiSoundPath import SP_Context
from dectHandler import DectCallManager
baseCallStatus, baseStatus, dectCallStatus, dectStatus = status.getCurrentCallStatus()
# 통화 중과 아닌 경우를 기준으로 구분한다.
# autoanswering과 transfering은 제외한다.
if (baseStatus == SP_Context.CONNECTED or dectStatus == DectCallManager.CONNECTED) and \
status.AutoAnswering == False and dectStatus != DectCallManager.TRANSFER_RINGING and baseStatus != SP_Context.TRANSFER_RINGING:
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RING_WAV, code2=config.MESG_PLAY_START_TUP, mesg1=message_effect_file, mesg2='1')
else:
devices = runtime.SP_context.getCurrentDevice()
play_path = '1'
for device in devices:
from mmiSoundPath import SP_State
if device == SP_State.DEVICE_HS:
play_path = '0'
elif device == SP_State.DEVICE_SPK:
play_path = '1'
else:#device == SP_State.DEVICE_HSS1_TS1:
play_path = '1'
# QA: SMS볼륨, 효과음 볼륨을 따르도록 한다.
vol = setting.effect_volume
command = 'playulaw' + ' ' + message_effect_file + ' ' + play_path + ' ' + str(vol)
os.system(command)
def play_effect(self, is_ok, effect_index=None, vol_index=None):
dir = ''
if effect_index == None:
effect_index = setting.setting_effect_index
if effect_index == 0: # Mute
return True
if effect_index == 1:
dir = config.effect_dir + '01/'
elif effect_index == 2:
dir = config.effect_dir + '02/'
elif effect_index == 3:
dir = config.effect_dir + '03/'
else:
print "[yylee error] setting effect setting error - index:", setting.setting_effect_index
return False
path = dir
if is_ok == 1:
path += 'OK.mp3'
else:
path += 'NOK.mp3'
runtime.SP_context.SP_stereoPlayback()
runtime.mmedia.audio_stop()
if vol_index != None:
runtime.mmedia.audio_play(path, config.effect_sound[vol_index-1])
else:
runtime.mmedia.audio_play(path, config.effect_sound[setting.effect_volume-1])
def play_keytone(self, key, keytone_index=None, vol_index=None):
#######################################################
# need to add some stage constraints not to play keytone in some stages.
curr_stage_name = runtime.manager.stage.get_name()
if curr_stage_name == 'myann':
# print "[yylee debug] not to play keyton for browser in the ",curr_stage_name
if vol_index != None:
pass
elif keytone_index != None:
pass
elif key == config.Red:
# print "[yylee debug] play RED keyton for browser in the ",curr_stage_name
pass
else:
return True
if curr_stage_name == 'videorecordstage' or\
curr_stage_name == 'video preview' or\
curr_stage_name == 'videoplaystage' or\
curr_stage_name == 'incomingcall' or\
curr_stage_name == 'callconnecting' or\
curr_stage_name == 'AudioCallConnecting'or\
curr_stage_name == 'AudioCallConnected' or\
curr_stage_name == 'AudioCallTerminated' or \
curr_stage_name == 'VideoCallConnecting' or\
curr_stage_name == 'VideoCallConnected' or\
curr_stage_name == 'VideoCallTerminated' or\
curr_stage_name == 'VideoCallImpossible' or\
curr_stage_name == 'directaudiocalling' or\
curr_stage_name == 'directvideocalling' or\
curr_stage_name == 'CallConference' or\
curr_stage_name == 'SecondIncomingCall' or\
curr_stage_name == 'TwoCallOneHold' or\
curr_stage_name == 'CallHold' or\
curr_stage_name == 'BackToConnected' or\
curr_stage_name == 'ReleaseHoldBackToConnected' or\
curr_stage_name == 'photorelatedstage' or\
curr_stage_name == 'audioreadystage' or\
curr_stage_name == 'display alarm stage' or\
curr_stage_name == 'audiorelatedstage' or\
curr_stage_name == 'B2H_TransferStage' or\
curr_stage_name == 'enblock edit' or\
curr_stage_name == 'H2B_Transfer' or \
curr_stage_name == 'new_select_effect':
#curr_stage_name == 'audio volume' or\
#curr_stage_name == 'new_select_bell' or\
#curr_stage_name == 'handset volume' or\
#curr_stage_name == 'EditGroupBell' or\
#curr_stage_name == 'speaker volume' or\
#curr_stage_name == 'stereo volume' or\
#curr_stage_name == 'keytone volume' or\
#curr_stage_name == 'effect volume' or\
#curr_stage_name == 'alarm volume' or\
#curr_stage_name == 'new_select_effect' or\
#curr_stage_name == 'EditGroup' or\
#curr_stage_name == 'addphonebook' or\
# print "[yylee debug] not to play keyton in the ",curr_stage_name
'''
if vol_index != None:
pass
elif keytone_index != None:
pass
else:
return True
'''
#print 'ka...........key/vol_index/keytone_index=', key, keytone_index, keytone_index
if vol_index == None and keytone_index == None:
return True
else:
pass
# OffHook 상태로 DialTone을 듣고 있는 경우에는 keytone play를 하지 않는다.
try:
if '0' in open('/proc/driver/hook_sense').read():
return True
except:
pass
# 통화중인 경우에 keytone play는 하지 않는다.
baseCallStatus, baseStatus, dectCallStatus, dectStatus = status.getCurrentCallStatus()
from mmiSoundPath import SP_Context
if baseStatus != SP_Context.IDLE:
return True
# Enblock Stage 위에 올려지는 stage는 keytone play를 하지 않는다.
if runtime.manager.find_stage('enblock edit'):
return True
if keytone_index == None:
keytone_index = setting.button_effect_index
if keytone_index == 0: # Mute
return True
if curr_stage_name == 'CheckPassword' or\
curr_stage_name == 'password setting stage':
key = '*'
#######################################################
# print "[yylee debug] play keytone: %s index:%d" % (key,keytone_index)
dir = ''
if keytone_index == 1:
dir = config.keytone_dir + '01/'
elif keytone_index == 2:
dir = config.keytone_dir + '02/'
elif keytone_index == 3:
dir = config.keytone_dir + '03/'
elif keytone_index == 4:
dir = config.keytone_dir + '04/'
else:
print "[yylee error] buttone effect setting error - index:", keytone_index
return False
path = dir
if key == '1':
path += '1.mp3'
elif key == '2':
path += '2.mp3'
elif key == '3':
path += '3.mp3'
elif key == '4':
path += '4.mp3'
elif key == '5':
path += '5.mp3'
elif key == '6':
path += '6.mp3'
elif key == '7':
path += '7.mp3'
elif key == '8':
path += '8.mp3'
elif key == '9':
path += '9.mp3'
elif key == '0':
path += '0.mp3'
elif key == '*':
path += 'star.mp3'
elif key == '#':
path += 'sharp.mp3'
elif key in ('Up', 'Down'):
path += 'updown.mp3'
elif key in ('Left', 'Right'):
path += 'leftright.mp3'
elif key == 'OK':
path += 'ok.mp3'
elif key == '\b' or key == 'CLR':
path += 'clear.mp3'
elif key == config.Green:
path += 'green.mp3'
elif key == config.Red:
path += 'red.mp3'
elif key in ('F1', 'F2', 'SOFT3', 'SOFT4', 'F7', 'F8', 'F9', 'F10', 'DOWNTOWN', 'INFORMATION'):
path += 'soft.mp3'
else:
return True
print 'PLAY PLAY PLAY'
from mmiSoundPath import SP_State
currentDevices = runtime.SP_context.getCurrentDevice()
if len(currentDevices) == 1 and SP_State.DEVICE_HS in currentDevices:
pass
else:
runtime.SP_context.SP_stereoPlayback()
if vol_index != None:
runtime.mmedia.audio_play(path, config.keytone[vol_index-1])
else:
runtime.mmedia.audio_play(path, config.keytone[setting.keytone_volume-1])
def amr_play(self, filename, loop=True):
#status.supervision_not_allowed = 1
if filename.lower().endswith('.mp4'):
_loop = -1
if not loop:
_loop = 1
runtime.SP_context.SP_stereoPlayback()
# yylee: cleanup ept resources before recply
runtime.mmedia.unload()
runtime.mmedia.audio_play(filename, config.stereo_volume[setting.stereo_volume])
self.amr = 9999
self.pid = self.amr
return self.pid
'''
if filename.lower().endswith('.amr'):
_loop = -1
if not loop:
_loop = 1
# yylee: cleanup ept resources before recply
runtime.mmedia.unload()
com = "/usr/local/bin/recply %d 1 1 "%_loop + "%r"%filename
self.amr = os.popen(com, "w")
self.pid = self.amr
return self.pid
'''
def amr_record_ready(self, testmode=False):
#status.supervision_not_allowed = 1
#tmp_file = '/usr/local/lgvp/arec.mp4'
tmp_file = '/usr/local/lgvp/arec.amr'
try:
#remove('/usr/local/lgvp/arec.amr')
remove(tmp_file)
except:
pass
# KA: [20080328] for testmode 미리 path를 변경한 경우 device존재
if testmode:
devices = runtime.SP_context.getCurrentDevice()
if not devices:
path = 0
spkOffHook = runtime.SP_context.SPK_OffHook()
if spkOffHook.next():
spkOffHook.next()
else:
# 현재는 OnHook case만 존재
path = 1
else:
path = 0
spkOffHook = runtime.SP_context.SPK_OffHook()
if spkOffHook.next():
spkOffHook.next()
# KA: [20080328] for testmode ==
runtime.SP_context.SP_startRecord()
# yylee: cleanup ept resources before recply
runtime.mmedia.unload()
'''
com = "/usr/local/bin/recply -1 1 0 /usr/local/lgvp/arec.3gp 0 0 0 0 %d "%path
self.amr = os.popen(com, "w")
'''
self.amr = 9999
self.pid = self.amr
return self.pid
def amr_record_start(self, use_hs_mic=False):
#status.supervision_not_allowed = 1
#tmp_file = '/usr/local/lgvp/arec.mp4'
tmp_file = '/usr/local/lgvp/arec.amr'
runtime.SP_context.SP_startRecord()
runtime.mmedia.unload()
runtime.mmedia.recorder_recordaudio(tmp_file, use_hs_mic)
'''
try:
self.amr.write("R\n")
self.amr.flush()
self.amr_record = self.amr
except:
pass
'''
def amr_end(self):
# KA: [20070730] media 사용중인 경우를 고려
# recording STOP
if self.amr != None:
runtime.mmedia.unload()
'''
try:
self.amr.write("E\n")
self.amr.flush()
self.amr.close()
except:
pass
'''
self.amr = None
self.pid = None
self.amr_record = None
spkOnHook = runtime.SP_context.SPK_OnHook()
if spkOnHook.next():
spkOnHook.next()
spkOnHook.next()
runtime.SP_context.SP_stopRecord()
# state = runtime.dspg.get_state()
# if self.dspg_state and state != runtime.dspg.ST_V_HS_OFFHK_LPLAY and state != runtime.dspg.ST_HS_OFFHK:
# runtime.dspg.set_state(self.dspg_state)
# self.dspg_state = None
# time.sleep(0.1)
else:
print 'ka..........######### Already ARM END'
#status.supervision_not_allowed = 0
def video_play(self, filename, pos, loop=True):
#status.supervision_not_allowed = 1
spkOffHook = runtime.SP_context.SPK_OffHook()
if spkOffHook.next():
spkOffHook.next()
runtime.SP_context.SP_startPlayback()
if self.viewfinder == None:
self.viewfinder = runtime.evas.rectangle()
self.viewfinder.layer = 1
self.viewfinder.color = (255, 255, 254, 255)
self.viewfinder.geometry = (pos[1], pos[0], pos[3]-pos[1], pos[2]-pos[0])
runtime.evas.use_transparency(True)
self.viewfinder.show()
if filename.lower().endswith(config.video_record_format):
_loop = -1
if not loop:
_loop = 1
# yylee: cleanup ept resources before recply
runtime.mmedia.unload()
com = "/usr/local/bin/recply %d 0 1 %s"%(_loop, filename) + " %d %d %d %d"%(pos[0], pos[1], pos[2], pos[3])
self.videopid = os.popen(com, "w")
self.pid = self.videopid
#print 'ka...........video_play com=', com
return self.pid
# KA: [20070724] audio_play 추가
def audio_play(self, filename, pos, loop=True):
#status.supervision_not_allowed = 1
# KA: [20080328] for testmode
devices = runtime.SP_context.getCurrentDevice()
if devices:
pass
else:
# KA: [20080328] for testmode ==
spkOffHook = runtime.SP_context.SPK_OffHook()
if spkOffHook.next():
spkOffHook.next()
runtime.SP_context.SP_startPlayback()
# yylee: cleanup ept resources before recply
if runtime.mmedia != None:
runtime.mmedia.unload()
# KA: [20070730] media 사용중인 경우를 고려
# if filename.lower().endswith('.3gp') and not os.access('/var/run/vengine.id', os.R_OK):
if not os.access('/var/run/vengine.id', os.R_OK):
_loop = -1
if not loop:
_loop = 1
com = "/usr/local/bin/recply %d 1 1 %s"%(_loop, filename) + " %d %d %d %d"%(pos[0], pos[1], pos[2], pos[3])
self.amr = os.popen(com, "w")
self.pid = self.amr
#print 'ka...........audio_play com=', com
return self.pid
else:
print 'ka..........######### Already PLAYING'
def play_mp3(self, filename, pos, loop=True):
runtime.SP_context.SP_stereoPlayback()
# yylee: cleanup ept resources before recply
if runtime.mmedia != None:
runtime.mmedia.unload()
if not os.access('/var/run/vengine.id', os.R_OK):
_loop = -1
if not loop:
_loop = 1
#print 'ka...##### play mp3'
com = "/usr/local/bin/recply %d 1 1 %s"%(_loop, filename) + " %d %d %d %d"%(pos[0], pos[1], pos[2], pos[3])
self.mp3 = os.popen(com, "w")
self.pid = self.mp3
return self.pid
else:
print 'ka..........######### Already PLAYING'
def mp3_end(self):
if self.mp3 != None:
try:
self.mp3.write("E\n")
self.mp3.flush()
self.mp3.close()
except:
pass
self.mp3 = None
self.pid = None
self.amr_record = None
runtime.SP_context.SP_stereoStopPlayback()
def video_record_ready(self, pos):
#status.supervision_not_allowed = 1
try:
if config.video_record_format == '3gp':
remove('/usr/local/lgvp/avrec.3gp')
elif config.video_record_format == 'mp4':
remove('/usr/local/lgvp/avrec.mp4')
else:
remove('/usr/local/lgvp/avrec.3gp')
except:
pass
# self.dspg_state = runtime.dspg.get_state()
# runtime.dspg.set_state(runtime.dspg.ST_MENU_REC)
# yylee: cleanup ept resources before recply
runtime.mmedia.unload()
if self.viewfinder == None:
self.viewfinder = runtime.evas.rectangle()
self.viewfinder.layer = 1
self.viewfinder.color = (255, 255, 254, 255)
xpos = pos[1]
ypos = pos[0]
xres = pos[3]-pos[1]
yres = pos[2]-pos[0]
#self.viewfinder.geometry = (pos[1], pos[0], pos[3]-pos[1], pos[2]-pos[0])
self.viewfinder.geometry = (xpos, ypos, xres, yres)
runtime.evas.use_transparency(True)
self.viewfinder.show()
spkOffHook = runtime.SP_context.SPK_OffHook()
if spkOffHook.next():
spkOffHook.next()
runtime.SP_context.SP_startRecord()
'''
self.videopid = os.popen('/usr/local/bin/recply -1 0 0 /usr/local/lgvp/avrec.3gp %d %d %d %d 2 0 %d'%(pos[0], pos[1], pos[2], pos[3], setting.video_record_res), 'w')
self.pid = self.videopid
'''
runtime.mmedia.recorder_preview(setting.video_record_res, xres, yres, xpos, ypos)
self.videopid = 9999
self.pid = self.videopid
return self.pid
def video_record_start(self):
#status.supervision_not_allowed = 1
print 'ka...############## Video_record_start'
if self.videopid != None:
#tmp_file = '/usr/local/lgvp/avrec.mp4'
if config.video_record_format == '3gp':
tmp_file = '/usr/local/lgvp/avrec.3gp'
elif config.video_record_format == 'mp4':
tmp_file = '/usr/local/lgvp/avrec.mp4'
else:
tmp_file = '/usr/local/lgvp/avrec.3gp'
runtime.SP_context.SP_startRecord()
runtime.mmedia.recorder_recordvideo(tmp_file)
self.video_record_save = True
self.videopid_record = self.videopid
'''
try:
self.videopid.write("R\n")
self.videopid.flush()
self.video_record_save = True
self.videopid_record = self.videopid
except:
pass
'''
def video_end(self, isthumb=True):
# KA: [20070730] media를 정리중인 경우를 고려
if self.videopid != None and os.access('/var/run/vengine.id', os.R_OK):
runtime.mmedia.unload()
'''
try:
print 'ka....................video_end'
self.videopid.write("E\n")
self.videopid.flush()
self.videopid.close()
except:
pass
'''
# import time
# time.sleep(10)
if self.video_record_save and isthumb:
if config.video_record_format == '3gp':
self.create_thumb('/usr/local/lgvp/avrec.3gp')
elif config.video_record_format == 'mp4':
self.create_thumb('/usr/local/lgvp/avrec.mp4')
else:
self.create_thumb('/usr/local/lgvp/avrec.3gp')
self.video_record_save = False
self.videopid = None
self.pid = None
self.videopid_record = None
if self.viewfinder != None:
self.viewfinder.hide()
runtime.evas.use_transparency(False)
spkOnHook = runtime.SP_context.SPK_OnHook()
if spkOnHook.next():
spkOnHook.next()
spkOnHook.next()
runtime.SP_context.SP_stopRecord()
# state = runtime.dspg.get_state()
# if self.dspg_state and state != runtime.dspg.ST_V_HS_OFFHK_LPLAY and state != runtime.dspg.ST_HS_OFFHK:
# runtime.dspg.set_state(self.dspg_state)
# self.dspg_state = None
# time.sleep(0.3)
else:
if self.viewfinder != None:
self.viewfinder.hide()
runtime.evas.use_transparency(False)
#print 'ka.....................pass Already Call VIDEO_END'
# KA: [20070730] media를 정리중인 경우를 고려 ==
#status.supervision_not_allowed = 0
#################################
# answer delay 수정을 위해 변경된 부분. start
#################################
def preview_start(self, pos=None):
# answer delay 06.05.29
if config.utils_debug:
print 'check camera enabled'
if self.viewfinder == None:
self.viewfinder = runtime.evas.rectangle()
self.viewfinder.geometry = (0,0,480,272)
self.viewfinder.layer = 1
self.viewfinder.color = (255, 255, 254, 255)
#self.viewfinder.color = (0, 0, 8, 255)
self.position = pos
self.camera_ok_timer = None
self.preview_wait_EC = False
if self.is_enable_camera():
self.camera_ok_timer = Timer(50, self.is_enable_camera)
def is_enable_camera(self):
if os.access('/proc/video/running', os.R_OK):
if config.utils_debug: print 'can not use CAMERA!!!'
self.camera_cnt = self.camera_cnt +1
if self.camera_cnt > 15 :
if config.utils_debug: print 'STOP trying to catch camera - 1)'
return False
#return False
return True
if os.access('/proc/audio_check', os.R_OK):
if config.utils_debug: print 'can not use AUDIO!!!'
self.camera_cnt = self.camera_cnt +1
if self.camera_cnt > 15 :
if config.utils_debug: print 'STOP trying to catch camera - 2)'
return False
return True
self.run_camera(self.position)
return False
###################################################################
def run_camera(self, pos=None):
self.camera_ok_timer = None
self.camera_cnt = 0
if config.utils_debug:
print 'picture preview start'
# yylee: cleanup ept resources before ci-capture
runtime.mmedia.unload()
import uiconfig
if setting.photo_quality == 0:
cam_mode = config.STILL_CAPTURE_MODE_QVGA
style = uiconfig.cam_cap_style_normal
elif setting.photo_quality == 1:
cam_mode = config.STILL_CAPTURE_MODE_VGA
style = uiconfig.cam_cap_style_wide
elif setting.photo_quality == 2:
cam_mode = config.STILL_CAPTURE_MODE_VGA
style = uiconfig.cam_cap_style_big
elif setting.photo_quality == 3:
cam_mode = config.STILL_CAPTURE_MODE_QQVGA
style = uiconfig.cam_cap_style_small
elif setting.photo_quality == 4:
cam_mode = config.STILL_CAPTURE_MODE_CIF
style = uiconfig.cam_cap_style_cif
else:
print "unknown photo quality", setting.photo_quality
setting.photo_quality = 0
style = cam_cap_style_normal
#self.camera_pid = self.run("ci-capture", "ci-capture", style[0], style[1], style[4], style[5], '25000',style[2],style[3])
#runtime.evas.set_clip(int(style[4]), int(style[5]), int(style[2]),int(style[3]))
runtime.mmedia.still_preview(cam_mode, int(style[2]),int(style[3]), int(style[4]), int(style[5]))
if self.viewfinder != None:
runtime.evas.use_transparency(True)
if setting.photo_quality == 2:
self.viewfinder.geometry = (int(style[4]), int(style[5])+1, int(style[2]), int(style[3])-1)
else:
self.viewfinder.geometry = (int(style[4]), int(style[5]), int(style[2]), int(style[3]))
self.viewfinder.show()
# apply camera brghtness and white balance settings
camera_brightness_set(setting.camera_brightness)
camera_wb_set(setting.camera_white_balance)
'''
#xpos = 72
#ypos = 40
xpos = 0
ypos = 0
if pos:
xpos = 320 - (176 + pos[0])
ypos = pos[1]
if setting.photo_quality == 0: # normal
self.camera_pid = self.run("ci-capture", "ci-capture", "480", "272", str(xpos), str(ypos), '25000', '480', '248')
#self.camera_pid = self.run("ci-capture", "ci-capture", "176", "144", str(xpos), str(ypos))
runtime.evas.set_clip(xpos, ypos, 480, 272)
else:
self.camera_pid = self.run("ci-capture", "ci-capture", "320", "240", str(xpos), str(ypos))
runtime.evas.set_clip(xpos+8, ypos+12, 160, 120)
'''
runtime.evas.render_now()
def check_stop_media(self):
self.stop()
# eicho add 11.22
# kill process related 'playing video' from 'videos.PlayStage'
curr_stage_name = runtime.manager.stage.get_name()
if curr_stage_name =='videorecordstage' or curr_stage_name =='video preview' or curr_stage_name == 'videoplaystage':
runtime.manager.stage.stop_play()
# end.
loop_cnt =0
#import time
while loop_cnt < 3:
time.sleep(0.1) #sleep 100 msec.
loop_cnt = loop_cnt + 1
if os.access('/proc/video/running', os.R_OK):
if config.utils_debug: print 'debug) check_stop_media - FAIL - using video '
continue
if os.access('/proc/audio_check', os.R_OK):
if config.utils_debug: print 'debug) check_stop_media - FAIL - using audio '
continue
return True
if config.utils_debug: print 'debug) check_stop_media - FAIL overcount'
return False
def is_using_media(self):
if os.access('/proc/video/running', os.R_OK):
if config.utils_debug: print 'debug) check_stop_media - FAIL - using video '
# someone already use video device.
return True
if os.access('/proc/audio_check', os.R_OK):
# someone already use audio device
if config.utils_debug: print 'debug) check_stop_media - FAIL - using audio '
return True
if self.amr_chg != None:
if config.utils_debug: print '### is_using_media!!! - self.amr_chg is not null ###'
return True
if runtime.manager.stage.get_name() == 'audio gallery' and runtime.manager.stage.player_pid != None:
if config.utils_debug: print '### is_using_media!!! - runtime.manager.stage.player_pid is not null ###'
return True
# eicho add 06.11.22
curr_stage_name = runtime.manager.stage.get_name()
if curr_stage_name == 'videoplaystage' and runtime.manager.stage.player_pid != None:
if config.utils_debug: print '### stage videoplay - player_pid is not None! ###'
return True
elif curr_stage_name =='videorecordstage' or curr_stage_name =='video preview' :
if config.utils_debug: print '### stage related to video media is on ###'
return True
# end.
return False
# answer delay end
# kill camera_pid
def preview_stop(self):
# print "[yylee debug] stop camera preview...mmedia unload now"
runtime.mmedia.unload()
# answer delay
self.camera_ok_timer = None
self.camera_cnt = 0
'''
if not self.camera_pid:
return
if config.utils_debug:
print 'picture preview stop'
try:
print 'ka.......KILL camera_pid=', self.camera_pid
# KA: [20070720] SIGKILL --> SIGTERM
#os.kill(self.camera_pid, signal.SIGTERM)
#runtime.evas.set_clip()
if self.viewfinder != None:
self.viewfinder.hide()
runtime.evas.use_transparency(False)
os.waitpid(self.camera_pid, 0)
except:
print 'Can not kill self.camera_pid=', self.camera_pid
'''
self.camera_pid = None
#status.supervision_not_allowed = 0
# camera pause and dump picture
def preview_pause(self):
#status.supervision_not_allowed = 1
if config.utils_debug:
print 'picture preview pause'
runtime.mmedia.still_capture()
runtime.mmedia.still_save_jpg()
time.sleep(1)
'''
if not self.camera_pid:
return
print 'ka.....######## ci-capture PREVIEW_PAUSE camera_pid=', self.camera_pid
try:
#ret = os.kill(self.camera_pid, signal.SIGUSR1) # for png capture
ret = os.kill(self.camera_pid, signal.SIGUSR2) # for jpg capture
time.sleep(1)
except:
print 'Can not kill self.camera_pid'
'''
def picture_capture(self, filename):
#status.supervision_not_allowed = 1
#tmpfile = '/tmp/ci-capture.png'
tmpfile = '/tmp/ci-capture.jpg'
# KA: [20070713] 파일 복사 tmp --> taken
# filename = '/usr/local/lgvp/'+filename
from mmsutils import MMS_filemove
MMS_filemove(tmpfile, filename)
return filename
'''
for i in range(15):
if os.access(tmpfile, os.R_OK):
break
time.sleep(0.3)
pid = self.run("imlib2_conv", "imlib2_conv",
tmpfile, filename)
os.waitpid(pid, 0)
remove_cmd('/tmp/*.png')
remove_cmd('/tmp/*.yuv420')
return filename
pid = self.run("pic-capture", "pic-capture", "176", "144",
config.image_taken_dir + filename,
'/tmp/cap.yuv422', '1')
os.waitpid(pid, 0)
return filename
'''
# KA: [20070713] 파일 복사 tmp --> taken ==
def clip_enable(self):
if self.viewfinder != None:
runtime.evas.use_transparency(True)
self.viewfinder.show()
def clip_disable(self):
if self.viewfinder != None:
self.viewfinder.hide()
runtime.evas.use_transparency(False)
def create_thumb(self, filename):
if not filename:
return False
for i in range(15):
if os.access(filename, os.R_OK):
break
time.sleep(0.3)
remove_cmd('*.yuv420')
remove_cmd('*.png')
path = os.path.split(filename)
image_file = path[-1]
dot = image_file.rfind('.')
if dot < 0 or image_file[dot+1:].lower() != config.video_record_format:
return False
if dot >=0:
image_file = image_file[:dot]
# KA: [20070719]
# os.system('get_thumb ' + filename + ' ' + '/tmp/%s.yuv420'%image_file)
if os.access('/var/run/vengine.id', os.R_OK):
print 'ka.................wait 2 second'
time.sleep(2)
#else:
#os.system('get_thumb ' + filename + ' ' + '/usr/local/lgvp/%s.png'%image_file)
image_file = '/usr/local/lgvp/%s.png'%image_file
runtime.mmedia.get_thumbnail( filename, image_file)
runtime.mmedia.unload()
print 'ka..............after get thumg'
'''
if os.access('/tmp/%s.yuv420'%image_file, os.R_OK):
if os.stat('/tmp/%s.yuv420'%image_file)[6] != 0:
print 'ka................pic-capture'
pid = self.run("pic-capture", "pic-capture", "176", "144",
'%s/%s.png'%(path[0],image_file), '/tmp/%s.yuv420'%image_file, '0')
os.waitpid(pid, 0)
return True
else:
return False
else:
return False
'''
def create_thumb_yuv(self, filename):
if not filename:
return False
self.thumb_filename = filename
for i in range(15):
if os.access(filename, os.R_OK):
break
time.sleep(0.3)
remove_cmd('*.yuv420')
remove_cmd('*.png')
path = os.path.split(filename)
image_file = path[-1]
dot = image_file.rfind('.')
if dot < 0 or image_file[dot+1:].lower() != config.video_record_format:
return False
if dot >=0:
image_file = image_file[:dot]
image_file = '/usr/local/lgvp/%s.png'%image_file
runtime.mmedia.get_thumbnail( filename, image_file)
runtime.mmedia.unload()
return True
'''
self.thumb_yuv = os.fork()
if self.thumb_yuv == 0:
try:
command = ('get_thumb','get_thumb',) + (filename,) + ('/tmp/avrec.yuv420',)
os.execlp("get_thumb","get_thumb", "%s"%filename, "/tmp/avrec.yuv420")
return True
except:
self.thumb_yuv = None
os._exit(1)
return False
else:
#os.waitpid(0, os.WNOHANG)
return True
return False
'''
def create_thumb_png(self, filename):
import mmsconfig
path = os.path.split(filename)
image_path = ''
if path[0] == mmsconfig.mms_temp_message[:-1]:
image_path = mmsconfig.mms_temp_message
elif path[0] == config.video_recorded_dir[:-1]:
image_path = config.video_recorded_thumnail_dir
else:
image_path = config.video_received_thumnail_dir
image_file = path[-1]
dot = image_file.rfind('.')
if dot < 0 or image_file[dot+1:].lower() != '3gp':
return 0
if dot >=0:
image_file = image_file[:dot]
if os.access('/tmp/avrec.yuv420', os.R_OK):
if os.stat('/tmp/avrec.yuv420')[6] == 0:
return 0
else:
self.thumb_png = os.fork()
if self.thumb_png == 0:
try:
os.execlp("pic-capture", "pic-capture", "176", "144",
"%s%s.png"%(image_path,image_file), "/tmp/avrec.yuv420", "0")
return 1
except:
os._exit(1)
self.thumb_png = None
if config.utils_debug:
print 'create_png fork() fail - 0'
return 0
else:
os.waitpid(0, os.WNOHANG)
return 1
return 0
else:
return 2
def delete_thumb(self, isyuv=True):
if self.thumb_yuv and isyuv:
try:
os.kill(self.thumb_yuv, signal.SIGKILL)
os.waitpid(self.thumb_yuv, 0)
except:
pass
self.thumb_yuv = None
if self.thumb_png:
try:
os.kill(self.thumb_png, signal.SIGKILL)
os.waitpid(self.thumb_png, 0)
except:
pass
self.thumb_png = None
def videocall_capture(self):
#status.supervision_not_allowed = 1
date = "photo"
findex = setting.photo_serial
while 1:
filename = date + "%03d" % findex
if not os.access(config.image_taken_dir + filename + '.jpg', os.R_OK):
break
findex = (findex + 1) % 1000
setting.photo_serial = findex + 1
time.sleep(0.5)
fileSize = 0
for i in range(300):
if os.access('/tmp/cap.yuv420', os.R_OK):
fileSize = os.stat('/tmp/cap.yuv420')[6]
if fileSize != 0:
break
# KA:[20081111]QA8-7: video capture파일이 생성이 안된 경우:
if fileSize == 0:
return False
# os.stat(filename)[6]
CIFsize = 352 * 288 * 3 / 2
QCIFsize = 176 * 144 * 3 / 2
if fileSize == CIFsize:
size = "352 288"
else:
size = "176 144"
# 352 288 / 176 144
#command = "pic-capture" + ' ' + size+ ' '+ '/tmp/' + filename + '.png' + ' ' + '/tmp/cap.yuv420'+ ' ' +'0'
command = "pic-capture" + ' ' + size+ ' '+ '/tmp/' + filename + '.jpg' + ' ' + '/tmp/cap.yuv420'+ ' ' +'0'
os.system(command)
from mmsutils import MMS_filemove
try:
MMS_filemove('/tmp/'+filename + '.jpg', config.image_taken_dir + filename + '.jpg')
except:
#runtime.manager.change_stage(NotifyStage(_('Save failed'), uiconfig.baloon_record_icon))
return False
remove_cmd('/tmp/*.jpg')
remove_cmd('/tmp/*.yuv420')
return config.image_taken_dir + filename + '.jpg'
# KA: [20070725] video capture ==
def play_message(self, play_error=False):
#status.supervision_not_allowed = 1
#import profile
if profile.ip_mode == 1:
if play_error == 'busy':
import vdciapp
vdciapp.vdcitone_play_tone(config.PLAY_BUSY_TONE)
return
elif play_error == 'cg':
import vdciapp
vdciapp.vdcitone_play_tone(config.PLAY_CG_TONE)
return
elif play_error == 'connecting':
pass
else:
#play_message is skip for VoIP call
return
dspg = runtime.dspg
message_dir = './audios/messages/'
play_file = ''
if play_error != 'connecting' and play_error:
if setting.lang == 'English':
play_file = 'M6_Eng.wav'
else:
play_file = 'M6_Spa.wav'
else:
if setting.lang == 'English':
play_file = 'M3_Eng.wav'
else: # spanish
if runtime.vdciapp.caller:
play_file = 'M3_Spa.wav'
else:
play_file = 'M3_Spa2.wav'
play_file = message_dir + play_file
if self.pid:
self.stop_message()
if status.modem_audio_state == status.HS:
dspg.set_state(dspg.ST_V_HS_OFFHK_LPLAY)
elif status.modem_audio_state == status.SPK:
dspg.set_state(dspg.ST_V_SPK_OFFHK_LPLAY)
if play_error != 'connecting' and play_error:
def playover_signal_handler(sig, stack):
if self.pid:
pid, status = os.waitpid(self.pid, os.WNOHANG)
if pid <= 0:
# not us
return
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
self.stop_message(False)
signal.signal(signal.SIGCHLD, playover_signal_handler)
self.pid = self.run("playulaw", "playulaw", play_file)
else:
self.pid = self.run("playulaw", "playulaw", '--loop', play_file)
return False # for timer
def stop_message(self, cleanup_child=True):
import vdciapp
if vdciapp.vdcitone_is_playing():
vdciapp.vdcitone_stop_tone()
if not self.pid:
return
if cleanup_child:
self.amr_end()
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
try:
os.kill(self.pid, signal.SIGKILL)
os.waitpid(self.pid, 0)
except:# OSError:
pass
self.pid = None
dspg = runtime.dspg
def run(self, *command):
if config.utils_debug:
print 'command run', command
pid = os.fork()
if pid == 0:
try:
os.execlp(*command)
except:
os._exit(1)
return pid
# ka...3800 ringback--> tone play 2007.05.11
def start_ringback_tone(self, channel):
import status
self.current_tone_channel = status.get_current_channel()
runtime.vdci_send_mesg(code1=config.MESG_CALL_WAITING_CODE1, \
code2=config.MESG_CALL_WAITING_START, \
chan1=int(channel), \
mesg1='RINGBACK', \
mesg2=config.MESG_CALL_WAITING_MESG2)
# runtime.vdciapp.send_mesg(code1=config.MESG_CALL_WAITING_CODE1, \
# code2=config.MESG_CALL_WAITING_START, \
# chan1=self.current_tone_channel, \
# mesg1='RINGBACK', \
# mesg2=config.MESG_CALL_WAITING_MESG2)
return True
def stop_ringback_tone(self):
if self.ringback_tone_timer != None :
del(self.ringback_tone_timer)
self.ringback_tone_timer = None
# 06.07.07 change cwi tone.
'''
if self.current_tone_channel == 0 :
return
runtime.vdci_send_mesg(code1=config.MESG_CALL_WAITING_CODE1, \
code2=config.MESG_CALL_WAITING_STOP, \
chan1=self.current_tone_channel)
'''
#self.current_tone_channel = 0
# answer dealy modification - 06.05.15
def play_ringback_on_tup(self, loop=True):
if runtime.vdciapp == None:
return False
try :
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RINGBACK_TUP, \
code2=config.MESG_PLAY_START_TUP, \
mesg1='RINGBACK', mesg2=99)
return True
except :
print 'play_ringback_on_tup occurs exception!!!'
return False
def play_wav_on_tup(self, file):
if runtime.vdciapp == None:
return 0
try :
p_filename = config.audio_root_dir + file
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RING_WAV, \
code2=config.MESG_PLAY_START_TUP, \
mesg1=p_filename)
return 1
except :
print 'play_wav_on_tup occurs exception!!!'
return 0
def play_amr_on_tup(self, file):
if runtime.vdciapp == None:
return 0
try :
'''
p_filename = config.audio_root_dir + file
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RING_AMR, \
code2=config.MESG_PLAY_START_TUP, \
mesg1=p_filename)
return 2
'''
p_filename = config.audio_root_dir + self.change_name_audiowav(file)
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RING_WAV, \
code2=config.MESG_PLAY_START_TUP, \
mesg1=p_filename)
return 1
except :
print 'play_amr_on_tup occurs exception!!!'
return 0
def stop_on_tup(self):
if runtime.vdciapp == None:
if config.utils_debug: print 'Utils.stop_on_tup can not go on next step. vdciapp is null'
return
try :
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RING_WAV, \
code2=config.MESG_PLAY_STOP_TUP)
except :
print 'stop_on_tup occurs exception!!!'
def stop_amr_on_tup(self):
self.stop_on_tup()
'''
if runtime.vdciapp == None:
if config.utils_debug: print 'Utils.stop_amr_on_tup can not go on next step. vdciapp is null'
return
try :
runtime.vdciapp.send_mesg(code1=config.MESG_PLAY_RING_AMR, \
code2=config.MESG_PLAY_STOP_TUP)
except :
print 'stop_on_tup occurs exception!!!'
'''
########### add codes for set AMR as ring (wav) ### 06.06.01
def change_name_audiowav(self, file):
if file.startswith(config.audio_recorded_dir):
p_filename = file.replace(config.audio_recorded_dir, config.audio_amr2wav_recorded_dir)
elif file.startswith(config.audio_polyphonic_dir):
p_filename = file.replace(config.audio_polyphonic_dir, config.audio_amr2wav_polyphonic_dir)
elif file.startswith(config.audio_other_dir):
p_filename = file.replace(config.audio_other_dir, config.audio_amr2wav_other_dir)
else:
p_filename = file
return p_filename.replace('.amr', '.wav')
def chage_amr_wav(self, cmd):
#print '### AMR2WAV : command => ', cmd
self.amr_chg = os.popen(cmd, "w")
self.pid = self.amr_chg
return self.pid
def set_ring_amr(self, file_name):
#print '### set_ring_amr/file_name from sounds =', file_name
import status
if status.call_status == status.IncomingCall:
print '### AMR2WAV : Can not start during incoming call'
return ''
if self.pid:
#self.stop_change_amr(self.pid)
self.stop(self.pid)
fullfilename = self.change_name_audiowav(file_name)
if file_name.lower().endswith('.amr'):
command = "/usr/local/bin/amr2wav "+ config.audio_root_dir + file_name + " " + config.audio_root_dir + fullfilename
return self.chage_amr_wav(command)
self.pid = os.fork()
if self.pid == 0:
try:
os.execlp(*command)
except:
os._exit(1)
return self.pid
################## 06.07.25
def set_as_user_ring(self, file_name):
import status
if status.call_status == status.IncomingCall:
print '### AMR2WAV : Can not start during incoming call'
return False
try:
file_name = unicode(file_name, 'utf-8').encode('euc-kr')
except:
pass
if file_name.lower().endswith('.amr'):
fullfilename = self.change_name_audiowav(file_name)
command = "/usr/local/bin/amr2wav "+ config.audio_root_dir + file_name + " " + config.audio_root_dir + fullfilename
if config.utils_debug:
print '# set_as_user_ring) COMMAND: ', command
os.system(command)
return True
def set_as_ring_cmd(self, file_name):
#import time
#print '### start set_as_ring_cmd: ', time.asctime()
import status
if status.call_status == status.IncomingCall:
print '### AMR2WAV : Can not start during incoming call'
return ''
try:
file_name = unicode(file_name, 'utf-8').encode('euc-kr')
except:
pass
fullfilename = self.change_name_audiowav(file_name)
if file_name.lower().endswith('.amr'):
command = "/usr/local/bin/amr2wav "+ config.audio_root_dir + file_name + " " + config.audio_root_dir + fullfilename
os.system(command)
setting.external_ring = file_name
#print '### end set_as_ring_cmd: ', time.asctime()
def change_amr_end(self):
if self.amr_chg != None:
try:
self.amr_chg.write("E\n")
self.amr.flush()
self.amr.close()
except:
print '### change_amr_end : except writing flush'
self.amr_chg = None
self.pid = None
# eicho change sleep time to 500 msec. 06.07.25
# time.sleep(0.1)
time.sleep(0.5)
def stop_change_amr(self, pid=''):
if not self.pid:
return
if pid != '' and self.pid != pid:
return
if pid == None:
return
if self.amr_chg != None:
self.change_amr_end()
else:
try:
os.kill(self.pid, signal.SIGKILL)
if config.utils_debug:
print 'now call waitpid', self.pid
os.waitpid(self.pid, 0)
except:
if config.utils_debug:
print 'fail to kill!!!'
if not config.dual_audio_volume:
if status.phone_status != status.VoiceConnected:
setting.set_volume(setting.audio_volume)
self.pid = None
# KA: [20070816] play DTMF
def dtmf_ready(self):
# self.dspg_state = runtime.dspg.get_state()
# runtime.dspg.set_state(runtime.dspg.ST_MENU_REC)
if self.dtmf_play_pid:
return
self.dtmf_play_pid = os.popen('/usr/local/bin/play_dtmf', 'w')
# self.pid = self.dtmf_play_pid
return self.dtmf_play_pid
def dtmf_play(self, key):
print 'ka...############## dtmf_play key=', key
if not self.dtmf_play_pid:
self.dtmf_play_pid = os.popen('/usr/local/bin/play_dtmf', 'w')
if self.dtmf_play_pid != None:
#try:
self.dtmf_play_pid.write(key)
self.dtmf_play_pid.flush()
#self.video_record_save = True
#self.videopid_record = self.videopid
#except:
# pass
def dtmf_stop(self):
if self.dtmf_play_pid != None:
try:
self.dtmf_play_pid.write("E\n")
self.dtmf_play_pid.flush()
self.dtmf_play_pid.close()
except:
print '### change_DTMF_PLAY_end : except writing flush'
self.dtmf_play_pid = None
self.pid = None
# KA: [20070816] play DTMF ==
# end.
player = MelodyPlayer()
#시스템 시간을 바꿈
#시간변경시 'date' 실행권한 에러 발생함. 에러발생이후 indicator bar의 시간이 깜빡이지 않음
def set_time(year, mon, day, hour, min):
date_command = 'date %02d%02d%02d%02d%04d' % (mon, day, hour, min, year)
if config.utils_debug:
print date_command
os.system(date_command)
# SRS WOW-enable
def enable_srswow():
os.system('echo 1 > /proc/sys/srswow/enableWowHD')
setting.srswow_enable = 1
# SRS WOW-disable
def disable_srswow():
os.system('echo 0 > /proc/sys/srswow/enableWowHD')
setting.srswow_enable = 0
def is_srswow_enabled():
enable_file = '/proc/sys/srswow/enableWowHD'
if not os.access(enable_file, os.R_OK):
return False
enable = open(enable_file).read()
if enable == '':
return False
else:
if int(enable) > 0:
return True
return False
def get_srswow_preset():
preset_file = '/proc/sys/srswow/WowHD_preset'
if not os.access(preset_file, os.R_OK):
return 0
preset = open(preset_file).read()
if preset == '':
return 0
else:
preset_val = int(preset)
return preset_val
def set_srswow_preset(preset):
if preset > 5 or preset <0:
print "[utils.set_srswow_preset] invalid preset value", preset
return
preset_file = '/proc/sys/srswow/WowHD_preset'
cmd = "echo %d > %s"%(preset, preset_file)
os.system(cmd)
return
def usb_mount_ready():
os.system('echo 1 > /proc/sys/lvp3870/usb_uart_switch')
os.system('sync')
os.system('mount -t usbfs usbfs /proc/bus/usb/')
os.system('sync')
os.system('sync')
time.sleep(1)
def usb_mount(dev='/dev/sda1'):
os.system('mount -t vfat %s /mnt -o iocharset=cp949'%dev)
os.system('sync')
os.system('sync')
time.sleep(1)
os.system('cd /mnt')
def usb_umount():
os.system('cd /')
os.system('umount /mnt')
os.system('umount /proc/bus/usb')
os.system('sync')
os.system('echo 0 > /proc/sys/lvp3870/usb_uart_switch')
#lcdoff
def lcd_off():
if config.utils_debug:
print '*******************LCD OFF'
os.system('lcdoff 1')
status.lcdOn = False
#lcdon
def lcd_on():
if config.utils_debug:
print '*******************LCD ON'
os.system('lcdoff 0')
if runtime.manager != None:
runtime.manager.handle_lighting()
if not runtime.manager.in_night_mode:
runtime.manager.set_brightness(setting.brightness-1)
status.lcdOn = True
def check_lcd_on():
return status.lcdOn
#system reset
def system_reset(reboot=True):
setting.reset()
from phonedb import phonedb
phonedb.reset()
from speeddb import speeddb
speeddb.reset()
from groupdb import groupdb
groupdb.reset()
# shchun : remove first boot mark.
try:
os.system('rm -f /usr/etc/first_boot_done')
os.system('rm -f /usr/local/lgvp/mdown.cfg') # download setting
os.system('rm -f /usr/local/lgvp/cpeid.cfg')
# provision site and resync time file remove
os.system('rm -f %s'%(config.provision_url_site))
os.system('rm -f %s'%(config.provision_data))
os.system('cp -f /usr/etc/snmp/snmpd.ini /usr/etc/snmp/snmpd.conf')
os.system('cp -f /usr/etc/trapcontrol.ini /usr/etc/trapcontrol.conf')
os.system('sync')
except:
pass
import calldb
calldb.delete_db('all')
remove_dir(get_image_dir('wallpaper'))
remove_dir(get_image_dir('picture'))
#remove_dir(config.image_snapshot_dir)
remove_dir(get_audio_dir('recorded'))
remove_dir(get_audio_dir('poly'))
remove_dir(get_audio_dir('other'))
# record fils
remove_dir(get_image_dir('taken'))
remove_dir(config.video_recorded_dir)
remove_dir(config.audio_dir_recorded)
remove_dir(config.video_recorded_thumnail_dir)
remove_dir(config.video_received_thumnail_dir)
# eicho add 06.11.23 same as BT, remove amr2wav directory
remove_dir(config.audio_amr2wav_recorded_dir)
remove_dir(config.audio_amr2wav_polyphonic_dir)
remove_dir(config.audio_amr2wav_other_dir)
# for web
#remove_dir(config.image_web_dir)
#remove_dir(config.audio_web_dir)
#remove_dir(config.video_web_dir)
# down files by web
remove_dir(config.audio_dir_download)
remove_dir(config.image_received_dir)
remove_dir(config.video_received_dir)
## remove T9 added word
#remove_t9_word_list()
#remove_dir(get_email_dir('emailetc'))
#sms/mms
#remove_dir(config.vm_MMSC_dir)
os.system('rm -rf /usr/local/lgvp/store')
# for dect
status.DECT_RESET_TEST = True
print 'status.DECT_RESET_TEST :::: TRUE'
runtime.dectCallManager.sendFactoryReset()
if runtime.vdciapp and runtime.vdciapp.subscriber_success:
runtime.vdciapp.req_desubscriber()
time.sleep(1)
if runtime.vdciapp and status.get_register_mode() == status.Registered:
runtime.vdciapp.req_deregister()
time.sleep(1)
# profile reset, 리셋시 default 값이 정의되어야 함
from profile import profile, lan_profile, wifi_profile, dns_profile, wifi_profile_general
from vdcisetting import vdci_setting
lan_profile.reset()
#wifi_profile.reset()
# shchun: wifi_profile_general
wifi_profile_general.reset()
dns_profile.reset()
vdci_setting.reset()
profile.reset() # profile저장시 vdcisetting을 변경하므로 마지막에 수행함
#roxia_trace('wlstop')
#os.popen('wlstop')
#if runtime.vdciapp:
# runtime.vdciapp.kill_vdciapp()
# runtime.vdciapp = None
if reboot:
#MMW 2008.06.25 when reboot is called, reset vega and DCP related GPIO pin
vega_reset_together()
#end of MMW
#MMW 2008.07.07 when reboot send disassoc to AP and then unload the driver
os.system('wlstop')
#end of MMW
os.system('/usr/local/bin/reboot')
import sys
sys.exit()
else:
pass
#file, dir의 name을 바꿈
def rename(old_name, new_name):
if config.utils_debug:
print 'rename: ', old_name, new_name
try:
os.rename(old_name, new_name)
return True
except:
return False
#file을 지움
def remove(name):
if config.utils_debug:
print 'remove: ', name
try:
os.remove(name)
return True
except:
return False
def remove_cmd(name):
try:
cmd = 'rm %s' % name
os.system(cmd)
except:
pass
#dir을 만듬
def make_dir(dir_name):
if os.path.exists(dir_name):
return
dir = ''
for c in os.path.normpath(dir_name).split('/'):
dir += c + '/'
if not os.path.exists(dir):
os.mkdir(dir)
#dir_name안의 일반적인 파일들만 지움 (디렉토리를 지우는 것은 아니다)
def remove_dir(dir_name):
if config.utils_debug:
print 'remove dirs', dir_name
try:
if os.path.exists(dir_name):
for f in os.listdir(dir_name):
name = dir_name + f
stat = os.stat(name)
if stat[0] & 0100000:
if config.utils_debug:
print 'remove this file:', name
try:
os.remove(name)
except:
pass
except OSError:
pass
#전체적인 message를 지운다.
#def remove_messages(type = 'all'):#, isemail=True):
def remove_messages(type = 'all', isreset=True):
if type == 'sms':
from smsmanager import smsmgr
smsmgr.remove_all()
elif type == 'mms':
from mmsmanager import mmsmgr
mmsmgr.MMS_Remove_Allmsg()
elif type == 'ipemail':
from ipemailmanager import ipemailmgr
ipemailmgr.remove_all()
elif type == 'all':
from smsmanager import smsmgr
from mmsmanager import mmsmgr
from ipemailmanager import ipemailmgr
if isreset:
smsmgr.remove_all()
mmsmgr.MMS_Remove_Allmsg()
ipemailmgr.remove_all()
else:
from profile import profile
if profile.get_profile() == 0:
smsmgr.remove_all()
mmsmgr.MMS_Remove_Allmsg()
else:
ipemailmgr.remove_all()
else:
if config.utils_debug:
print 'Unknown type [%s]' % type
#assert False
#해당 파일 이름 name의 확장자를 얻어낸다(.은 빼고)
def get_ext(name):
last_dot = name.rfind('.')
return name[last_dot+1:]
#해당 디렉토리의 경로로 이미지의 타입을 얻어낸다
def image_type(name):
if name.startswith(config.image_taken_dir) or name.startswith(config.lgvp+config.image_taken_dir):
return 'taken'
elif name.startswith(config.image_picture_dir) or name.startswith(config.lgvp+config.image_picture_dir):
return 'picture'
elif name.startswith(config.image_wallpaper_dir) or name.startswith(config.lgvp+config.image_wallpaper_dir):
return 'wallpaper'
elif name.startswith(config.image_bg_dir) or name.startswith(config.lgvp+config.image_bg_dir):
return 'vdc'
elif name.startswith(config.image_received_dir) or name.startswith(config.lgvp+config.image_received_dir):
return 'received'
elif name.startswith(config.image_avatas_dir) or name.startswith(config.lgvp+config.image_avatas_dir):
return 'avatas'
def get_email_dir(type):
_email_paths = {'emailetc':config.ip_email_attach_etc_path}
return _email_paths[type]
#해당 이미지 타입으로 디렉토리를 얻어낸다
def get_image_dir(type):
_image_paths = {'taken': config.image_taken_dir,
'picture': config.image_picture_dir,
'wallpaper': config.image_wallpaper_dir,
'vdc': config.image_bg_dir,
'received': config.image_received_dir,
'avatas': config.image_avatas_dir,
'privacy': config.image_privacy_dir,
'sdmmc': config.sdmmc_conv_dir,
'usb': config.usb_dir}
return _image_paths[type]
def get_image_dir_by_index(type):
_image_paths = {1: config.image_avatas_dir,
2: config.image_bg_dir,
3: config.image_taken_dir,
4: config.image_received_dir}
return _image_paths[type]
#해당 오디오 타입으로 디렉토리를 얻어낸다
def get_audio_dir(type):
_audio_paths = {'ring': config.audio_def_dir,
'recorded': config.audio_recorded_dir,
'poly': config.audio_polyphonic_dir,
'other': config.audio_other_dir}
return _audio_paths[type]
# KA: [20080412] ring 관련
def get_ring_dir_list():
#return [_('None'), _('Basic bell'), _('Sweet bell'), _('Merry bell'), _('Classic bell'), _('Effect bell'), _('Download bell'), _('Recorded bell')]
return [_('None'), _('Basic bell'), _('Sweet bell'), _('Merry bell'), _('Classic bell'), _('Effect bell'), _('Recorded bell')]
def get_image_dir_list():
import uiconfig
return [_('None'), _('Avatas'), _('Basic Images'), _('My album'), _('Receive Images')]
# 실제 폰북에 저장된 image name값을 받은 경우
def get_image_dir_index(value='', dir_index=None):
if config.mmi_debug: print 'ka..............value =%s index=%s'%(value, dir_index)
if value!= '' and not os.access(value, os.R_OK):
if config.mmi_debug:
print '@@@@ file is not available'
return 0, [_('None'), ], 0
if dir_index in (0, 1, 2, 3, 4):
if dir_index == 0:
return [_('None'), ]
elif dir_index == 1:
path = config.image_avatas_dir
elif dir_index == 2:
path = config.image_bg_dir
elif dir_index == 3:
path = config.image_taken_dir
elif dir_index == 4:
path = config.image_received_dir
list = []
list = os.listdir(path)
list.sort()
return list
if value == 'None' or value.endswith('no_photo.png'):
value = ''
if value:
# full name을 주는 경우 (photos/bg/ or (photos/taken/ or photos/received)
if value.startswith('photos') or value.startswith('/usr/local/lgvp/photos'):
path =value.split('photos/')[1]
# 시작 Dir만 주는 경우 (Basic Bell)
else:
path = value
print path
if path.startswith('avatas'):
index = 1
path = config.image_avatas_dir
elif path.startswith('bg'):
index = 2
path = config.image_bg_dir
elif path.startswith('taken'):
index = 3
path = config.image_taken_dir
elif path.startswith('downloadimages') or path.startswith('received'):
index = 4
path = config.image_received_dir
#print '[utils] get_ring_dir_index=', index, path
list = []
list = os.listdir(path)
list.sort()
utf8_list = []
for i in list:
try:
i = unicode(i, 'euc-kr').encode('utf-8')
except:
pass
utf8_list.append(i)
# KA: [20080424] file index
file =value.split(path)[1]
file_index = list.index(file)
return index, utf8_list, file_index
else:
return 0, [_('None'), ], 0
def camera_wb_set(wb):
#cmd = "vc gencmd camera_control set_white_balance %d"%(wb)
cmd = "/usr/local/bin/camera_control.sh 6 %d"%(wb)
os.system(cmd + " &")
def camera_brightness_set(brightness):
#cmd = "vc gencmd camera_control set_brightness %d"%(brightness)
cmd = "/usr/local/bin/camera_control.sh 0 %d"%(brightness)
os.system(cmd + " &")
def get_ring_dir(type):
_audio_paths = {'Basic bell': config.audio_dir_basic,
'Sweet bell': config.audio_dir_sweet,
'Merry bell': config.audio_dir_merry,
'Classic bell': config.audio_dir_classic,
'Effect bell': config.audio_dir_effect,
'Download bell': config.audio_dir_download}
return _audio_paths[type]
def get_ring_dir_by_index(type):
_audio_paths = {1: config.audio_dir_basic,
2: config.audio_dir_sweet,
3: config.audio_dir_merry,
4: config.audio_dir_classic,
5: config.audio_dir_effect,
# 6: config.audio_dir_download,
6: config.audio_dir_recorded}
return _audio_paths[type]
# 실제 폰북에 저장된 ring name값을 받은 경우
def get_ring_dir_index(value):
#value = unicode(value, 'utf-8').encode('utf-8')
if value == 'None':
value = ''
if config.mmi_debug: print '## value =', value
if value!= '' and not os.access(value, os.R_OK):
if config.mmi_debug:
print '@@@@ file is not available'
return 0, [_('None'), ], 0
if value:
if value.startswith('audios/audios/recorded') or value.startswith('/usr/local/lgvp/audios/audios/recorded'):
value =value.split('audios/audios/')[1]
index = 7
path = config.audio_dir_recorded
else:
# full name을 주는 경우 (audios/ring/Basic Bell/XX.mid)
if value.startswith('audios') or value.startswith('/usr/local/lgvp/audios'):
value =value.split('audios/ring/')[1]
path = value
# 시작 Dir만 주는 경우 (Basic Bell)
else:
path = value
# -----BasicBell/sting.mid
if path.startswith('Basic'):
index = 1
path = config.audio_dir_basic
elif path.startswith('Sweet'):
index = 2
path = config.audio_dir_sweet
elif path.startswith('Merry'):
index = 3
path = config.audio_dir_merry
elif path.startswith('Classic'):
index = 4
path = config.audio_dir_classic
elif path.startswith('Effect'):
index = 5
path = config.audio_dir_effect
elif path.startswith('download'):
index = 6
path = config.audio_dir_download
#print '[utils] get_ring_dir_index=', index, path
#print 'ka........path=', path
list = []
_list = os.listdir(path)
for item in _list:
dot = item.rfind('.')
if dot >= 0:
item = item[:dot]
item = unicode(item, 'euc-kr').encode('utf-8')
list.append(item)
list.sort()
file = value.split('/')[1]
try:
file = unicode(file, 'euc-kr').encode('utf-8')
dot = file.rfind('.')
if dot >= 0:
file = file[:dot]
except:
pass
#print 'ka..............file=', file
#print 'ka..............list=', list
try:
file_index = list.index(file)
except:
file_index = 0
return index, list, file_index
else:
return 0, [_('None'), ], 0
def get_ring_list(dir_index):
if dir_index:
if dir_index == 1:
path = config.audio_dir_basic
elif dir_index == 2:
path = config.audio_dir_sweet
elif dir_index == 3:
path = config.audio_dir_merry
elif dir_index == 4:
path = config.audio_dir_classic
elif dir_index == 5:
path = config.audio_dir_effect
# elif dir_index == 6:
# path = config.audio_dir_download
elif dir_index == 6:
path = config.audio_dir_recorded
#print 'ka.........path = ', path
list = []
list = os.listdir(path)
list.sort()
return list
else:
return [_('None'), ]
def get_melody_fullname(dir, name):
list = os.listdir(dir)
try:
name = unicode(name, 'utf-8').encode('euc-kr')
except:
pass
for fname in list:
dot = fname.rfind('.')
if dot >= 0:
if fname[:dot] == name:
return fname
return None
def get_audio_gallery_list(type):
dirname = audio_paths[type]
return dirname, get_file_lists(dirname)
def get_image_gallery_list(type):
dirname = get_image_dir(type)
return dirname, get_file_lists(dirname)
def get_ext_image_gallery_list(type):
dirname = get_image_dir(type)
return dirname, get_ext_img_file_lists(dirname)
def get_jpg_image_gallery_list(type):
dirname = get_image_dir(type)
return dirname, get_ext_file_lists(dirname, '.jpg')
def get_video_dir(type):
_video_paths = {'recorded': config.video_recorded_dir, 'received':config.video_received_dir}
_video_thumb_paths = {'recorded': config.video_recorded_thumnail_dir, 'received':config.video_received_thumnail_dir}
return _video_paths[type], _video_thumb_paths[type]
#해당 디렉토리의 경로로 오디오의 타입을 얻어낸다
def audio_type(name):
if name.startswith(config.audio_def_dir):
return 'ring'
elif name.startswith(config.audio_recorded_dir):
return 'recorded'
elif name.startswith(config.audio_polyphonic_dir):
return 'poly'
elif name.startswith(config.audio_other_dir):
return 'other'
# KA: [20080125] KT ANN
elif name.startswith(config.mp3_dir):
return 'mp3'
#절대경로로 되어 있는 이미지 파일네임을 디렉토리와 파일명으로 분리한다
def split_image_name(name):
itype = image_type(name)
idir = get_image_dir(itype)
return idir, name[len(idir):]
#Roxia Begin smyook 06.05.09
def cut_text(text, width, font, with_punc=False):
#roxia_trace('>> cut_text orging:', text)
if text and text != '':
if text[0] == '\x03':
text = text[1:]
if text[-1:] == '\x03':
text = text[:-1]
new_text = ''
t = runtime.evas.text(text=text, font=font)
w = t.geometry[2]
if w > width:
while text:
# KA: [20070921] this conversion is required for Korean text
#text = text[:-1]
#text = (unicode(text, 'utf-8')[:-1]).encode('utf-8')
# shchun 2007.10.29 when interdomain call 'text' can be unicode string. this cause python exception.
if type(text) == type('abc'):
text = unicode(text, 'utf-8')[:-1]
else:
text = text[:-1]
text = text.encode('utf-8')
# end of shchun
if with_punc:
t.text = text + '...'
else:
t.text = text
if t.geometry[2] <= width:
if with_punc:
new_text = text + '...'
else:
new_text = text
break
else:
new_text = text
t.free()
return (new_text, font)
#Roxia End smyook
def get_real_lang_str(str_textid):
return runtime.evas.pre_parse(str_textid)
def cut_text_with_punc(text, width, font):
#List Item scroll, string의 앞이나 뒤에 붙은 0x03(^C) 문자를 제거한다
if text and text != '':
if text[0] == '\x03':
text = text[1:]
if text[-1:] == '\x03':
text = text[:-1]
new_text = ''
t = runtime.evas.text(text=text, font=font)
w = t.geometry[2]
if w > width:
while text:
# KA: [20070921] this conversion is required for Korean text
#text = text[:-1]
#text = (unicode(text, 'utf-8')[:-1]).encode('utf-8')
if type(text) == type('abc'):
text = unicode(text, 'utf-8')[:-1]
else:
text = text[:-1]
text = text.encode('utf-8')
t.text = text + '...'
if t.geometry[2] <= width:
new_text = text + '...'
break
else:
new_text = text
t.free()
return (new_text, font)
#text를 그려주는 사각 영역의 크기에 따라 fontsize를 조정해 주거나 길면 ...으로 표시해 준다
def resize_text(text, width, font, nocut = False):
if text.startswith('\x03') or nocut == True:
#번역이 될 문장이다. 뒷부분을 자르는 경우 문제가 됨.
t = runtime.evas.text(text=text, font=font)
name, fontsize = font
while t.geometry[2] > width:
fontsize -= 1
t.font = name, fontsize
# RHC / [20061012_1]
if fontsize == 1:
break
# RHC / [20061012_1]--
t.free()
return text, (name, fontsize)
new_text = ''
t = runtime.evas.text(text=text, font=font)
w = t.geometry[2]
if w > width:
while text:
# KA: [20070905] hangul lvp-2000 한글 긴문자열 조정시 '...' 이 표시 안되는 문제 해결
#text = (unicode(text, 'utf-8')[:-1]).encode('utf-8')
if type(text) == type('abc'):
text = unicode(text, 'utf-8')[:-1]
else:
text = text[:-1]
text = text.encode('utf-8')
t.text = text + '...'
if t.geometry[2] <= width:
new_text = text + '...'
break
else:
new_text = text
t.free()
return (new_text, font)
def baloon_resize_text2(text, width, font):
t = runtime.evas.text(text=text, font=font)
name, fontsize = font
if t.horiz_advance_get() > width:
fontsize -= 1
t.font = name, fontsize
if t.horiz_advance_get() > width:
n = 0
text1 = text
while text1:
n -= 1
text1 = (unicode(text, 'utf-8')[:n]).encode('utf-8')
text2 = (unicode(text, 'utf-8')[n:]).encode('utf-8')
t.text = text1
if t.horiz_advance_get() <= width:
t.free()
return text1, text2, (name, fontsize)
else:
t.free()
return text, None, (name, fontsize)
t.free()
return text, None, font
def baloon_resize_text(text, width, font):
t = runtime.evas.text(text=text, font=font)
name, fontsize = font
if t.horiz_advance_get() > width:
fontsize -= 1
t.font = name, fontsize
if t.horiz_advance_get() > width:
n = 0
text1 = text
while text1:
n -= 1
text1 = ''
text2 = ''
for tt in text.split(' ')[:n]:
text1 += tt + ' '
try:
text1 = (unicode(text1, 'utf-8')[:-1]).encode('utf-8')
except:
# to avoid unicode en/decoding error
print 'UNICODE EN/DECODING ERROR'
text1 = text1[:-1]
for tt in text.split(' ')[n:]:
text2 += tt + ' '
try:
text2 = (unicode(text2, 'utf-8')[:-1]).encode('utf-8')
except:
# to avoid unicode en/decoding error
print 'UNICODE EN/DECODING ERROR'
text2 = text2[:-1]
t.text = text1
if t.horiz_advance_get() <= width:
t.free()
return text1, text2, (name, fontsize)
else:
t.free()
return text, None, (name, fontsize)
t.free()
return text, None, font
#해당 파일 사이즈를 Kb단위로 환산한다
def get_size_kb(filename):
try:
return (os.stat(filename)[6] + 1023)/1024
except:
return 0
#최소한의 메모리 사이즈인 4500보다 많은 메모리를 가지고 있는지 조사한다
def check_free_storage(mode = '', filesize = 0):
#Roxia Begin smyook 06.02.13
if mode == 'filetosdmmc2':
#Roxia End smyook
result = os.statvfs('/usr/mmchd')
else:
result = os.statvfs('/usr')
# result[0] : block size
# result[3] : blocks
free_size = (result[0] * result[3]) / 1024
if mode != '':
if free_size - filesize > config.min_free_storage:
return True
else:
return False
if config.utils_debug:
print 'mtd4, free size:', free_size
if free_size > config.min_free_storage:
return True
else:
return False
#비디오 콜 관련 ?
def check_videocall():
# 0310 - TIM Mobile phone 과의 연동
status.check_mobile_call = False
if setting.enable_video_key != 1 or not status.dial_number:
return False
dial = status.dial_number
if setting.phone_extension:
if dial.startswith(setting.phone_extension):
dial = dial[len(setting.phone_extension):]
if dial[0] == 'P':
dial = dial[1:]
if dial.startswith(config.FAC_HIDE_ID_CODE):
dial = dial[3:]
status.ppp_call_number = config.sac1 #KEON-0414
return True
def check_special_nas_number(number):
if number == config.special_cid_number:
return True
return False #Presently, foramt of special NAS number doesn't become known yet.
def get_special_nas_number(number):
return config.sac2 #Presently, foramt of special NAS number doesn't become known yet.
#sms data를 read시 사용
class Parser:
def __init__(self, data):
self.parse_pos = 0
self.raw_data = data
def get_byte(self):
b = ord(self.raw_data[self.parse_pos])
self.parse_pos += 1
return b
def get_short(self):
return self.get_byte() * 256 + self.get_byte()
def get_data(self, size):
data = self.raw_data[self.parse_pos:self.parse_pos+size]
self.parse_pos += size
return data
def get_remaining(self):
return self.raw_data[self.parse_pos:]
def parsing_done(self):
return self.parse_pos >= len(self.raw_data)
#sms를 통해서 받은 이미지 또는 사운드의 갯수를 얻는다
def next_file_index(path, prefix, suffix):
count = 0
while True:
candi = path + prefix + '%d' % count + suffix
if not os.path.exists(candi):
break
count += 1
return count
def is_dtmf(key):
if len(key) == 2 and key[0] == 'D':
return True
return False
#파일을 삭제한다
def remove_file(f):
os.unlink(f)
#t9_word_list를 지원다
def remove_t9_word_list():
if not os.access(config.t9_word_list, os.R_OK): #t9_word_list를 읽을 수 있는 권한을 가지고 있는가
return
remove_file(config.t9_word_list)
#해당 파일의 최근 수정된 시간을 알려준다
def get_file_mtime(filename):
return os.stat(filename)[8]
def print_hex(data):
if not data:
print 'empty data'
return
for i, c in enumerate(data):
print "[%02X]" % (ord(c),),
if i%16 == 15:
print
print
def log_time(mesg,init=False):
if profile.ip_mode != 0: # not PSTN
return
try:
if init:
os.unlink( '/tmp/vdc_time' )
except:
pass
timestamp = ntptime.ntime()
hour, min, sec = time.localtime(timestamp)[3:6]
msec = str(timestamp)
if setting.lang == 'Italian':
msec = msec[msec.find(',')+1:]
else:
msec = msec[msec.find('.')+1:]
date = "%02d:%02d:%02d.%s" % (hour, min, sec, msec)
mesg = date+" "+mesg+'\n'
# answer delay
try:
fd = open( "/tmp/vdc_time", "a", 0 )
fd.write( mesg )
except:
pass
fd.close()
#automata_list중에 숫자가 아닌 인자로 들어온 값을 가지고 있는 index를 찾는다
def get_automata_idx(name, casemode=None):
# KA: [20070831] hangul lvp-2000
# vpark 2006.08.28 automata
if name == None:
return get_def_automata_idx()
# KA: [20070831] hangul lvp-2000 ==
#ka...hangul Add 2007.01.25
if setting.lang == 'Korean':
for i, a in enumerate(config.automata_list_hangul):
n,c = a
if n == name and (not c or c == casemode):
return i
else:
for i, a in enumerate(config.automata_list):
n,c = a
if n == name and (not c or c == casemode):
return i
#assert False
def get_automata_idx_no_hangul(name, casemode):
if name == None:
return get_def_automata_idx()
for i, a in enumerate(config.automata_list_mult_num_symbol):
n,c = a
if n == name and (not c or c == casemode):
return i
#('t9', 'lower'), ('t9', 'first capital'), ('t9', 'upper'),
#('multitap', 'lower'), ('multitap', 'first capital'), ('multitap', 'upper'),
#('123', 0)
def get_def_automata_idx(): #('t9', 'first capital'), ('t9', 'upper'),('multitap', 'first capital'), ('multitap', 'upper')중에 edit write mode 시작시 입력방식
return (0,1,2,3,4,5)[setting.writing_mode]
def get_def_automata_no_hangul(): #현 입력 방식에 대한 값을 리턴한다
automata_idx = get_def_automata_idx()
name,casemode = config.automata_list_mult_num_symbol[automata_idx]
return name, casemode
def get_def_automata(): #현 입력 방식에 대한 값을 리턴한다
automata_idx = get_def_automata_idx()
#ka...hangul Add 2007.01.25
# if setting.lang == 'Korean':
name,casemode = config.automata_list_hangul[automata_idx]
# else:
# name,casemode = config.automata_list[automata_idx]
return name, casemode
class InterruptException(Exception):
pass
def check_interrupt():
while 1:
key = runtime.evas.get_key()
if not key:
return
if config.utils_debug:
print "**********check interrupt key", key
if key in (config.OffHook, config.Green):
if config.utils_debug:
print 'Raising interrupt', key
status.interrupt_key = key
raise InterruptException, key
#sms 수신 이미지에 대한 임시path+filename을 얻는다
last_temp_sbm = 0
def get_last_temp_sbm_filename():
global last_temp_sbm
filename = '/tmp/%08d.sbm' % last_temp_sbm
last_temp_sbm += 1
return filename
#sms 수신 사운드에 대한 임시path+filename을 얻는다
last_temp_imy = 0
def get_last_temp_imy_filename():
global last_temp_imy
filename = '/tmp/%08d.imy' % last_temp_imy
last_temp_imy += 1
return filename
#image를 가로 88 세로 72의 사이즈로 변화시킴
#크기가 88, 72보다 작거나 같으면 변화되지 않음
def image_resize(old, new):
os.system('image-resize ' + old + ' ' + new + ' 88 72')
#file copy
def file_copy(src_file, dest_file):
cmd = 'cp "%s" "%s"' % (src_file, dest_file)
os.system(cmd)
# LG hw 디버깅 정보 요청사항
def print_hw_debug(message):
# eicho change file name 'testmode' to 'testmode1'
"""
if not os.access('/usr/etc/testmode1', os.R_OK):
return
print message
"""
if is_test_mode():
print message
# cid 와 함께 받은 date, time 을 받아서 call_time 을 만들어준다.
def make_call_time():
recv_date = status.received_date
recv_time = status.received_time
date = time.localtime(ntptime.ntime())
year, mon, day = date[0], date[1], date[2]
hour, min, sec = date[3], date[4], date[5]
if recv_date:
mon = int(recv_date[:2])
day = int(recv_date[2:])
if recv_time:
hour = int(recv_time[:2])
min = int(recv_time[2:])
sec = 0
call_time = time.mktime((year, mon, day, hour, min, sec, 0, 0, 0))
status.received_date = None
status.received_time = None
return call_time
#폰 재 부팅
def restart_lgvp():
os._exit(1)
#adapter (문자열): ex)'eth', 'ppp' -> 뒤의 숫자는 붙이지 않는다
#return; adapter에 해당하는 ip와 mac address들을 리턴한다
# ex) [['00:00:00:00:00:00', 111,111,111,111], ['22:22:22:22:22:22', 333,333,333,333].......]
# eth0 eth1
# mac address IP mac address IP
def get_address(adapter):
bundle = [[]]
ret = []
index = -1
try:
os.system('ifconfig -a > /tmp/ifconfig.tmp')
fp = open('/tmp/ifconfig.tmp')
for data in fp:
data = data.strip()
if data:
if index == -1:
index = 0
data = data.split()
bundle[index].extend(data)
else:
if index != -1:
bundle.append([])
index += 1
if not len(bundle[-1]):
bundle.pop(-1)
for data in bundle:
if data[0][:-1] == adapter or data[0] == adapter:
ret.append([])
try:
nfind = data.index('HWaddr')
ret[len(ret)-1].append(data[nfind+1])
except ValueError:
ret[len(ret)-1].append(None)
try:
nfind = data.index('inet')
ret[len(ret)-1].append((data[nfind+1].split(':'))[1])
except ValueError:
ret[len(ret)-1].append(None)
return ret
except:
#print 'ioerror'
pass
def show_softkey(show=True):
if show:
runtime.evas.soft.show()
runtime.lb.show()
runtime.rb.show()
runtime.menu3.show()
runtime.menu4.show()
else:
runtime.evas.soft.hide()
runtime.lb.hide()
runtime.rb.hide()
runtime.menu3.hide()
runtime.menu4.hide()
def image_isvalid(filename):
if filename == '':
return 0
return runtime.mmedia.check_image_isvalid(filename)
def get_img_size(imageFile):
if imageFile.lower().endswith('.jpg') or imageFile.lower().endswith('.jpeg'):
tmp_image = runtime.evas.image(file=imageFile)
tmp_w, tmp_h = tmp_image.size_get()
tmp_image.free()
elif imageFile.lower().endswith('.png'):
tmp_image = runtime.evas.image(file=imageFile)
tmp_w, tmp_h = tmp_image.size_get()
tmp_image.free()
'''
dim = [ord(x) for x in open(imageFile).read(24)[16:]]
tmp_w = dim[3] + 256 * (dim[2] + 256 * (dim[1] + 256 * dim[0]))
tmp_h = dim[7] + 256 * (dim[6] + 256 * (dim[5] + 256 * dim[4]))
'''
elif imageFile.lower().endswith('.gif'):
dim = [ord(x) for x in open(imageFile).read(24)]
tmp_w = dim[6] + 256 * dim[7]
tmp_h = dim[8] + 256 * dim[9]
elif imageFile.lower().endswith('.bmp'):
dim = [ord(x) for x in open(imageFile).read(26)]
if dim[14] == 12: #dim[14] = 12 (Old BMP image file format, Used OS/2)
tmp_w = dim[18] + 256 * dim[19]
tmp_h = dim[20] + 256 * dim[21]
else: #dim[14] > 12 (Microsoft Windows BMP image file)
tmp_w = dim[18] + 256 * dim[19]
tmp_h = dim[22] + 256 * dim[23]
else:
tmp_w = 320
tmp_h = 240
return [tmp_w, tmp_h]
def is_test_mode():
if os.path.exists('/usr/etc/testmode1') or os.path.exists('/usr/etc/testmode2'):
return True
else:
return False
#MMW //2006.02.06
# time.localtime(ntptime.ntime())
def file_time_adaptation(filename):
# print filename
atime = os.stat(filename)[stat.ST_ATIME]
mtime = os.stat(filename)[stat.ST_MTIME]
# print 'atime', atime
atime = atime + ntptime.timediff()
mtime = mtime + ntptime.timediff()
# print 'atime+', atime
# print 'mtime+', mtime
os.utime(filename, (atime, mtime))
time.sleep(0.10)
atime = os.stat(filename)[stat.ST_ATIME]
mtime = os.stat(filename)[stat.ST_MTIME]
# print 'atime++', atime
# print 'mtime++', mtime
#end of MMW
# KA: [20070809] hangul
#start hyshim 2006.11.29 : euc-kr -> unicode
def f_unicode_encoding(message):
result = ''
# if setting.lang == 'Korean':
# result = unicode(message,'euc-kr')
# else:
# result = message
result = unicode(message,'euc-kr')
return result
#end
#start hyshim 2007.01.09 : utf-8 -> euc-kr
def f_utf8tokr_encoding(message):
resurlt = ''
result = unicode(message,'utf-8').encoding('euc-kr')
return result
#end
# KA: [20080310] private IP
def check_private_range():
from profile import profile
if profile.get_profile() == 1:
network_info = get_address('eth')
else:
network_info = get_address('wlan')
if network_info:
ip = network_info[0][1]
else:
return False
if not ip:
return False
hex_ip = ''.join(["%02X" % int(i) for i in ip.split('.')])
hex_ip = int(hex_ip, 16)
if (hex_ip >= 0xA000000 and hex_ip <= 0xAFFFFFF ) or \
(hex_ip >= 0xAC100000 and hex_ip <= 0xAC1FFFFF) or \
(hex_ip >= 0xC0A80000 and hex_ip <= 0xC0A8FFFF):
return True
else:
return False
#A클래스 10.0.0.0~10.255.255.255
#B클래스 172.16.0.0~172.31.255.255
#C클래스 192.168.0.0~192.168.255.255
# KA: [20080310] private IP ==
def checkUrlPolicy(number):
#if setting.urlPolicy == config.LOCAL_TEST_URI:
# return [config.LOCAL_URI, number]
if config.local_test_flag:
return [config.LOCAL_TEST_URI, number]
elif setting.urlPolicy == config.KT_TEL_URI:
return [config.KT_URI, number]
elif setting.urlPolicy == config.STANDARD_SIP_URI:
if number[0] == '+':
return [config.STANDARD_GLOBAL, number[1:]]
elif number[:2] == '00':
return [config.STANDARD_LOCAL, number]
elif number[0] == '0':
number = setting.nationalCode + number[1:]
return [config.STANDARD_GLOBAL, number]
elif number[0] == '1' or number[0] == '*' or number[0] == '#':
return [config.STANDARD_LOCAL, number]
else:
number = setting.nationalCode + setting.prefix[1:] + number
return [config.STANDARD_GLOBAL, number]
else:
return [config.KT_URI, number]
def getGifAnimationInfo():
myCardGifInfoList = []
frameFileList = []
firstDelay = True
infoFileHandler = open('/usr/local/lgvp/images/myCard/myCard.info')
for line in infoFileHandler:
tokenList = line.split(' ')
print 'tokenList = ', tokenList
if '*' in tokenList:
gifFileName = tokenList[1]
myCardGifInfoList.append(gifFileName)
numberOfFrame = tokenList[2]
myCardGifInfoList.append(numberOfFrame)
elif 'delay' in tokenList:
if firstDelay:
#delayTime = int(float(tokenList[tokenList.index('delay')+1][:-2])*1000)
delayTimeString = tokenList[tokenList.index('delay')+1][:-2]
delayTimeList = delayTimeString.split('.')
delayTime = int(delayTimeList[0])*1000 + int(delayTimeList[1][0])*100 + int(delayTimeList[1][1])*10
myCardGifInfoList.append(delayTime)
firstDelay = False
for index in range(int(numberOfFrame)):
if index < 10:
framFileName = './myCard/' + gifFileName + '.00' + str(index)
elif index >= 10:
framFileName = './myCard/' + gifFileName + '.0' + str(index)
frameFileList.append(framFileName)
myCardGifInfoList.append(frameFileList)
return myCardGifInfoList
# release dynamic ip....
def releaseDhcp():
from profile import profile
cmd = ''
if profile.get_profile() == 1:
cmd = 'stop_dhclient eth0 &'
else:
cmd = 'stop_dhclient wlan0 &'
os.system(cmd)
def get_free_flash_memory():
df=os.popen('df -k | grep /dev/stl0/6').readlines()
mem_info = df[0].split()
return int(mem_info[3])
# Function: conv_telnum(number)
# Regular expression for telephone style number format
# ^0(?:01|02|03|04|05|06|07|08|09|10|11|12|14|15|16|17|18|19)-(?:d{3}|d{4})-d{4}$
# ^0(?:2|31|32|33|34|41|42|43|51|52|53|54|55|61|62|63|64|70|60|80|505)-(?:d{3}|d{4})-d{4}$
def conv_telnum(number):
if not number:
return ''
# In case of global version, don't convert telnum by hdkim 20090106
if config.global_version_flag != 0:
return number
#import re
num = number
sym = ''
tel1 = ''
tel2 = ''
tel = ''
while num[0] in ('*', '#', '+'): # check symbol (delete symbol)
sym = sym + num[:1]
num = num[1:]
#if num == '': return ''
if num == '': break
### Make tel1 ###
''' ======================================================
# check international/mobile number ('00?' or '11?' except '000' and '013')
exp = re.compile(r"^0(?:01|02|03|04|05|06|07|08|09|10|11|12|14|15|16|17|18|19)")
tel = exp.search(num)
if tel == None: # have no international/mobile number
# check local number
exp = re.compile(r"^0(?:2|31|32|33|34|41|42|43|51|52|53|54|55|61|62|63|64|70|60|80|505)")
tel = exp.search(num)
if tel == None: # have no local number
pass
else:
tel1 = tel.group() # make local number
num = exp.split(num)[1] # make rest number
else:
tel1 = tel.group() # make international/mobile number
num = exp.split(num)[1] # make rest number
'''
# this routine is another version without regular expression, more efficient?
length = len(num)
if length >= 2:
if num[:2] == '02':
tel1 = num[:2]
num = num[2:]
if length >= 3:
if num[:3] in (
'001', '002', '003', '004', '005', '006', '007', '008', '009',
'010', '011', '012', '014', '015', '016', '017', '018', '019',
'031', '032', '033', '034', '041', '042', '043', '051', '052',
'053', '054', '055', '061', '062', '063', '064', '070', '080'):
tel1 = num[:3]
num = num[3:]
if length >= 4:
if num[:4] == '0505':
tel1 = num[:4]
num = num[4:]
''' ======================================================
'''
### Make tel2 ###
if len(num) < 4: tel2 = num # 000
elif num[3] in ('*', '#', '+'): tel2 = num # special case like *123*
elif len(num) < 8: tel2 = num[:3] + '-' + num[3:] # 000-0000
else: tel2 = num[:4] + '-' + num[4:] # 0000-0000
### Make tel1+tel2 ###
if tel1 == '': tel = tel2
elif tel2 == '': tel = tel1
else: tel = tel1 + '-' + tel2
if sym != '': tel = sym + tel # check symbol (add symbol)
return tel
'''
# This is for conv_telnum test
if __name__ == '__main__':
tel_list = [ '0', '02', '021', '070', '07012', '0134567890', '001823112345678',
'070123', '0701234', '070123456', '0701234567', '07012345678', '070123456789',
'*07', '*070', '*0701', '*0701234', '*0701234567890',
'#07', '#070', '#0701', '#0701234', '+0701234567890',
'*123#', '*137*', '*12356#', '*13766*',
]
for i in range(len(tel_list)):
if len(tel_list[i]) < 8:
print tel_list[i] + '\t\t -> ' + conv_telnum(tel_list[i])
else:
print tel_list[i] + '\t -> ' + conv_telnum(tel_list[i])
print conv_telnum('0134567890') # 0134-567890 (000 and 013 is not international/mobile)
print conv_telnum('001823112345678') # 001-8231-12345678 (country code is not implemented)
'''
def check_emergency(number):
if not number:
return False
num = number
length = len(num)
if length == 3:
if num[0] == '1': return True
elif length == 5:
if num[:2] == '02' and num[2] == '1': return True
elif length == 6:
if num[:3] in (
'001', '002', '003', '004', '005', '006', '007', '008', '009',
'010', '011', '012', '014', '015', '016', '017', '018', '019',
'031', '032', '033', '034', '041', '042', '043', '051', '052',
'053', '054', '055', '061', '062', '063', '064', '070', '080') and num[3] == '1': return True
return False
'''
# This is for check_emergency test
if __name__ == '__main__':
tel_list = [ '', '0', '02', '02100', '021000', '0210000', '02100000', '070100', '013100',
'03119', '031199', '0311999', '03119999', '031199999' ]
for i in range(len(tel_list)):
if check_emergency(tel_list[i]):
print tel_list[i] + ' is emergency call <------------------'
else:
print tel_list[i] + ' is not emergency call'
'''
#MMW 2008.0622 network error message to dect
def send_VP_net_status_to_DCT(status):
#D101
import dectHandler
from dectConfig import MessageCode
from dectHandler import DectCallManager
debugLogN('\tSET_DECT_MSG: %s'%status)
if runtime.dectHandler == None:
runtime.dectHandler = dectHandler.DectHandler()
if runtime.dectCallManager == None:
runtime.dectCallManager = dectHandler.DectCallManager(1)
# dectStatus = runtime.dectCallManager.getDectStatus()
# if dectStatus == DectCallManager.CONNECTED:
# runtime.dectCallManager.serverStopCall()
# print 'send VP net status to DCT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
if runtime.dectCallManager.isSubcribedDect():
time.sleep(0.5)
runtime.dectCallManager.unregisterstatusReport()
if status == 'D101' : # 709 WATING_FOR_READY_STATUS
# print 'D101'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WATING_FOR_READY_STATUS)
elif status == 'M101' : # 701 LAN_CABLE_NOT_CONNECTED
# print 'M101'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.LAN_CABLE_NOT_CONNECTED)
elif status == 'M102' : # 706 PPPOE_IP_ALLOC_AND_TEST
# print 'M102'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.PPPOE_IP_ALLOC_AND_TEST)
elif status == 'M201' : # 702 NAS_CONNECTION_FAIL
# print 'M201'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.NAS_CONNECTION_FAIL)
elif status == 'M202' : # 703 PPPOE_ID_AUTH_FAIL
# print 'M202'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.PPPOE_ID_AUTH_FAIL)
elif status == 'M301' : # 705 DHCP_IP_ALLOC_FAIL -> same with W104
# print 'M301'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.DHCP_IP_ALLOC_FAIL)
elif status == 'M302' : # 707 IP_TEST_FAIL
# print 'M302'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.IP_TEST_FAIL)
elif status == 'M901' : # 704 ETC_NETWORK_ERROR
# print 'M901'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.ETC_NETWORK_ERROR)
elif status == 'W100' : # 714 WIRELESS_CONNECTING
# print 'W100'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_CONNECTING)
elif status == 'W101' : # 711 WIRELESS_ASSOC_FAIL
# print 'W101'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_ASSOC_FAIL)
elif status == 'W102' : # 712 WIRELESS_SEC_FAIL
# print 'W102'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_SEC_FAIL)
elif status == 'W104' : # 705 DHCP_IP_ALLOC_FAIL
# print 'W104'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.DHCP_IP_ALLOC_FAIL)
elif status == 'W105' : # 707 IP_TEST_FAIL
# print 'W105'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.IP_TEST_FAIL)
elif status == 'W106' : # 710 WIRELESS_ICMP_FAIL
# print 'W106'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_ICMP_FAIL)
elif status == 'W107' : # 710 WIRELESS_ICMP_FAIL
# print 'W107'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_ICMP_FAIL)
elif status == 'W109' : # 713 WIRELESS_DISCONNECTED
# print 'W109'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_DISCONNECTED)
elif status == 'W110' : # DCT message not available so, send regstatus = 3 -> 0801 KT want to change to 714 WIRELESS_CONNECTING
# print 'W110!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
runtime.dectCallManager.sendNetworkStatusReportToDect(MessageCode.LGN_Define.WIRELESS_CONNECTING)
else :
print status
time.sleep(0.5)
if runtime.manager != None :
# registration fail
runtime.manager.set_registerinfo('1')
def vega_reset_together() :
print 'reboot is called so, reset vega and broadcom_idle and broadcom_sip_reg pin to default!!!!!!'
try :
# registration fail
os.system('dect_stop')
runtime.manager.set_registerinfo('1')
# broadcom is not ready
runtime.manager.set_bootinfo('1')
# time.sleep(1)
#vega reset
os.system('dect_vega_reset')
except :
print 'vega_reset_together fail'
#end of MMW
def check_ipconflict(ipaddr):
# shchun: from ip1535...
try:
import profile
cur_prof = profile.profile.get_profile()
cmd = ''
if cur_prof == 1: # Lan profile
#cmd = 'arping -D -c 1 -I %s %s 2> /dev/null | grep Received | cut -b10 > /tmp/arping.info'%('eth0', self.ipconflict_getcurip('eth0'))
cmd = 'arping -D -c 1 -I %s %s 2> /dev/null | grep Received | cut -b10 > /tmp/arping.info'%(runtime.manager.get_eth0name(),ipaddr)
elif cur_prof == 2: # Wifi profile
cmd = 'arping -D -c 1 -I %s %s 2> /dev/null | grep Received | cut -b10 > /tmp/arping.info'%('wlan0', ipaddr)
print 'CMD', cmd
os.system(cmd)
res = open('/tmp/arping.info').read()
ival = int(res)
if ival == 0:
# Not conflicted
return False
else:
# Confilcted
return True
except:
print 'EXCEPT : check_ipconflict()'
return False
# input decimal and returns list of binary
def dectobin(dec):
# shchun: from ip1535...
bin = []
while dec >= 1:
dec, remainder = divmod(dec, 2)
bin.insert(0,remainder)
while len(bin) < 8:
bin.insert(0,0)
return bin
# validate inmask is good netmask.
def isValidNetmask(inmask):
# shchun: from ip1535...
masks= inmask.split('.')
if len(masks) != 4:
return False
binlist=[]
for item in masks:
ival = int(item)
if ival<0 or ival>255:
return False
binlist += dectobin(ival)
chg = 0
prev = 1
for i in range(len(binlist)):
if prev != binlist[i]:
chg+= 1
prev=binlist[i]
#print 'BINLIST', chg, binlist
if chg <= 1:
return True
return False
def isPrivateIP(ip):
# shchun : from KA's code
hex_ip = ''.join(["%02X" % int(i) for i in ip.split('.')])
hex_ip = int(hex_ip, 16)
if (hex_ip >= 0xA000000 and hex_ip <= 0xAFFFFFF ) or \
(hex_ip >= 0xAC100000 and hex_ip <= 0xAC1FFFFF) or \
(hex_ip >= 0xC0A80000 and hex_ip <= 0xC0A8FFFF):
return True
else:
return False
#A클래스 10.0.0.0~10.255.255.255
#B클래스 172.16.0.0~172.31.255.255
#C클래스 192.168.0.0~192.168.255.255
def getHexIP(ip):
hex_ip = ''.join(["%02X" % int(i) for i in ip.split('.')])
hex_ip = int(hex_ip, 16)
return hex_ip
def isGatewayInSubnet(ip, gw, mask):
# shchun : to check if the gateway exists in same subnet
hex_ip = getHexIP(ip)
hex_gw = getHexIP(gw)
hex_mask = getHexIP(mask)
print "ip+mask: %X"%(hex_ip & hex_mask)
print "gw+mask: %X"%(hex_gw & hex_mask)
if (hex_ip & hex_mask) != (hex_gw & hex_mask):
return False
return True
def isIPaddrEqBroadcast(ipad, netma):
iplist = ipad.split('.')
netlist = netma.split('.')
brdlist = []
brdcast = ''
try:
for z in range(len(iplist)):
brdlist.append(int(iplist[z]) | (~int(netlist[z]) + 256))
for z in range(len(brdlist) - 1):
brdcast += str(brdlist[z]) + '.'
else:
brdcast += str(brdlist[len(brdlist)- 1])
except:
pass
# debugLogC( 'isIPaddrEqBroadcast: IP/Netmask/Broadcast:', ipad, netma, brdcast)
if ipad == brdcast:
return True
return False