download_process_page.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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
  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 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._Icons["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._Icons["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("", fonts["varela12"])
  59. self._SizeLabel = Label()
  60. self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
  61. self._SizeLabel.Init("0/0Kb",fonts["varela12"])
  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("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 " + 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.ReturnToUpLevelPage()
  92. self._Screen.Draw()
  93. self._Screen.SwapAndShow()
  94. else:
  95. print("Download failed with the following exceptions:")
  96. for e in self._Downloader.get_errors():
  97. print(unicode(e))
  98. try:
  99. self._Downloader.stop()
  100. except:
  101. pass
  102. self._Screen._MsgBox.SetText("Download failed")
  103. self._Screen._MsgBox.Draw()
  104. self._Screen.SwapAndShow()
  105. return False
  106. else:
  107. self._Value = self._Downloader.get_progress()
  108. filename = os.path.basename(self._Downloader.get_dest())
  109. self._FileNameLabel.SetText( filename )
  110. downloaded = self._Downloader.progress["downloaded"]
  111. total = self._Downloader.progress["total"]
  112. downloaded = downloaded/1000.0/1000.0
  113. total = total/1000.0/1000.0
  114. self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb")
  115. print("Progress: %d%%" % (self._Value))
  116. self._Screen.Draw()
  117. self._Screen.SwapAndShow()
  118. return True
  119. else:
  120. return False
  121. def StartDownload(self,url,dst_dir):
  122. if is_wifi_connected_now() == False:
  123. return
  124. if validators.url(url) and os.path.isdir(dst_dir):
  125. self._URL = url
  126. self._DST_DIR = dst_dir
  127. else:
  128. self._Screen._MsgBox.SetText("Invaid")
  129. self._Screen._MsgBox.Draw()
  130. self._Screen.SwapAndShow()
  131. print("url or dst dir error")
  132. return
  133. self._Downloader = Download(url,dst_dir,None)
  134. self._Downloader.start()
  135. self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval)
  136. def KeyDown(self,event):
  137. if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]:
  138. gobject.source_remove(self._DownloaderTimer)
  139. self._DownloaderTimer = -1
  140. if self._Downloader != None:
  141. try:
  142. self._Downloader.stop()
  143. except:
  144. print("user canceled ")
  145. self.ReturnToUpLevelPage()
  146. self._Screen.Draw()
  147. self._Screen.SwapAndShow()
  148. def Draw(self):
  149. self.ClearCanvas()
  150. if is_wifi_connected_now() == False:
  151. self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2)
  152. self._Icons["needwifi_bg"].Draw()
  153. return
  154. self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
  155. self._Icons["bg"].Draw()
  156. percent = self._Value
  157. if percent < 10:
  158. percent = 10
  159. rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
  160. aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg'))
  161. rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
  162. rect2.left = rect_.left
  163. rect2.top = rect_.top
  164. aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front'))
  165. rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
  166. rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
  167. self._FileNameLabel.NewCoord(rect3.left,rect3.top)
  168. self._SizeLabel.NewCoord(rect4.left, rect4.top)
  169. self._FileNameLabel.Draw()
  170. self._SizeLabel.Draw()