download_process_page.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import pygame
  4. import gobject
  5. import validators
  6. from libs.roundrects import aa_round_rect
  7. ## local UI import
  8. from UI.constants import Width,Height,ICON_TYPES,RUNEVT
  9. from UI.page import Page,PageSelector
  10. from UI.label import Label
  11. from UI.icon_item import IconItem
  12. from UI.util_funcs import midRect,CmdClean,FileExists
  13. from UI.keys_def import CurKeys, IsKeyMenuOrB
  14. from UI.multi_icon_item import MultiIconItem
  15. from UI.icon_pool import MyIconPool
  16. from UI.download import Download
  17. from UI.skin_manager import MySkinManager
  18. from UI.lang_manager import MyLangManager
  19. from libs.DBUS import is_wifi_connected_now
  20. import config
  21. class DownloadProcessPage(Page):
  22. _FootMsg = ["Nav.","","","Back",""]
  23. _Downloader = None
  24. _DownloaderTimer = -1
  25. _Value = 0
  26. _URL = ""
  27. _DST_DIR = ""
  28. _PngSize = {}
  29. _FileNameLabel = None
  30. _SizeLabel = None
  31. _URLColor = MySkinManager.GiveColor('URL')
  32. _TextColor = MySkinManager.GiveColor('Text')
  33. def __init__(self):
  34. Page.__init__(self)
  35. self._Icons = {}
  36. self._CanvasHWND = None
  37. def Init(self):
  38. self._PosX = self._Index * self._Screen._Width
  39. self._Width = self._Screen._Width
  40. self._Height = self._Screen._Height
  41. self._CanvasHWND = self._Screen._CanvasHWND
  42. self._PngSize["bg"] = (48,79)
  43. self._PngSize["needwifi_bg"] = (253,132)
  44. bgpng = IconItem()
  45. bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download")
  46. bgpng._MyType = ICON_TYPES["STAT"]
  47. bgpng._Parent = self
  48. bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0)
  49. self._Icons["bg"] = bgpng
  50. needwifi_bg = IconItem()
  51. needwifi_bg._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg")
  52. needwifi_bg._MyType = ICON_TYPES["STAT"]
  53. needwifi_bg._Parent = self
  54. needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0)
  55. self._Icons["needwifi_bg"] = needwifi_bg
  56. self._FileNameLabel = Label()
  57. self._FileNameLabel.SetCanvasHWND(self._CanvasHWND)
  58. self._FileNameLabel.Init("", MyLangManager.TrFont("Eurostile12"))
  59. self._SizeLabel = Label()
  60. self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
  61. self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("Eurostile12"))
  62. self._SizeLabel.SetColor( self._URLColor )
  63. def OnExitCb(self,event):
  64. #print("DownloadProcessPage OnExitCb")
  65. if self._Downloader == None:
  66. return
  67. try:
  68. self._Downloader.stop()
  69. except:
  70. pass
  71. return
  72. def GObjectUpdateProcessInterval(self):
  73. if self._Screen.CurPage() == self:
  74. if self._Downloader.isFinished():
  75. if self._Downloader.isSuccessful():
  76. print("Download Success!")
  77. # Do something with obj.get_dest()
  78. filename = os.path.basename(self._Downloader.get_dest())
  79. cur_dir = os.getcwd()
  80. if filename.endswith(".zip"):
  81. os.chdir(self._DST_DIR)
  82. os.system( "unzip -o " + filename )
  83. elif filename.endswith(".zsync"):
  84. os.chdir(self._DST_DIR)
  85. os.system( "rm -rf " + filename)
  86. elif filename.endswith(".tar.xz"):
  87. os.chdir(self._DST_DIR)
  88. os.system( "tar xf " + filename)
  89. os.system( "rm -rf " + filename)
  90. os.chdir(cur_dir)
  91. self.DownloadPostJob()
  92. self.ReturnToUpLevelPage()
  93. self._Screen.Draw()
  94. self._Screen.SwapAndShow()
  95. else:
  96. print("Download failed with the following exceptions:")
  97. for e in self._Downloader.get_errors():
  98. print(unicode(e))
  99. try:
  100. self._Downloader.stop()
  101. except:
  102. pass
  103. self._Screen._MsgBox.SetText("DownloadFailed")
  104. self._Screen._MsgBox.Draw()
  105. self._Screen.SwapAndShow()
  106. return False
  107. else:
  108. self._Value = self._Downloader.get_progress()
  109. filename = os.path.basename(self._Downloader.get_dest())
  110. self._FileNameLabel.SetText( filename )
  111. downloaded = self._Downloader.progress["downloaded"]
  112. total = self._Downloader.progress["total"]
  113. downloaded = downloaded/1000.0/1000.0
  114. total = total/1000.0/1000.0
  115. self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb")
  116. print("Progress: %d%%" % (self._Value))
  117. self._Screen.Draw()
  118. self._Screen.SwapAndShow()
  119. return True
  120. else:
  121. return False
  122. def DownloadPostJob(self):
  123. cur_dir = os.getcwd()
  124. arr = self._URL.rsplit('/', 1)
  125. if len(arr) > 1:
  126. downloaded_filename = arr[1]
  127. try:
  128. os.chdir(os.path.join(cur_dir,"patches",downloaded_filename))
  129. os.system("/bin/sh Run.sh")
  130. except:
  131. pass
  132. os.chdir(cur_dir)
  133. def StartDownload(self,url,dst_dir):
  134. if is_wifi_connected_now() == False:
  135. return
  136. if validators.url(url) and os.path.isdir(dst_dir):
  137. self._URL = url
  138. self._DST_DIR = dst_dir
  139. else:
  140. self._Screen._MsgBox.SetText("Invaid")
  141. self._Screen._MsgBox.Draw()
  142. self._Screen.SwapAndShow()
  143. print("url or dst dir error")
  144. return
  145. self._Downloader = Download(url,dst_dir,None)
  146. self._Downloader.start()
  147. self._DownloaderTimer = gobject.timeout_add(200, self.GObjectUpdateProcessInterval)
  148. def KeyDown(self,event):
  149. if IsKeyMenuOrB(event.key):
  150. gobject.source_remove(self._DownloaderTimer)
  151. self._DownloaderTimer = -1
  152. if self._Downloader != None:
  153. try:
  154. self._Downloader.stop()
  155. except:
  156. print("user canceled ")
  157. self.ReturnToUpLevelPage()
  158. self._Screen.Draw()
  159. self._Screen.SwapAndShow()
  160. def Draw(self):
  161. self.ClearCanvas()
  162. if is_wifi_connected_now() == False:
  163. self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2)
  164. self._Icons["needwifi_bg"].Draw()
  165. return
  166. self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
  167. self._Icons["bg"].Draw()
  168. percent = self._Value
  169. if percent < 10:
  170. percent = 10
  171. rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
  172. aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg'))
  173. rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
  174. rect2.left = rect_.left
  175. rect2.top = rect_.top
  176. aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front'))
  177. rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
  178. rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
  179. self._FileNameLabel.NewCoord(rect3.left,rect3.top)
  180. self._SizeLabel.NewCoord(rect4.left, rect4.top)
  181. self._FileNameLabel.Draw()
  182. self._SizeLabel.Draw()