download_process_page.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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 libs.DBUS import is_wifi_connected_now
  19. import config
  20. class DownloadProcessPage(Page):
  21. _FootMsg = ["Nav.","","","Back",""]
  22. _Downloader = None
  23. _DownloaderTimer = -1
  24. _Value = 0
  25. _URL = ""
  26. _DST_DIR = ""
  27. _PngSize = {}
  28. _FileNameLabel = None
  29. _SizeLabel = None
  30. _URLColor = pygame.Color(51,166,255)
  31. _TextColor = pygame.Color(83,83,83)
  32. def __init__(self):
  33. Page.__init__(self)
  34. self._Icons = {}
  35. self._CanvasHWND = None
  36. def Init(self):
  37. self._PosX = self._Index * self._Screen._Width
  38. self._Width = self._Screen._Width
  39. self._Height = self._Screen._Height
  40. self._CanvasHWND = self._Screen._CanvasHWND
  41. self._PngSize["bg"] = (48,79)
  42. self._PngSize["needwifi_bg"] = (253,132)
  43. bgpng = IconItem()
  44. bgpng._ImgSurf = MyIconPool._Icons["rom_download"]
  45. bgpng._MyType = ICON_TYPES["STAT"]
  46. bgpng._Parent = self
  47. bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0)
  48. self._Icons["bg"] = bgpng
  49. needwifi_bg = IconItem()
  50. needwifi_bg._ImgSurf = MyIconPool._Icons["needwifi_bg"]
  51. needwifi_bg._MyType = ICON_TYPES["STAT"]
  52. needwifi_bg._Parent = self
  53. needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0)
  54. self._Icons["needwifi_bg"] = needwifi_bg
  55. self._FileNameLabel = Label()
  56. self._FileNameLabel.SetCanvasHWND(self._CanvasHWND)
  57. self._FileNameLabel.Init("", fonts["varela12"])
  58. self._SizeLabel = Label()
  59. self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
  60. self._SizeLabel.Init("0/0Kb",fonts["varela12"])
  61. self._SizeLabel.SetColor( self._URLColor )
  62. def OnExitCb(self,event):
  63. print("DownloadProcessPage OnExitCb")
  64. if self._Downloader == None:
  65. return
  66. try:
  67. self._Downloader.stop()
  68. except:
  69. pass
  70. return
  71. def GObjectUpdateProcessInterval(self):
  72. if self._Screen.CurPage() == self:
  73. if self._Downloader.isFinished():
  74. if self._Downloader.isSuccessful():
  75. print("Success!")
  76. # Do something with obj.get_dest()
  77. filename = os.path.basename(self._Downloader.get_dest())
  78. cur_dir = os.getcwd()
  79. if filename.endswith(".zip"):
  80. os.chdir(self._DST_DIR)
  81. os.system( "unzip " + filename )
  82. elif filename.endswith(".zsync"):
  83. os.chdir(self._DST_DIR)
  84. os.system( "rm -rf " + filename)
  85. elif filename.endswith(".tar.xz"):
  86. os.chdir(self._DST_DIR)
  87. os.system( "tar xf " + filename)
  88. os.system( "rm -rf " + filename)
  89. os.chdir(cur_dir)
  90. self.ReturnToUpLevelPage()
  91. self._Screen.Draw()
  92. self._Screen.SwapAndShow()
  93. else:
  94. print("Download failed with the following exceptions:")
  95. for e in self._Downloader.get_errors():
  96. print(unicode(e))
  97. try:
  98. self._Downloader.stop()
  99. except:
  100. pass
  101. self._Screen._MsgBox.SetText("Download failed")
  102. self._Screen._MsgBox.Draw()
  103. self._Screen.SwapAndShow()
  104. return False
  105. else:
  106. self._Value = self._Downloader.get_progress()
  107. filename = os.path.basename(self._Downloader.get_dest())
  108. self._FileNameLabel.SetText( filename )
  109. downloaded = self._Downloader.progress["downloaded"]
  110. total = self._Downloader.progress["total"]
  111. downloaded = downloaded/1000.0/1000.0
  112. total = total/1000.0/1000.0
  113. self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb")
  114. print("Progress: %d%%" % (self._Value))
  115. self._Screen.Draw()
  116. self._Screen.SwapAndShow()
  117. return True
  118. else:
  119. return False
  120. def StartDownload(self,url,dst_dir):
  121. if is_wifi_connected_now() == False:
  122. return
  123. if validators.url(url) and os.path.isdir(dst_dir):
  124. self._URL = url
  125. self._DST_DIR = dst_dir
  126. else:
  127. self._Screen._MsgBox.SetText("Invaid")
  128. self._Screen._MsgBox.Draw()
  129. self._Screen.SwapAndShow()
  130. print("url or dst dir error")
  131. return
  132. self._Downloader = Download(url,dst_dir,None)
  133. self._Downloader.start()
  134. self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval)
  135. def KeyDown(self,event):
  136. if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]:
  137. gobject.source_remove(self._DownloaderTimer)
  138. self._DownloaderTimer = -1
  139. if self._Downloader != None:
  140. try:
  141. self._Downloader.stop()
  142. except:
  143. print("user canceled ")
  144. self.ReturnToUpLevelPage()
  145. self._Screen.Draw()
  146. self._Screen.SwapAndShow()
  147. def Draw(self):
  148. self.ClearCanvas()
  149. if is_wifi_connected_now() == False:
  150. self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2)
  151. self._Icons["needwifi_bg"].Draw()
  152. return
  153. self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
  154. self._Icons["bg"].Draw()
  155. percent = self._Value
  156. if percent < 10:
  157. percent = 10
  158. rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
  159. aa_round_rect(self._CanvasHWND,rect_, (238,238,238),5,0,(238,238,238))
  160. rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
  161. rect2.left = rect_.left
  162. rect2.top = rect_.top
  163. aa_round_rect(self._CanvasHWND,rect2, (126,206,244),5,0,(126,206,244))
  164. rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
  165. rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
  166. self._FileNameLabel.NewCoord(rect3.left,rect3.top)
  167. self._SizeLabel.NewCoord(rect4.left, rect4.top)
  168. self._FileNameLabel.Draw()
  169. self._SizeLabel.Draw()