download_process_page.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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.Draw()
  94. self.Screen.SwapAndShow()
  95. if self.resp.Progress() >= 1.0 {
  96. // download is complete
  97. fmt.Println("download is complete ", self.Value)
  98. self.Value = 0
  99. self.Doing = false
  100. break
  101. }
  102. if self.Doing == false {
  103. break
  104. }
  105. }
  106. self.Doing = false
  107. if err := self.resp.Err(); err != nil {
  108. self.DownloadErr()
  109. fmt.Fprintf(os.Stderr, "Download failed: %v\n", err)
  110. cmd := exec.Command("rm", "-rf", self.resp.Filename)
  111. cmd.Dir = self.DST_DIR
  112. cmd.Run()
  113. }
  114. fmt.Printf("Download saved to %s/%v \n", self.DST_DIR, self.resp.Filename)
  115. filename := filepath.Base(self.resp.Filename)
  116. if strings.HasSuffix(filename, ".zip") {
  117. cmd := exec.Command("unzip", filename)
  118. cmd.Dir = self.DST_DIR
  119. cmd.Run()
  120. } else if strings.HasSuffix(filename, ".zsync") {
  121. cmd := exec.Command("rm", "-rf", filename)
  122. cmd.Dir = self.DST_DIR
  123. cmd.Run()
  124. } else if strings.HasSuffix(filename, ".tar.gz") {
  125. cmd := exec.Command("tar", "xf", filename)
  126. cmd.Dir = self.DST_DIR
  127. cmd.Run()
  128. }
  129. cmd := exec.Command("rm", "-rf", filename)
  130. cmd.Dir = self.DST_DIR
  131. cmd.Run()
  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.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. if self.Doing == false {
  160. self.req, _ = grab.NewRequest(self.DST_DIR, _url)
  161. fmt.Printf("Downloading %v...\n", self.req.URL())
  162. self.resp = self.Downloader.Do(self.req)
  163. fmt.Printf(" %v\n", self.resp.HTTPResponse.Status)
  164. self.UpdateProcessInterval()
  165. }
  166. }
  167. func (self *DownloadProcessPage) StopDownload() {
  168. self.Doing = false
  169. }
  170. func (self *DownloadProcessPage) KeyDown(ev *event.Event) {
  171. if ev.Data["Key"] == CurKeys["A"] || ev.Data["Key"] == CurKeys["Menu"] {
  172. self.StopDownload()
  173. self.ReturnToUpLevelPage()
  174. self.Screen.Draw()
  175. self.Screen.SwapAndShow()
  176. }
  177. }
  178. func (self *DownloadProcessPage) Draw() {
  179. self.ClearCanvas()
  180. if self.Screen.IsWifiConnectedNow() == false {
  181. self.Icons["needwifi_bg"].NewCoord(self.Width/2, self.Height/2)
  182. self.Icons["needwifi_bg"].Draw()
  183. return
  184. }
  185. self.Icons["bg"].NewCoord(self.Width/2, self.Height/2-20)
  186. self.Icons["bg"].Draw()
  187. percent := self.Value
  188. if percent < 10 {
  189. percent = 10
  190. }
  191. rect_ := draw.MidRect(self.Width/2, self.Height/2+33, 170, 17, Width, Height)
  192. draw.AARoundRect(self.CanvasHWND, rect_,
  193. &color.Color{228, 228, 228, 255}, 5, 0, &color.Color{228, 228, 228, 255})
  194. rect2_ := draw.MidRect(self.Width/2, self.Height/2+33, int(170.0*(float64(percent)/100.0)), 17, Width, Height)
  195. rect2_.X = rect_.X
  196. rect2_.Y = rect_.Y
  197. draw.AARoundRect(self.CanvasHWND, rect2_,
  198. &color.Color{131, 199, 219, 255}, 5, 0, &color.Color{131, 199, 219, 255})
  199. w, h := self.FileNameLabel.Size()
  200. rect3_ := draw.MidRect(self.Width/2, self.Height/2+53, w, h, Width, Height)
  201. w, h = self.SizeLabel.Size()
  202. rect4_ := draw.MidRect(self.Width/2, self.Height/2+70, w, h, Width, Height)
  203. self.FileNameLabel.NewCoord(int(rect3_.X), int(rect3_.Y))
  204. self.FileNameLabel.Draw()
  205. self.SizeLabel.NewCoord(int(rect4_.X), int(rect4_.Y))
  206. self.SizeLabel.Draw()
  207. }