aboutsummaryrefslogtreecommitdiff
path: root/steam/package.go
diff options
context:
space:
mode:
Diffstat (limited to 'steam/package.go')
-rw-r--r--steam/package.go112
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
}