From e61b8493f9b13b5111a950fd3dfd488cb5bd5556 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 6 Jul 2016 21:21:57 +0200 Subject: wip --- meta/info.go | 59 +++++++++++++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/meta/info.go b/meta/info.go index 988c3bc..81aac3a 100644 --- a/meta/info.go +++ b/meta/info.go @@ -21,6 +21,17 @@ type Info struct { RootHash []byte `bencode:"root hash"` // BEP-0030 } +// Full returns count of full pieces +func (i Info) Full() int { + return i.TotalLength() / i.PieceLength +} + +// Last returns size of last truncated piece +func (i Info) Last() int { + return i.TotalLength() % i.PieceLength +} + +// TotalLength calculates and retuns the length of all files func (i Info) TotalLength() int { if i.Length == 0 { for _, f := range i.Files { @@ -31,9 +42,7 @@ func (i Info) TotalLength() int { } func (i Info) GetPieces() []Piece { - length := i.TotalLength() - n := length / i.PieceLength - last := length % i.PieceLength + n, last := i.Full(), i.Last() if last > 0 { n++ } @@ -41,7 +50,7 @@ func (i Info) GetPieces() []Piece { for k := 0; k < n; k++ { p[k].Length = i.PieceLength if k+1 == n { - p[k].Length = length + p[k].Length = last } off := k * sha1.Size copy(p[k].Sum[:], i.Pieces[off:off+sha1.Size]) @@ -50,14 +59,18 @@ func (i Info) GetPieces() []Piece { return p } -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") +// Open file and allocate required path +func (i Info) Open(n int) (*os.File, error) { + var p string + if len(i.Files) == 0 { + p = i.Name + } else { + p = path.Join(i.Name, i.Files[n].Name()) + if err := os.MkdirAll(p, 0755); err != nil { + return nil, err + } } - return path.Join(i.Name, i.Files[n].Name()), nil + return os.OpenFile(i.Name, os.O_RDWR|os.O_CREATE, 0644) } func (i Info) Offset(piece int) int { @@ -81,10 +94,6 @@ func (i Info) FindFile(off int) (int, int) { * 0 1 2 3 4 5 6 7 #file */ -func (i Info) isSingleFile() bool { - return len(i.Files) == 0 -} - // FIXME WriteAt ... func (i Info) WriteAt(b []byte, off int64) (n int, err error) { return 0, ErrNotImplemented @@ -92,8 +101,8 @@ 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 i.isSingleFile() { - fd, err := os.OpenFile(i.Name, os.O_RDWR|os.O_CREATE, 0644) + if len(i.Files) == 0 { + fd, err := i.Open(0) if err != nil { return 0, err } @@ -105,11 +114,7 @@ func (i Info) ReadAt(b []byte, off int64) (n int, err error) { end := i.PieceLength for k := n; k < len(i.Files); k++ { f := i.Files[n] - p, err := i.FullPath(k) - if err != nil { - return 0, err - } - fd, err := os.OpenFile(p, os.O_RDWR|os.O_CREATE, 0644) + fd, err := i.Open(k) if err != nil { return 0, err } @@ -129,16 +134,6 @@ func (i Info) ReadAt(b []byte, off int64) (n int, err error) { return 0, ErrNotImplemented } -// Last returns size of last truncated piece -func (i Info) Last() int { - return i.TotalLength() % i.PieceLength -} - -// Full returns count of full pieces -func (i Info) Full() int { - return i.TotalLength() / i.PieceLength -} - func (i Info) String() string { s := fmt.Sprintf("%s (%d) ", i.Name, i.TotalLength()) s += fmt.Sprintf("%d × %d + %d\n", i.Full(), i.PieceLength, i.Last()) -- cgit v1.2.3