download_process_page.go 6.3 KB

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