From 01556c1eb06c54485470bb16ecc6a4c8a7dff9d8 Mon Sep 17 00:00:00 2001 From: Belac Darkstorm Date: Sat, 8 Apr 2017 20:06:50 -0500 Subject: [PATCH] Getting ready for AppImage downloading --- app.go | 48 ++++++++++++++------ appimg/Proc.go | 60 +++++++++++++++++++++++++ appimg/Tag.go | 117 +++++++++++++++++++++++++++++++++++++++++++++++++ setup.go | 8 ++++ ui.go | 14 +++--- wine.go | 16 +++---- 6 files changed, 236 insertions(+), 27 deletions(-) create mode 100644 appimg/Proc.go create mode 100644 appimg/Tag.go diff --git a/app.go b/app.go index 18d6759..f941b72 100644 --- a/app.go +++ b/app.go @@ -25,9 +25,16 @@ func (a *app) getTreeIter(store *gtk.TreeStore) *gtk.TreeIter { store.SetValue(it, 0, a.icon) store.SetValue(it, 1, a.name) if len(a.ex) > 1 { - for _, v := range a.ex { - i := store.Append(it) - store.SetValue(i, 1, v) + if wine { + for _, v := range a.ex { + i := store.Append(it) + store.SetValue(i, 1, v) + } + } else { + for _, v := range a.lin { + i := store.Append(it) + store.SetValue(i, 1, v) + } } } return it @@ -38,7 +45,11 @@ func (a *app) launch() { if wine { var cmd *exec.Cmd if !contains(a.lin, a.ex[0]) { - cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"") + if comEnbld { + cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"") + } else { + cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"") + } } else { if comEnbld { cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[0]+"\"") @@ -64,7 +75,11 @@ func (a *app) launch() { if wine { var cmd *exec.Cmd if len(a.lin) == 0 { - cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"") + if comEnbld { + cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"") + } else { + cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"") + } } else { var ind int for i, v := range a.lin { @@ -109,7 +124,11 @@ func (a *app) launchSub(sub int) { if wine { var cmd *exec.Cmd if !contains(a.lin, a.ex[sub]) { - cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[sub]+"\"") + if comEnbld { + cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; wine \""+a.ex[sub]+"\"") + } else { + cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[sub]+"\"") + } } else { if comEnbld { cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"") @@ -120,14 +139,15 @@ func (a *app) launchSub(sub int) { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Start() - } - var cmd *exec.Cmd - if comEnbld { - cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"") } else { - cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"") + var cmd *exec.Cmd + if comEnbld { + cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"") + } else { + cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"") + } + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Start() } - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Start() } diff --git a/appimg/Proc.go b/appimg/Proc.go new file mode 100644 index 0000000..d24f28a --- /dev/null +++ b/appimg/Proc.go @@ -0,0 +1,60 @@ +//Package appimg is to download and update AppImages for LinuxPA. +//Converted from github.com/CalebQ42/bbConvert +package appimg + +import "reflect" + +//Convert converts the input string. Only returns tags +func Convert(in string) (out []Tag) { + for i := 0; i < len(in); i++ { + v := in[i] + if v == '<' { + for j := i; j < len(in); j++ { + val := in[j] + if val == '>' { + var tmp Tag + tmp.process(in[i+1 : j+1]) + if !tmp.end { + tmp.index[0] = i + tmp.index[1] = j + nd := fndend(tmp, in[j+1:]) + if !reflect.DeepEqual(nd, Tag{}) && tmp.typ == "a" { + out = append(out, tmp) + } + } + break + } + } + } + } + return +} + +func fndend(fnt Tag, area string) Tag { + var count int + for i, v := range area { + if v == '<' { + for j, val := range area[i:] { + if val == '>' { + var tmp Tag + tmp.process(area[i+1 : i+j+1]) + if tmp.typ == fnt.typ { + if tmp.end { + if count == 0 { + tmp.index[0] = fnt.index[1] + 1 + i + tmp.index[1] = fnt.index[1] + j + i + 1 + return tmp + } + count-- + break + } else { + count++ + break + } + } + } + } + } + } + return Tag{} +} diff --git a/appimg/Tag.go b/appimg/Tag.go new file mode 100644 index 0000000..7542e01 --- /dev/null +++ b/appimg/Tag.go @@ -0,0 +1,117 @@ +package appimg + +import "strings" + +//Tag is a bbCode tag that is properly processed. +type Tag struct { + typ string + end bool + params map[string]string + index [2]int +} + +//Value returns the value of a parameter of the bbCode tag. Starting parameters +//is under "starting". Parameter names are always in lowercase +func (t *Tag) Value(param string) string { + return t.params[param] +} + +func (t *Tag) setValue(param, value string) { + if t.params == nil { + t.params = make(map[string]string) + } + t.params[strings.TrimSpace(strings.ToLower(param))] = strings.TrimSpace(value) +} + +func (t *Tag) process(bbtag string) { + if strings.HasPrefix(bbtag, "/") { + t.end = true + t.typ = strings.ToLower(strings.TrimPrefix(bbtag[:len(bbtag)-1], "/")) + return + } + for i, v := range bbtag { + if v == '=' || v == ' ' || v == '>' { + t.typ = strings.ToLower(bbtag[:i]) + switch v { + case '=': + if qt := bbtag[i+1]; qt == '\'' || qt == '"' { + for j := i + 2; j < len(bbtag); j++ { + if bbtag[j] == qt { + t.setValue("starting", bbtag[i+2:j]) + bbtag = bbtag[j+1:] + break + } else if bbtag[j] == '>' { + t.setValue("starting", bbtag[i+2:j]) + return + } + } + } else { + for j := i + 1; j < len(bbtag); j++ { + if bbtag[j] == '>' { + t.setValue("starting", bbtag[i+1:j]) + return + } else if bbtag[j] == ' ' { + t.setValue("starting", bbtag[i+1:j]) + bbtag = bbtag[j+1:] + break + } + } + } + case '>': + return + case ' ': + bbtag = bbtag[i:] + } + break + } + } + t.processFurther(bbtag) +} + +func (t *Tag) processFurther(further string) { + further = strings.TrimSpace(further) + for i := 0; i < len(further); i++ { + switch further[i] { + case ' ': + t.setValue(strings.ToLower(further[:i]), further[:i]) + further = strings.TrimSpace(further[i:]) + i = -1 + case '=': + if qt := further[i+1]; qt == '\'' || qt == '"' { + outloopqt: + for j := i + 2; j < len(further); j++ { + switch further[j] { + case '>': + t.setValue(strings.ToLower(further[:i]), further[i+2:j]) + return + case qt: + t.setValue(strings.ToLower(further[:i]), further[i+2:j]) + further = strings.TrimSpace(further[j+1:]) + i = -1 + break outloopqt + } + } + } else { + outloop: + for j := i + 1; j < len(further); j++ { + switch further[j] { + case '>': + t.setValue(strings.ToLower(further[:i]), further[i+1:j]) + return + case ' ': + t.setValue(strings.ToLower(further[:i]), further[i+1:j]) + further = strings.TrimSpace(further[j:]) + i = -1 + break outloop + } + } + } + case '>': + if i != 0 { + t.setValue(strings.ToLower(further[:i]), further[:i]) + return + } + return + } + } +} diff --git a/setup.go b/setup.go index 52ef99a..394a6d7 100644 --- a/setup.go +++ b/setup.go @@ -22,6 +22,9 @@ func setup() { } else if err == nil { wineAvail = true } + if !wineAvail { + wine = false + } PortableAppsFold, err := os.Open("PortableApps") if PAStat, _ := PortableAppsFold.Stat(); err != nil || !PAStat.IsDir() { os.Mkdir("PortableApps", 0777) @@ -119,6 +122,8 @@ func getCat(ini *os.File) string { if strings.HasPrefix(string(line), "Category=") { ret = strings.TrimPrefix(string(line), "Category=") break + } else if strings.HasPrefix(string(line), "category=") { + ret = strings.TrimPrefix(string(line), "category=") } } rdr.Reset(ini) @@ -132,6 +137,9 @@ func getName(ini *os.File) string { if strings.HasPrefix(string(line), "Name=") { ret = strings.TrimPrefix(string(line), "Name=") break + } else if strings.HasPrefix(string(line), "name=") { + ret = strings.TrimPrefix(string(line), "name=") + break } } rdr.Reset(ini) diff --git a/ui.go b/ui.go index 276af52..75a3c2e 100644 --- a/ui.go +++ b/ui.go @@ -1,6 +1,8 @@ package main import ( + "fmt" + "github.com/gotk3/gotk3/glib" "github.com/gotk3/gotk3/gtk" ) @@ -54,14 +56,16 @@ func ui(win *gtk.Window) { wineCheck.SetSensitive(false) wineCheck.SetTooltipText("Download wine to run windows apps") } + wineCheck.SetActive(wine) wineCheck.Connect("toggled", func() { wine = wineCheck.GetActive() for i := range ls { - catList.Remove(catList.GetRowAtIndex(i)) + fmt.Println(len(ls) - i) + catList.Remove(catList.GetRowAtIndex(len(ls) - i - 1)) } ls = getCatRows() - for i, v := range ls { - catList.Insert(v, i) + for _, v := range ls { + catList.Add(v) } catList.ShowAll() }) @@ -69,8 +73,8 @@ func ui(win *gtk.Window) { topLvl.Add(lrBox) topLvl.PackEnd(botBox, false, true, 0) win.Add(topLvl) - for i, v := range ls { - catList.Insert(v, i) + for _, v := range ls { + catList.Add(v) } catList.Connect("row-selected", func() { store.Clear() diff --git a/wine.go b/wine.go index 427f0cf..01334f2 100644 --- a/wine.go +++ b/wine.go @@ -19,6 +19,11 @@ const ( func downloadWine(parent *gtk.Window, cb chan bool) { win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) win.SetTransientFor(parent) + win.SetDestroyWithParent(true) + win.Connect("destroy", func() { + parent.SetSensitive(true) + }) + parent.SetSensitive(false) spin, _ := gtk.SpinnerNew() spin.Start() txt, _ := gtk.LabelNew("Downloading Wine") @@ -33,7 +38,7 @@ func downloadWine(parent *gtk.Window, cb chan bool) { win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT) win.ShowAll() win.Show() - go func(win *gtk.Window) { + go func(win *gtk.Window, txt *gtk.Label) { defer win.Close() wineTar, err := os.Create("PortableApps/LinuxPACom/wine2.5.tar.bz2") if err != nil { @@ -41,7 +46,6 @@ func downloadWine(parent *gtk.Window, cb chan bool) { cb <- false return } - wineTar.Chmod(0777) defer wineTar.Close() check := http.Client{ CheckRedirect: func(r *http.Request, via []*http.Request) error { @@ -55,6 +59,7 @@ func downloadWine(parent *gtk.Window, cb chan bool) { cb <- false return } + os.RemoveAll("PortableApps/LinuxPACom/Wine") defer resp.Body.Close() _, err = io.Copy(wineTar, resp.Body) if err != nil { @@ -63,14 +68,12 @@ func downloadWine(parent *gtk.Window, cb chan bool) { return } txt.SetText("Extracting Wine") - os.RemoveAll("PortableApps/LinuxPACom/Wine") err = archiver.TarBz2.Open("PortableApps/LinuxPACom/wine2.5.tar.bz2", "PortableApps/LinuxPACom/Wine") if err != nil { fmt.Println(err) cb <- false return } - os.Remove("PortableApps/LinuxPACom/wine2.5.tar.bz2") fil, err := os.Open("PortableApps/LinuxPACom/common.sh") if err != nil { fmt.Println(err) @@ -83,19 +86,16 @@ func downloadWine(parent *gtk.Window, cb chan bool) { cb <- false return } - fmt.Println("Hello") if !strings.Contains(string(tmp), "export PATH=$PWD/PortableApps/LinuxPACom/Wine/wineversion/2.5/bin:$PATH") { tmp = append(tmp, []byte("\nexport PATH=$PWD/PortableApps/LinuxPACom/Wine/wineversion/2.5/bin:$PATH")...) ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", tmp, 0777) - fmt.Println("Hello2") if err != nil { fmt.Println(err) cb <- false return } } - fmt.Println("HelloT") cb <- true return - }(win) + }(win, txt) }