aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-06-13 00:19:39 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-06-13 00:19:39 +0200
commite9a469f72dfddd92284ebe9b5c50ff1607206c5c (patch)
tree0d946b9ef8b0aa68cd60b8ef9ddde3d9ca9d3f67
parentaa8c4a10a6516ff031b02eaf78e5b826317e819b (diff)
WIP
-rw-r--r--bencode/bencode_test.go2
-rw-r--r--btshow/main.go4
-rw-r--r--meta/torrent.go64
3 files changed, 63 insertions, 7 deletions
diff --git a/bencode/bencode_test.go b/bencode/bencode_test.go
index 76f73d0..2268e38 100644
--- a/bencode/bencode_test.go
+++ b/bencode/bencode_test.go
@@ -6,7 +6,7 @@ import (
"testing"
"time"
- "dim13.org/btr/meta"
+ "dim13.org/btget/meta"
)
func TestMarshal(t *testing.T) {
diff --git a/btshow/main.go b/btshow/main.go
index afd6f08..9d204bb 100644
--- a/btshow/main.go
+++ b/btshow/main.go
@@ -6,8 +6,8 @@ import (
"log"
"os"
- "dim13.org/btr/bencode"
- "dim13.org/btr/meta"
+ "dim13.org/btget/bencode"
+ "dim13.org/btget/meta"
)
func main() {
diff --git a/meta/torrent.go b/meta/torrent.go
index 0993681..d30dc48 100644
--- a/meta/torrent.go
+++ b/meta/torrent.go
@@ -1,11 +1,14 @@
package meta
import (
+ "errors"
"fmt"
"path"
"time"
)
+var ErrNotImplemented = errors.New("not implemented")
+
type File struct {
Length int `bencode:"length"`
MD5Sum []byte `bencode:"md5sum,optional"`
@@ -22,7 +25,57 @@ type Info struct {
Private bool `bencode:"private"`
}
-func (i Info) SingleFile() bool {
+func (i Info) FullPath(n int) (string, error) {
+ if i.isSingleFile() {
+ return i.Name, nil
+ }
+ if n >= len(i.Files) || n < 0 {
+ return "", errors.New("out of range")
+ }
+ p := append([]string{i.Name}, i.Files[n].Path...)
+ return path.Join(p...), nil
+}
+
+func (i Info) FindFile(chunk, offset int) int {
+ if i.isSingleFile() {
+ return 0
+ }
+ return 0
+}
+
+func (i Info) WriteAt(p []byte, off int64) (n int, err error) {
+ return 0, ErrNotImplemented
+}
+
+func (i Info) ReadAt(p []byte, off int64) (n int, err error) {
+ return 0, ErrNotImplemented
+}
+
+/*
+func (i Info) WriteAt(data []byte, chunk, offcet int) error {
+ return nil
+}
+
+func (i Info) ReadAt(chunk, offset, length int) ([]byte, error) {
+ if length == 0 {
+ length = i.PieceLength
+ offset = 0
+ }
+ data := make([]byte, length)
+ start := chunk * i.PieceLength
+ var n, off int
+ for n = range i.Files {
+ off += i.Files[n].Length
+ if off > start {
+ break
+ }
+ }
+ // ...
+ return data, nil
+}
+*/
+
+func (i Info) isSingleFile() bool {
return len(i.Files) > 0
}
@@ -35,9 +88,12 @@ func (i Info) String() string {
var s string
if l := len(i.Files); l > 0 {
s += fmt.Sprintln("files:", l)
- for _, f := range i.Files {
- p := append([]string{i.Name}, f.Path...)
- s += fmt.Sprintf(" %s (%d)\n", path.Join(p...), f.Length)
+ for n, f := range i.Files {
+ p, err := i.FullPath(n)
+ if err != nil {
+ panic(err)
+ }
+ s += fmt.Sprintf(" %s (%d)\n", p, f.Length)
i.Length += f.Length
}
}