aboutsummaryrefslogtreecommitdiff
path: root/meta/info.go
diff options
context:
space:
mode:
Diffstat (limited to 'meta/info.go')
-rw-r--r--meta/info.go63
1 files changed, 24 insertions, 39 deletions
diff --git a/meta/info.go b/meta/info.go
index b99fdd7..c498f9e 100644
--- a/meta/info.go
+++ b/meta/info.go
@@ -12,10 +12,10 @@ var ErrNotImplemented = errors.New("not implemented")
type Info struct {
Files []File `bencode:"files"`
- Length int `bencode:"length"`
+ Length int64 `bencode:"length"`
MD5Sum []byte `bencode:"md5sum,optional"` // never seen in wildlife
Name string `bencode:"name"`
- PieceLength int `bencode:"piece length"`
+ PieceLength int64 `bencode:"piece length"`
Pieces []byte `bencode:"pieces"` // compact mode
Private bool `bencode:"private"` // BEP-0027
RootHash []byte `bencode:"root hash"` // BEP-0030
@@ -23,16 +23,16 @@ type Info struct {
// Full returns count of full pieces
func (i Info) Full() int {
- return i.TotalLength() / i.PieceLength
+ return int(i.TotalLength() / i.PieceLength)
}
// Last returns size of last truncated piece
-func (i Info) Last() int {
+func (i Info) Last() int64 {
return i.TotalLength() % i.PieceLength
}
// TotalLength calculates and retuns the length of all files
-func (i Info) TotalLength() int {
+func (i Info) TotalLength() int64 {
if i.Length == 0 {
for _, f := range i.Files {
i.Length += f.Length
@@ -54,7 +54,7 @@ func (i Info) GetPieces() []Piece {
}
off := k * sha1.Size
copy(p[k].Sum[:], i.Pieces[off:off+sha1.Size])
- p[k].Offset = k * i.PieceLength
+ p[k].Offset = int64(k) * i.PieceLength
}
return p
}
@@ -78,14 +78,14 @@ func (i Info) Open(n int) (*os.File, error) {
}
// Offset of piece in gross buffer
-func (i Info) Offset(piece int) int {
- return i.PieceLength * piece
+func (i Info) Offset(piece int) int64 {
+ return i.PieceLength * int64(piece)
}
-// FindFile looks up first file # corresponding to offset in gross buffer
-// If piece is bigger the next file(s) with offset 0 shall be used to
-// fit a piece into
-func (i Info) FindFile(off int) (int, int) {
+// FindFile looks up first file # corresponding to offset into it
+// If piece is bigger then file, next file(s) with offset 0 shall be used
+// to fit a piece into
+func (i Info) FindFile(off int64) (int, int64) {
for n, l := range i.Files {
if l.Length > off {
return n, off
@@ -114,37 +114,22 @@ func (i Info) WriteAt(b []byte, off int64) (n int, err error) {
// FIXME ReadAt ...
func (i Info) ReadAt(b []byte, off int64) (n int, err error) {
- if len(i.Files) == 0 {
- fd, err := i.Open(0)
+ n, offset := i.FindFile(off)
+ var done int
+ for k := n; done < len(b); k++ {
+ fd, err := i.Open(k)
if err != nil {
- return 0, err
+ return done, err
}
- defer fd.Close()
- return fd.ReadAt(b, int64(i.PieceLength)*off)
- } else {
- n, off := i.FindFile(int(off))
- start := off
- end := i.PieceLength
- for k := n; k < len(i.Files); k++ {
- f := i.Files[n]
- fd, err := i.Open(k)
- if err != nil {
- return 0, err
- }
- defer fd.Close()
- if end > f.Length {
- end = f.Length
- }
- fd.ReadAt(b[start:end], int64(off))
- start = end
- end = i.PieceLength
- off += f.Length
- if start == end {
- return cap(b), nil
- }
+ nn, err := fd.ReadAt(b[done:], offset)
+ if err != nil {
+ return done, err
}
+ done += nn
+ fd.Close()
+ off = 0
}
- return 0, ErrNotImplemented
+ return done, nil
}
func (i Info) String() string {