From e9a469f72dfddd92284ebe9b5c50ff1607206c5c Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 13 Jun 2016 00:19:39 +0200 Subject: WIP --- bencode/bencode_test.go | 2 +- btshow/main.go | 4 ++-- meta/torrent.go | 64 +++++++++++++++++++++++++++++++++++++++++++++---- 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 } } -- cgit v1.2.3