aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-06 21:21:57 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-06 21:21:57 +0200
commite61b8493f9b13b5111a950fd3dfd488cb5bd5556 (patch)
tree006281249273b7d067c688ef4429e74fdc6077ea
parentd674b9a758cb154972c372e630a66b2fcfdaaa3a (diff)
wip
-rw-r--r--meta/info.go59
1 files 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())