123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- package UI
- import (
- "fmt"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
- "net/url"
- gotime "time"
- "github.com/cuu/gogame/color"
- "github.com/cuu/gogame/draw"
- "github.com/cuu/gogame/event"
- "github.com/cuu/grab"
- )
- type DownloadProcessPage struct {
- Page
- URL string
- DST_DIR string
- Value int
- PngSize map[string][2]int
- Doing bool
- FileNameLabel LabelInterface
- SizeLabel LabelInterface
- Icons map[string]IconItemInterface
- URLColor *color.Color
- TextColor *color.Color
- TheTicker *gotime.Ticker
- Downloader *grab.Client
- resp *grab.Response
- req *grab.Request
- }
- func NewDownloadProcessPage() *DownloadProcessPage {
- p := &DownloadProcessPage{}
- p.FootMsg = [5]string{"Nav", "", "", "Back", ""}
- p.URLColor = &color.Color{51, 166, 255, 255} // URL
- p.TextColor = &color.Color{83, 83, 83, 255} // Text
- p.PngSize = make(map[string][2]int, 0)
- p.Icons = make(map[string]IconItemInterface)
- return p
- }
- func (self *DownloadProcessPage) Init() {
- self.PosX = self.Index * self.Screen.Width
- self.Width = self.Screen.Width
- self.Height = self.Screen.Height
- self.CanvasHWND = self.Screen.CanvasHWND
- self.PngSize["bg"] = [2]int{48, 79}
- self.PngSize["needwifi_bg"] = [2]int{253, 132}
- bgpng := NewIconItem()
- bgpng.ImgSurf = MyIconPool.GetImgSurf("rom_download")
- bgpng.MyType = ICON_TYPES["STAT"]
- bgpng.Parent = self
- bgpng.Adjust(0, 0, self.PngSize["bg"][0], self.PngSize["bg"][1], 0)
- self.Icons["bg"] = bgpng
- needwifi_bg := NewIconItem()
- needwifi_bg.ImgSurf = MyIconPool.GetImgSurf("needwifi_bg")
- needwifi_bg.MyType = ICON_TYPES["STAT"]
- needwifi_bg.Parent = self
- needwifi_bg.Adjust(0, 0, self.PngSize["needwifi_bg"][0], self.PngSize["needwifi_bg"][1], 0)
- self.Icons["needwifi_bg"] = needwifi_bg
- self.FileNameLabel = NewLabel()
- self.FileNameLabel.SetCanvasHWND(self.CanvasHWND)
- self.FileNameLabel.Init("", Fonts["varela12"], nil)
- self.SizeLabel = NewLabel()
- self.SizeLabel.SetCanvasHWND(self.CanvasHWND)
- self.SizeLabel.Init("0/0Kb", Fonts["varela12"], nil)
- self.SizeLabel.SetColor(self.URLColor)
- self.Downloader = grab.NewClient()
- }
- func (self *DownloadProcessPage) OnExitCb() {
- //Stop Ticker and the Grab
- if self.TheTicker != nil {
- self.TheTicker.Stop()
- }
- }
- // should be in a gorotine
- func (self *DownloadProcessPage) UpdateProcessInterval() {
- if self.Doing == true {
- return
- }
- self.Doing = true
- for {
- gotime.Sleep(150 * gotime.Millisecond)
- fmt.Printf(" transferred %v / %v bytes (%.2f%%)\n",
- self.resp.BytesComplete(),
- self.resp.Size,
- 100*self.resp.Progress())
- self.Value = int(100.0 * self.resp.Progress())
- total := float64(self.resp.Size) / 1000.0 / 1000.0
- downloaded := float64(self.resp.BytesComplete()) / 1000.0 / 1000.0
- lb_str := fmt.Sprintf("%.2f/%.2fMb", downloaded, total)
- self.SizeLabel.SetText(lb_str)
- self.FileNameLabel.SetText(filepath.Base(self.resp.Filename))
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- if self.resp.Progress() >= 1.0 {
- // download is complete
- fmt.Println("download is complete ", self.Value)
- self.Value = 0
- self.Doing = false
- break
- }
- if self.Doing == false {
- break
- }
- }
- self.Doing = false
- if err := self.resp.Err(); err != nil {
- self.DownloadErr()
- fmt.Fprintf(os.Stderr, "Download failed: %v\n", err)
- cmd := exec.Command("rm", "-rf", self.resp.Filename)
- cmd.Dir = self.DST_DIR
- cmd.Run()
- }
- fmt.Printf("Download saved to %s/%v \n", self.DST_DIR, self.resp.Filename)
- filename := filepath.Base(self.resp.Filename)
- if strings.HasSuffix(filename, ".zip") {
- cmd := exec.Command("unzip", filename)
- cmd.Dir = self.DST_DIR
- cmd.Run()
- } else if strings.HasSuffix(filename, ".zsync") {
- cmd := exec.Command("rm", "-rf", filename)
- cmd.Dir = self.DST_DIR
- cmd.Run()
- } else if strings.HasSuffix(filename, ".tar.gz") {
- cmd := exec.Command("tar", "xf", filename)
- cmd.Dir = self.DST_DIR
- cmd.Run()
- }
- cmd := exec.Command("rm", "-rf", filename)
- cmd.Dir = self.DST_DIR
- cmd.Run()
- self.DoneAndReturnUpLevel()
- }
- func (self *DownloadProcessPage) DownloadErr() {
- self.Screen.MsgBox.SetText("Download Failed")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *DownloadProcessPage) DoneAndReturnUpLevel() {
- self.ReturnToUpLevelPage()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *DownloadProcessPage) StartDownload(_url, dst_dir string) {
- if self.Screen.IsWifiConnectedNow() == false {
- return
- }
- _, err := url.ParseRequestURI(_url)
- if err == nil && IsDirectory(dst_dir) {
- self.URL = _url
- self.DST_DIR = dst_dir
- } else {
- self.Screen.MsgBox.SetText("Invaid")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- fmt.Println("DownloadProcessPage StartDownload Invalid ", err)
- return
- }
- if self.Doing == false {
- self.req, _ = grab.NewRequest(self.DST_DIR, _url)
- fmt.Printf("Downloading %v...\n", self.req.URL())
- self.resp = self.Downloader.Do(self.req)
- fmt.Printf(" %v\n", self.resp.HTTPResponse.Status)
- self.UpdateProcessInterval()
- }
- }
- func (self *DownloadProcessPage) StopDownload() {
- self.Doing = false
- }
- func (self *DownloadProcessPage) KeyDown(ev *event.Event) {
- if ev.Data["Key"] == CurKeys["A"] || ev.Data["Key"] == CurKeys["Menu"] {
- self.StopDownload()
- self.ReturnToUpLevelPage()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- }
- func (self *DownloadProcessPage) Draw() {
- self.ClearCanvas()
- if self.Screen.IsWifiConnectedNow() == false {
- self.Icons["needwifi_bg"].NewCoord(self.Width/2, self.Height/2)
- self.Icons["needwifi_bg"].Draw()
- return
- }
- self.Icons["bg"].NewCoord(self.Width/2, self.Height/2-20)
- self.Icons["bg"].Draw()
- percent := self.Value
- if percent < 10 {
- percent = 10
- }
- rect_ := draw.MidRect(self.Width/2, self.Height/2+33, 170, 17, Width, Height)
- draw.AARoundRect(self.CanvasHWND, rect_,
- &color.Color{228, 228, 228, 255}, 5, 0, &color.Color{228, 228, 228, 255})
- rect2_ := draw.MidRect(self.Width/2, self.Height/2+33, int(170.0*(float64(percent)/100.0)), 17, Width, Height)
- rect2_.X = rect_.X
- rect2_.Y = rect_.Y
- draw.AARoundRect(self.CanvasHWND, rect2_,
- &color.Color{131, 199, 219, 255}, 5, 0, &color.Color{131, 199, 219, 255})
- w, h := self.FileNameLabel.Size()
- rect3_ := draw.MidRect(self.Width/2, self.Height/2+53, w, h, Width, Height)
- w, h = self.SizeLabel.Size()
- rect4_ := draw.MidRect(self.Width/2, self.Height/2+70, w, h, Width, Height)
- self.FileNameLabel.NewCoord(int(rect3_.X), int(rect3_.Y))
- self.FileNameLabel.Draw()
- self.SizeLabel.NewCoord(int(rect4_.X), int(rect4_.Y))
- self.SizeLabel.Draw()
- }
|