diff options
Diffstat (limited to 'steam/package.go')
| -rw-r--r-- | steam/package.go | 112 |
1 files changed, 57 insertions, 55 deletions
diff --git a/steam/package.go b/steam/package.go index a73a6bc..9000cba 100644 --- a/steam/package.go +++ b/steam/package.go @@ -1,94 +1,96 @@ package steam import ( - // "fmt" - "riedstra.dev/mitch/steam-export/archive" + "archive/tar" + "io" "os" "path/filepath" + "strings" ) -func (l *Library) PackageGameToFile(index int, file, compress string) error { - g := l.Games[index] - - working_dir, err := os.Getwd() - if err != nil { +// Package writes the package, returning bytes written and an error if any +func (g *Game) Package(wr io.Writer) error { + if err := os.Chdir(g.LibraryPath); err != nil { return err } - // output := working_dir + "/" + g + ".tar" - output, err := filepath.Abs(file) + acf, err := FindACF(g.LibraryPath, g.Name) if err != nil { return err } - os.Chdir(l.Folder) - acf, err := l.FindACF(g) - if err != nil { - return err - } - input := []string{"common/" + g, acf} - a := archive.Archive{Output: output, Input: input} - err = a.Tar(compress) - if err != nil { - return err - } + twriter := tar.NewWriter(wr) - os.Chdir(working_dir) + for _, pth := range []string{"common/" + g.Name, acf} { + if err := filepath.Walk(pth, TarWalkfn(twriter)); err != nil { + return err + } + } return nil } -func (l *Library) ExtractGameFromFile(f, compress string) error { - working_dir, err := os.Getwd() - if err != nil { +func (l *Library) Extract(r io.Reader) error { + if err := os.Chdir(l.Folder); err != nil { return err } - f, err = filepath.Abs(f) - if err != nil { - return err - } + treader := tar.NewReader(r) - if err = os.Chdir(l.Folder); err != nil { - return err - } - u := &archive.Unarchive{ - Input: f, - } - if err := u.UnTar(compress); err != nil { - return err - } + for { + hdr, err := treader.Next() + if err == io.EOF { + // We've reached the end! Whoee + break + } + if err != nil { + return err + } - if err = os.Chdir(working_dir); err != nil { - return err - } - return nil -} + // Fix windows slashes... + fileName := strings.Replace(hdr.Name, "\\", "/", -1) -func (l *Library) DeleteGame(i int) error { - g := l.Games[i] + info := hdr.FileInfo() + if info.IsDir() { + // I don't like hard-coded permissions but it + // it helps with overall platform compatibility + if err = os.MkdirAll(fileName, 0775); err != nil { + return err + } + continue + } + + if err = os.MkdirAll(filepath.Dir(fileName), 0775); err != nil { + return err + } + + // Create a file handle to work with + f, err := os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0664) + if err != nil { + return err + } + defer f.Close() + if _, err := io.Copy(f, treader); err != nil { + return err + } - working_dir, err := os.Getwd() - if err != nil { - return err } - if err = os.Chdir(l.Folder); err != nil { + return nil +} + +func (g *Game) Delete() error { + if err := os.Chdir(g.LibraryPath); err != nil { return err } - acf, err := l.FindACF(g) + acf, err := FindACF(g.LibraryPath, g.Name) if err != nil { return err } - // fmt.Fprintf(os.Stderr, "Removing %q %q\n", acf, "common/"+g) if err := os.Remove(acf); err != nil { return err } - if err := os.RemoveAll("common/" + g); err != nil { - return err - } - - if err = os.Chdir(working_dir); err != nil { + if err := os.RemoveAll("common/" + g.Name); err != nil { return err } |
