]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/btrtrc/pc.go
cmd/btrtrc client
[btrtrc.git] / cmd / btrtrc / pc.go
1 package main
2
3 import (
4         "os"
5         "sync"
6
7         "github.com/anacrolix/torrent/metainfo"
8         "github.com/anacrolix/torrent/storage"
9 )
10
11 type BFPieceCompletion struct {
12         sync.Mutex
13 }
14
15 func NewBFPieceCompletion() *BFPieceCompletion {
16         return &BFPieceCompletion{}
17 }
18
19 func (self *BFPieceCompletion) Get(pk metainfo.PieceKey) (c storage.Completion, rerr error) {
20         self.Lock()
21         defer self.Unlock()
22         fd, err := os.OpenFile(pk.InfoHash.HexString()+".bf", os.O_RDWR|os.O_CREATE, 0666)
23         if err != nil {
24                 rerr = err
25                 return
26         }
27         defer fd.Close()
28         b := []byte{0}
29         _, err = fd.ReadAt(b, int64(pk.Index))
30         if err != nil {
31                 return
32         }
33         c.Ok = true
34         switch string(b) {
35         case "0":
36                 c.Complete = false
37         case "1":
38                 c.Complete = true
39         default:
40                 c.Ok = false
41         }
42         return
43 }
44
45 func (self *BFPieceCompletion) Set(pk metainfo.PieceKey, complete bool) error {
46         if c, err := self.Get(pk); err == nil && c.Ok && c.Complete == complete {
47                 return nil
48         }
49         self.Lock()
50         defer self.Unlock()
51         fd, err := os.OpenFile(pk.InfoHash.HexString()+".bf", os.O_RDWR|os.O_CREATE, 0666)
52         if err != nil {
53                 return err
54         }
55         defer fd.Close()
56         b := []byte{'1'}
57         if !complete {
58                 b[0] = '0'
59         }
60         if _, err = fd.WriteAt(b, int64(pk.Index)); err != nil {
61                 return err
62         }
63         return nil
64 }
65
66 func (self *BFPieceCompletion) Close() error {
67         return nil
68 }