download_process_page.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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.fonts import fonts
  13. from UI.util_funcs import midRect,CmdClean,FileExists
  14. from UI.keys_def import CurKeys, IsKeyMenuOrB
  15. from UI.multi_icon_item import MultiIconItem
  16. from UI.icon_pool import MyIconPool
  17. from UI.download import Download
  18. from UI.skin_manager import MySkinManager
  19. from UI.lang_manager import MyLangManager
  20. from libs.DBUS import is_wifi_connected_now
  21. import config
  22. class DownloadProcessPage(Page):
  23. _FootMsg = ["Nav.","","","Back",""]
  24. _Downloader = None
  25. _DownloaderTimer = -1
  26. _Value = 0
  27. _URL = ""
  28. _DST_DIR = ""
  29. _PngSize = {}
  30. _FileNameLabel = None
  31. _SizeLabel = None
  32. _URLColor = MySkinManager.GiveColor('URL')
  33. _TextColor = MySkinManager.GiveColor('Text')
  34. def __init__(self):
  35. Page.__init__(self)
  36. self._Icons = {}
  37. self._CanvasHWND = None
  38. def Init(self):
  39. self._PosX = self._Index * self._Screen._Width
  40. self._Width = self._Screen._Width
  41. self._Height = self._Screen._Height
  42. self._CanvasHWND = self._Screen._CanvasHWND
  43. self._PngSize["bg"] = (48,79)
  44. self._PngSize["needwifi_bg"] = (253,132)
  45. bgpng = IconItem()
  46. bgpng._ImgSurf = MyIconPool._Icons["rom_download"]
  47. bgpng._MyType = ICON_TYPES["STAT"]
  48. bgpng._Parent = self
  49. bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0)
  50. self._Icons["bg"] = bgpng
  51. needwifi_bg = IconItem()
  52. needwifi_bg._ImgSurf = MyIconPool._Icons["needwifi_bg"]
  53. needwifi_bg._MyType = ICON_TYPES["STAT"]
  54. needwifi_bg._Parent = self
  55. needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0)
  56. self._Icons["needwifi_bg"] = needwifi_bg
  57. self._FileNameLabel = Label()
  58. self._FileNameLabel.SetCanvasHWND(self._CanvasHWND)
  59. self._FileNameLabel.Init("", fonts["varela12"])
  60. self._SizeLabel = Label()
  61. self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
  62. self._SizeLabel.Init("0/0Kb",fonts["varela12"])
  63. self._SizeLabel.SetColor( self._URLColor )
  64. def OnExitCb(self,event):
  65. print("DownloadProcessPage OnExitCb")
  66. if self._Downloader == None:
  67. return
  68. try:
  69. self._Downloader.stop()
  70. except:
  71. pass
  72. return
  73. def GObjectUpdateProcessInterval(self):
  74. if self._Screen.CurPage() == self:
  75. if self._Downloader.isFinished():
  76. if self._Downloader.isSuccessful():
  77. print("Success!")
  78. # Do something with obj.get_dest()
  79. filename = os.path.basename(self._Downloader.get_dest())
  80. cur_dir = os.getcwd()
  81. if filename.endswith(".zip"):
  82. os.chdir(self._DST_DIR)
  83. os.system( "unzip " + filename )
  84. elif filename.endswith(".zsync"):
  85. os.chdir(self._DST_DIR)
  86. os.system( "rm -rf " + filename)
  87. elif filename.endswith(".tar.xz"):
  88. os.chdir(self._DST_DIR)
  89. os.system( "tar xf " + filename)
  90. os.system( "rm -rf " + filename)
  91. os.chdir(cur_dir)
  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 StartDownload(self,url,dst_dir):
  123. if is_wifi_connected_now() == False:
  124. return
  125. if validators.url(url) and os.path.isdir(dst_dir):
  126. self._URL = url
  127. self._DST_DIR = dst_dir
  128. else:
  129. self._Screen._MsgBox.SetText("Invaid")
  130. self._Screen._MsgBox.Draw()
  131. self._Screen.SwapAndShow()
  132. print("url or dst dir error")
  133. return
  134. self._Downloader = Download(url,dst_dir,None)
  135. self._Downloader.start()
  136. self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval)
  137. def KeyDown(self,event):
  138. if IsKeyMenuOrB(event.key):
  139. gobject.source_remove(self._DownloaderTimer)
  140. self._DownloaderTimer = -1
  141. if self._Downloader != None:
  142. try:
  143. self._Downloader.stop()
  144. except:
  145. print("user canceled ")
  146. self.ReturnToUpLevelPage()
  147. self._Screen.Draw()
  148. self._Screen.SwapAndShow()
  149. def Draw(self):
  150. self.ClearCanvas()
  151. if is_wifi_connected_now() == False:
  152. self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2)
  153. self._Icons["needwifi_bg"].Draw()
  154. return
  155. self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
  156. self._Icons["bg"].Draw()
  157. percent = self._Value
  158. if percent < 10:
  159. percent = 10
  160. rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
  161. aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg'))
  162. rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
  163. rect2.left = rect_.left
  164. rect2.top = rect_.top
  165. aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front'))
  166. rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
  167. rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
  168. self._FileNameLabel.NewCoord(rect3.left,rect3.top)
  169. self._SizeLabel.NewCoord(rect4.left, rect4.top)
  170. self._FileNameLabel.Draw()
  171. self._SizeLabel.Draw()