load_house_page.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package Warehouse
  2. import (
  3. "fmt"
  4. "os"
  5. "io/ioutil"
  6. gotime "time"
  7. "strings"
  8. "encoding/json"
  9. "path"
  10. "path/filepath"
  11. "github.com/veandco/go-sdl2/ttf"
  12. //"github.com/cuu/gogame/image"
  13. //"github.com/cuu/gogame/draw"
  14. "github.com/cuu/gogame/color"
  15. "github.com/cuu/gogame/event"
  16. "github.com/cuu/gogame/time"
  17. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  18. "github.com/cuu/grab"
  19. )
  20. type WareHouseIndex struct {
  21. List []map[string]string `json:"list"`
  22. }
  23. type LoadHousePage struct {
  24. UI.Page
  25. ListFontObj *ttf.Font
  26. URLColor *color.Color
  27. TextColor *color.Color
  28. Downloader *grab.Client
  29. resp *grab.Response
  30. req *grab.Request
  31. URL string
  32. Downloading chan bool
  33. LoadingLabel UI.LabelInterface
  34. Parent *WareHouse
  35. }
  36. func NewLoadHousePage() *LoadHousePage {
  37. p := &LoadHousePage{}
  38. p.ListFontObj = UI.MyLangManager.TrFont("varela18")
  39. p.URLColor = UI.MySkinManager.GiveColor("URL")
  40. p.TextColor = UI.MySkinManager.GiveColor("Text")
  41. p.FootMsg = [5]string{"Nav.","","","Back","Cancel"}
  42. return p
  43. }
  44. func (self *LoadHousePage) Init() {
  45. self.PosX = self.Index * self.Screen.Width
  46. self.Width = self.Screen.Width
  47. self.Height = self.Screen.Height
  48. self.CanvasHWND = self.Screen.CanvasHWND
  49. self.LoadingLabel = UI.NewLabel()
  50. self.LoadingLabel.SetCanvasHWND(self.CanvasHWND)
  51. self.LoadingLabel.Init("Loading",self.ListFontObj,nil)
  52. self.LoadingLabel.SetColor(self.TextColor)
  53. self.Downloader = grab.NewClient()
  54. self.Downloading = make(chan bool,1)
  55. }
  56. func (self *LoadHousePage) SetDownloading(v bool) {
  57. for len(self.Downloading) > 0 {
  58. <- self.Downloading
  59. }
  60. self.Downloading <- v
  61. }
  62. func (self *LoadHousePage) OnLoadCb() {
  63. if len(self.URL) < 10 {
  64. return
  65. }
  66. self.ClearCanvas()
  67. self.Screen.Draw()
  68. self.Screen.SwapAndShow()
  69. //parts := strings.Split(self.URL,"/")
  70. //filename := strings.TrimSpace(parts[len(parts)-1])
  71. local_dir := strings.Split(self.URL,"raw.githubusercontent.com")
  72. home_path, _ := os.UserHomeDir()
  73. fmt.Println("LoadHouse OnLoadCb")
  74. if len(local_dir) > 1 {
  75. menu_file := local_dir[1]
  76. local_menu_file := fmt.Sprintf(aria2dl_folder,
  77. home_path,menu_file)
  78. if UI.FileExists(local_menu_file) {
  79. var result WareHouseIndex
  80. jsonFile, err := os.Open(local_menu_file)
  81. if err != nil {
  82. fmt.Println(err)
  83. return
  84. }
  85. defer jsonFile.Close()
  86. byteValue, _ := ioutil.ReadAll(jsonFile)
  87. json.Unmarshal(byteValue, &result)
  88. self.Parent.MyStack.Push(result.List)
  89. self.Leave()
  90. } else {
  91. self.req,_ = grab.NewRequest("/tmp",self.URL)
  92. self.resp = self.Downloader.Do(self.req)
  93. self.SetDownloading(true)
  94. fmt.Println("Start Download index json to /tmp,grab")
  95. go self.UpdateProcessInterval(400)
  96. }
  97. }
  98. }
  99. func (self *LoadHousePage) UpdateProcessInterval(ms int) {
  100. ms_total := 0
  101. t := gotime.NewTicker(gotime.Duration(ms) * gotime.Millisecond)
  102. defer t.Stop()
  103. L:
  104. for {
  105. select {
  106. case <-t.C:
  107. fmt.Printf(" transferred %v / %v bytes (%.2f%%)\n",
  108. self.resp.BytesComplete(),
  109. self.resp.Size,
  110. 100*self.resp.Progress())
  111. ms_total += ms
  112. if(ms_total > 5000) {
  113. fmt.Println("LoadHouse Timeout")
  114. break L
  115. }
  116. case <-self.resp.Done:
  117. // download is complete
  118. fmt.Println("Grab Download House done")
  119. break L
  120. case v:= <- self.Downloading:
  121. if v == false {
  122. break L
  123. }
  124. }
  125. }
  126. dst_filename := self.resp.Filename
  127. fmt.Println("dst_filename ",dst_filename)
  128. if err := self.resp.Err(); err == nil {//download successfully
  129. home_path, _ := os.UserHomeDir()
  130. parts := strings.Split(self.URL,"/")
  131. filename := strings.TrimSpace(parts[len(parts)-1])
  132. local_dir := strings.Split(self.URL,"raw.githubusercontent.com")
  133. local_menu_file := ""
  134. menu_file := ""
  135. if len(local_dir) > 1 {
  136. menu_file = local_dir[1]
  137. local_menu_file = fmt.Sprintf(aria2dl_folder,
  138. home_path,menu_file)
  139. }
  140. dl_file := path.Join("/tmp",filename)
  141. fmt.Println("dl_file: ",dl_file)
  142. fmt.Println(local_menu_file)
  143. if UI.IsDirectory( filepath.Dir(local_menu_file) ) == false {
  144. merr := os.MkdirAll( filepath.Dir(local_menu_file), os.ModePerm)
  145. if merr != nil {
  146. panic(merr)
  147. }
  148. }
  149. UI.CopyFile(dl_file,local_menu_file)
  150. os.Remove(dl_file)
  151. var result WareHouseIndex
  152. jsonFile, err := os.Open(local_menu_file)
  153. if err != nil {
  154. fmt.Println(err)
  155. return
  156. }
  157. defer jsonFile.Close()
  158. byteValue, _ := ioutil.ReadAll(jsonFile)
  159. json.Unmarshal(byteValue, &result)
  160. self.Parent.MyStack.Push(result.List)
  161. self.Leave()
  162. } else {
  163. fmt.Println(err)
  164. self.Screen.MsgBox.SetText("Fetch house failed")
  165. self.Screen.MsgBox.Draw()
  166. self.Screen.SwapAndShow()
  167. time.BlockDelay(500)
  168. }
  169. }
  170. func (self *LoadHousePage) Leave() {
  171. self.SetDownloading(false)
  172. self.ReturnToUpLevelPage()
  173. self.Screen.Draw()
  174. self.Screen.SwapAndShow()
  175. self.URL = ""
  176. }
  177. func (self *LoadHousePage) KeyDown(ev *event.Event) {
  178. if UI.IsKeyMenuOrB(ev.Data["Key"]) {
  179. self.Leave()
  180. }
  181. }
  182. func (self *LoadHousePage) Draw() {
  183. self.ClearCanvas()
  184. w,_ := self.LoadingLabel.Size()
  185. self.LoadingLabel.NewCoord( (UI.Width - w)/2,(UI.Height-44)/2);
  186. self.LoadingLabel.Draw()
  187. }