aboutsummaryrefslogtreecommitdiff
path: root/meta/piece.go
diff options
context:
space:
mode:
Diffstat (limited to 'meta/piece.go')
-rw-r--r--meta/piece.go49
1 files changed, 18 insertions, 31 deletions
diff --git a/meta/piece.go b/meta/piece.go
index 247f848..ee39d36 100644
--- a/meta/piece.go
+++ b/meta/piece.go
@@ -4,23 +4,30 @@ import (
"crypto/sha1"
"fmt"
- "dim13.org/btget/bitfield"
+ "dim13.org/btget/bencode"
)
type Pieces []Piece
-type Piece struct {
- Offset int64
- Length int
- Sum [sha1.Size]byte
- Ok bool
+func (p *Pieces) UnmarshalBencode(b []byte) (int, error) {
+ var tmp []byte
+ n, err := bencode.Unmarshal(b, &tmp)
+ if err != nil {
+ return 0, err
+ }
+ count := len(tmp) / sha1.Size
+ *p = make(Pieces, count)
+ for i := 0; i < count; i++ {
+ off := i * sha1.Size
+ copy((*p)[i][:], tmp[off:off+sha1.Size])
+ }
+ return n, nil
}
-func (p *Piece) Check(b []byte) bool {
- if !p.Ok {
- p.Ok = sha1.Sum(b) == p.Sum
- }
- return p.Ok
+type Piece [sha1.Size]byte
+
+func (p Piece) Check(b []byte) bool {
+ return sha1.Sum(b) == p
}
type Percent float64
@@ -28,23 +35,3 @@ type Percent float64
func (p Percent) String() string {
return fmt.Sprintf("%6.2f%%", p)
}
-
-func (p Pieces) Good() Percent {
- var good int
- for _, v := range p {
- if v.Ok {
- good++
- }
- }
- return Percent(good) * 100.0 / Percent(len(p))
-}
-
-func (p Pieces) BitField() bitfield.BitField {
- bf := bitfield.New(len(p))
- for i, v := range p {
- if v.Ok {
- bf.Set(i)
- }
- }
- return bf
-}