download_process_page.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package UI
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "path/filepath"
  7. "os/exec"
  8. gotime "time"
  9. "net/url"
  10. "github.com/cuu/grab"
  11. "github.com/cuu/gogame/color"
  12. "github.com/cuu/gogame/event"
  13. "github.com/cuu/gogame/draw"
  14. )
  15. type DownloadProcessPage struct {
  16. Page
  17. URL string
  18. DST_DIR string
  19. Value int
  20. PngSize map[string][2]int
  21. FileNameLabel LabelInterface
  22. SizeLabel LabelInterface
  23. Icons map[string]IconItemInterface
  24. URLColor *color.Color
  25. TextColor *color.Color
  26. TheTicker *gotime.Ticker
  27. Downloader *grab.Client
  28. resp *grab.Response
  29. req *grab.Request
  30. }
  31. func NewDownloadProcessPage() *DownloadProcessPage {
  32. p := &DownloadProcessPage{}
  33. p.FootMsg = [5]string{"Nav","","","Back",""}
  34. p.URLColor = &color.Color{51, 166, 255,255 } // URL
  35. p.TextColor = &color.Color{83,83,83,255 } // Text
  36. p.PngSize = make(map[string][2]int,0)
  37. p.Icons=make(map[string]IconItemInterface)
  38. return p
  39. }
  40. func (self *DownloadProcessPage) Init() {
  41. self.PosX = self.Index * self.Screen.Width
  42. self.Width = self.Screen.Width
  43. self.Height = self.Screen.Height
  44. self.CanvasHWND = self.Screen.CanvasHWND
  45. self.PngSize["bg"] = [2]int{48,79}
  46. self.PngSize["needwifi_bg"] = [2]int{253,132}
  47. bgpng := NewIconItem()
  48. bgpng.ImgSurf = MyIconPool.GetImgSurf("rom_download")
  49. bgpng.MyType = ICON_TYPES["STAT"]
  50. bgpng.Parent = self
  51. bgpng.Adjust(0,0,self.PngSize["bg"][0],self.PngSize["bg"][1],0)
  52. self.Icons["bg"] = bgpng
  53. needwifi_bg := NewIconItem()
  54. needwifi_bg.ImgSurf = MyIconPool.GetImgSurf("needwifi_bg")
  55. needwifi_bg.MyType = ICON_TYPES["STAT"]
  56. needwifi_bg.Parent = self
  57. needwifi_bg.Adjust(0,0,self.PngSize["needwifi_bg"][0],self.PngSize["needwifi_bg"][1],0)
  58. self.Icons["needwifi_bg"] = needwifi_bg
  59. self.FileNameLabel = NewLabel()
  60. self.FileNameLabel.SetCanvasHWND(self.CanvasHWND)
  61. self.FileNameLabel.Init("", Fonts["varela12"],nil)
  62. self.SizeLabel = NewLabel()
  63. self.SizeLabel.SetCanvasHWND(self.CanvasHWND)
  64. self.SizeLabel.Init("0/0Kb",Fonts["varela12"],nil)
  65. self.SizeLabel.SetColor( self.URLColor )
  66. self.Downloader = grab.NewClient()
  67. }
  68. func (self *DownloadProcessPage) OnExitCb() {
  69. //Stop Ticker and the Grab
  70. if self.TheTicker != nil {
  71. self.TheTicker.Stop()
  72. }
  73. }
  74. // should be in a gorotine
  75. func (self *DownloadProcessPage) UpdateProcessInterval() {
  76. if self.TheTicker == nil {
  77. return
  78. }
  79. if self.Screen.CurPage() != self {
  80. return
  81. }
  82. Loop:
  83. for {
  84. select {
  85. case <-self.TheTicker.C:
  86. fmt.Printf(" transferred %v / %v bytes (%.2f%%)\n",
  87. self.resp.BytesComplete(),
  88. self.resp.Size,
  89. 100*self.resp.Progress())
  90. self.Value = int(100.0*self.resp.Progress())
  91. total := float64(self.resp.Size)/1000.0/1000.0
  92. downloaded := float64(self.resp.BytesComplete())/1000.0/1000.0
  93. lb_str := fmt.Sprintf("%.2f/%.2fMb",downloaded,total)
  94. self.SizeLabel.SetText(lb_str)
  95. self.FileNameLabel.SetText(filepath.Base(self.resp.Filename))
  96. self.Screen.Draw()
  97. self.Screen.SwapAndShow()
  98. case <-self.resp.Done:
  99. // download is complete
  100. fmt.Println("download is complete ",self.Value)
  101. self.Value = 0
  102. self.TheTicker.Stop()
  103. break Loop
  104. }
  105. }
  106. if err := self.resp.Err(); err != nil {
  107. self.DownloadErr()
  108. fmt.Fprintf(os.Stderr, "Download failed: %v\n", err)
  109. cmd := exec.Command("rm","-rf",self.resp.Filename)
  110. cmd.Dir= self.DST_DIR
  111. cmd.Run()
  112. }
  113. fmt.Printf("Download saved to %s/%v \n",self.DST_DIR, self.resp.Filename)
  114. filename := filepath.Base(self.resp.Filename)
  115. if strings.HasSuffix(filename,".zip") {
  116. cmd := exec.Command("unzip",filename)
  117. cmd.Dir = self.DST_DIR
  118. cmd.Run()
  119. }else if strings.HasSuffix(filename,".zsync") {
  120. cmd := exec.Command("rm","-rf",filename)
  121. cmd.Dir = self.DST_DIR
  122. cmd.Run()
  123. }else if strings.HasSuffix(filename,".tar.gz") {
  124. cmd := exec.Command("tar", "xf", filename)
  125. cmd.Dir= self.DST_DIR
  126. cmd.Run()
  127. }
  128. cmd := exec.Command("rm","-rf",filename)
  129. cmd.Dir = self.DST_DIR
  130. cmd.Run()
  131. self.TheTicker.Stop()
  132. self.DoneAndReturnUpLevel()
  133. }
  134. func (self *DownloadProcessPage) DownloadErr() {
  135. self.Screen.MsgBox.SetText("Download Failed")
  136. self.Screen.MsgBox.Draw()
  137. self.Screen.SwapAndShow()
  138. }
  139. func (self *DownloadProcessPage) DoneAndReturnUpLevel() {
  140. self.ReturnToUpLevelPage()
  141. self.Screen.Draw()
  142. self.Screen.SwapAndShow()
  143. }
  144. func (self *DownloadProcessPage) StartDownload(_url,dst_dir string) {
  145. if self.Screen.DBusManager.IsWifiConnectedNow() == false {
  146. return
  147. }
  148. _, err := url.ParseRequestURI(_url)
  149. if err == nil && IsDirectory(dst_dir) {
  150. self.URL = _url
  151. self.DST_DIR = dst_dir
  152. }else{
  153. self.Screen.MsgBox.SetText("Invaid")
  154. self.Screen.MsgBox.Draw()
  155. self.Screen.SwapAndShow()
  156. fmt.Println("DownloadProcessPage StartDownload Invalid ",err)
  157. return
  158. }
  159. self.req, _ = grab.NewRequest(self.DST_DIR, _url)
  160. fmt.Printf("Downloading %v...\n", self.req.URL())
  161. self.resp = self.Downloader.Do(self.req)
  162. fmt.Printf(" %v\n", self.resp.HTTPResponse.Status)
  163. self.TheTicker = gotime.NewTicker(100 * gotime.Millisecond)
  164. go self.UpdateProcessInterval()
  165. }
  166. func (self *DownloadProcessPage) StopDownload() {
  167. if self.TheTicker != nil {
  168. self.TheTicker.Stop()
  169. }
  170. if self.resp != nil {
  171. self.resp.Cancel()
  172. }
  173. }
  174. func (self *DownloadProcessPage) KeyDown( ev *event.Event) {
  175. if ev.Data["Key"] == CurKeys["A"] || ev.Data["Key"] == CurKeys["Menu"] {
  176. self.StopDownload()
  177. self.ReturnToUpLevelPage()
  178. self.Screen.Draw()
  179. self.Screen.SwapAndShow()
  180. }
  181. }
  182. func (self *DownloadProcessPage) Draw() {
  183. self.ClearCanvas()
  184. if self.Screen.DBusManager.IsWifiConnectedNow() == false {
  185. self.Icons["needwifi_bg"].NewCoord(self.Width/2,self.Height/2)
  186. self.Icons["needwifi_bg"].Draw()
  187. return
  188. }
  189. self.Icons["bg"].NewCoord(self.Width/2,self.Height/2-20)
  190. self.Icons["bg"].Draw()
  191. percent := self.Value
  192. if percent < 10 {
  193. percent = 10
  194. }
  195. rect_ := draw.MidRect(self.Width/2,self.Height/2+33,170,17, Width,Height)
  196. draw.AARoundRect(self.CanvasHWND,rect_,
  197. &color.Color{228,228,228,255},5,0,&color.Color{228,228,228,255})
  198. rect2_ := draw.MidRect( self.Width/2,self.Height/2+33,int(170.0*(float64(percent)/100.0)),17, Width,Height )
  199. rect2_.X = rect_.X
  200. rect2_.Y = rect_.Y
  201. draw.AARoundRect(self.CanvasHWND,rect2_,
  202. &color.Color{131, 199, 219,255},5,0,&color.Color{131, 199, 219,255})
  203. w,h := self.FileNameLabel.Size()
  204. rect3_ := draw.MidRect(self.Width/2,self.Height/2+53,w, h,Width,Height)
  205. w, h = self.SizeLabel.Size()
  206. rect4_ := draw.MidRect(self.Width/2,self.Height/2+70,w, h,Width,Height)
  207. self.FileNameLabel.NewCoord(int(rect3_.X),int(rect3_.Y))
  208. self.FileNameLabel.Draw()
  209. self.SizeLabel.NewCoord(int(rect4_.X),int(rect4_.Y))
  210. self.SizeLabel.Draw()
  211. }