launcher/sys.py/UI/download_process_page.py
2019-08-22 13:15:57 +00:00

242 lines
8.1 KiB
Python

# -*- coding: utf-8 -*-
import os
import pygame
import gobject
import validators
from libs.roundrects import aa_round_rect
## local UI import
from UI.constants import Width,Height,ICON_TYPES,RUNEVT
from UI.page import Page,PageSelector
from UI.label import Label
from UI.icon_item import IconItem
from UI.util_funcs import midRect,CmdClean,FileExists
from UI.keys_def import CurKeys, IsKeyMenuOrB
from UI.multi_icon_item import MultiIconItem
from UI.icon_pool import MyIconPool
from UI.download import Download
from UI.skin_manager import MySkinManager
from UI.lang_manager import MyLangManager
from libs.DBUS import is_wifi_connected_now
import config
class DownloadProcessPage(Page):
_FootMsg = ["Nav.","","","Back",""]
_Downloader = None
_DownloaderTimer = -1
_Value = 0
_URL = ""
_DST_DIR = ""
_PngSize = {}
_FileNameLabel = None
_SizeLabel = None
_URLColor = MySkinManager.GiveColor('URL')
_TextColor = MySkinManager.GiveColor('Text')
def __init__(self):
Page.__init__(self)
self._Icons = {}
self._CanvasHWND = None
def Init(self):
self._PosX = self._Index * self._Screen._Width
self._Width = self._Screen._Width
self._Height = self._Screen._Height
self._CanvasHWND = self._Screen._CanvasHWND
self._PngSize["bg"] = (48,79)
self._PngSize["needwifi_bg"] = (253,132)
bgpng = IconItem()
bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download")
bgpng._MyType = ICON_TYPES["STAT"]
bgpng._Parent = self
bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0)
self._Icons["bg"] = bgpng
needwifi_bg = IconItem()
needwifi_bg._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg")
needwifi_bg._MyType = ICON_TYPES["STAT"]
needwifi_bg._Parent = self
needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0)
self._Icons["needwifi_bg"] = needwifi_bg
self._FileNameLabel = Label()
self._FileNameLabel.SetCanvasHWND(self._CanvasHWND)
self._FileNameLabel.Init("", MyLangManager.TrFont("varela12"))
self._SizeLabel = Label()
self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("varela12"))
self._SizeLabel.SetColor( self._URLColor )
def OnExitCb(self,event):
#print("DownloadProcessPage OnExitCb")
if self._Downloader == None:
return
try:
self._Downloader.stop()
except:
pass
return
def GObjectUpdateProcessInterval(self):
if self._Screen.CurPage() == self:
if self._Downloader.isFinished():
if self._Downloader.isSuccessful():
print("Download Success!")
# Do something with obj.get_dest()
filename = os.path.basename(self._Downloader.get_dest())
cur_dir = os.getcwd()
if filename.endswith(".zip"):
os.chdir(self._DST_DIR)
os.system( "unzip -o " + filename )
elif filename.endswith(".zsync"):
os.chdir(self._DST_DIR)
os.system( "rm -rf " + filename)
elif filename.endswith(".tar.xz"):
os.chdir(self._DST_DIR)
os.system( "tar xf " + filename)
os.system( "rm -rf " + filename)
os.chdir(cur_dir)
self.DownloadPostJob()
self.ReturnToUpLevelPage()
self._Screen.Draw()
self._Screen.SwapAndShow()
else:
print("Download failed with the following exceptions:")
for e in self._Downloader.get_errors():
print(unicode(e))
try:
self._Downloader.stop()
except:
pass
self._Screen._MsgBox.SetText("DownloadFailed")
self._Screen._MsgBox.Draw()
self._Screen.SwapAndShow()
return False
else:
self._Value = self._Downloader.get_progress()
filename = os.path.basename(self._Downloader.get_dest())
self._FileNameLabel.SetText( filename )
downloaded = self._Downloader.progress["downloaded"]
total = self._Downloader.progress["total"]
downloaded = downloaded/1000.0/1000.0
total = total/1000.0/1000.0
self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb")
print("Progress: %d%%" % (self._Value))
self._Screen.Draw()
self._Screen.SwapAndShow()
return True
else:
return False
def DownloadPostJob(self):
cur_dir = os.getcwd()
arr = self._URL.rsplit('/', 1)
if len(arr) > 1:
downloaded_filename = arr[1]
try:
os.chdir(os.path.join(cur_dir,"patches",downloaded_filename))
os.system("/bin/sh Run.sh")
except:
pass
os.chdir(cur_dir)
def StartDownload(self,url,dst_dir):
if is_wifi_connected_now() == False:
return
if validators.url(url) and os.path.isdir(dst_dir):
self._URL = url
self._DST_DIR = dst_dir
else:
self._Screen._MsgBox.SetText("Invaid")
self._Screen._MsgBox.Draw()
self._Screen.SwapAndShow()
print("url or dst dir error")
return
self._Downloader = Download(url,dst_dir,None)
self._Downloader.start()
self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval)
def KeyDown(self,event):
if IsKeyMenuOrB(event.key):
gobject.source_remove(self._DownloaderTimer)
self._DownloaderTimer = -1
if self._Downloader != None:
try:
self._Downloader.stop()
except:
print("user canceled ")
self.ReturnToUpLevelPage()
self._Screen.Draw()
self._Screen.SwapAndShow()
def Draw(self):
self.ClearCanvas()
if is_wifi_connected_now() == False:
self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2)
self._Icons["needwifi_bg"].Draw()
return
self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
self._Icons["bg"].Draw()
percent = self._Value
if percent < 10:
percent = 10
rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg'))
rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
rect2.left = rect_.left
rect2.top = rect_.top
aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front'))
rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
self._FileNameLabel.NewCoord(rect3.left,rect3.top)
self._SizeLabel.NewCoord(rect4.left, rect4.top)
self._FileNameLabel.Draw()
self._SizeLabel.Draw()