]> Sergey Matveev's repositories - btrtrc.git/blob - storage/piece_resource.go
Remove the InfoEx type, and don't generate its infohash on the fly
[btrtrc.git] / storage / piece_resource.go
1 package storage
2
3 import (
4         "io"
5         "path"
6
7         "github.com/anacrolix/missinggo"
8         "github.com/anacrolix/missinggo/resource"
9
10         "github.com/anacrolix/torrent/metainfo"
11 )
12
13 type piecePerResource struct {
14         p resource.Provider
15 }
16
17 func NewResourcePieces(p resource.Provider) Client {
18         return &piecePerResource{
19                 p: p,
20         }
21 }
22
23 func (s *piecePerResource) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (Torrent, error) {
24         return s, nil
25 }
26
27 func (s *piecePerResource) Close() error {
28         return nil
29 }
30
31 func (s *piecePerResource) Piece(p metainfo.Piece) Piece {
32         completed, err := s.p.NewInstance(path.Join("completed", p.Hash().HexString()))
33         if err != nil {
34                 panic(err)
35         }
36         incomplete, err := s.p.NewInstance(path.Join("incomplete", p.Hash().HexString()))
37         if err != nil {
38                 panic(err)
39         }
40         return piecePerResourcePiece{
41                 p: p,
42                 c: completed,
43                 i: incomplete,
44         }
45 }
46
47 type piecePerResourcePiece struct {
48         p metainfo.Piece
49         c resource.Instance
50         i resource.Instance
51 }
52
53 func (s piecePerResourcePiece) GetIsComplete() bool {
54         fi, err := s.c.Stat()
55         return err == nil && fi.Size() == s.p.Length()
56 }
57
58 func (s piecePerResourcePiece) MarkComplete() error {
59         return resource.Move(s.i, s.c)
60 }
61
62 func (s piecePerResourcePiece) ReadAt(b []byte, off int64) (n int, err error) {
63         missinggo.LimitLen(&b, s.p.Length()-off)
64         n, err = s.c.ReadAt(b, off)
65         if err != nil {
66                 n, err = s.i.ReadAt(b, off)
67         }
68         off += int64(n)
69         if off >= s.p.Length() {
70                 err = io.EOF
71         } else if err == io.EOF {
72                 err = io.ErrUnexpectedEOF
73         }
74         return
75 }
76
77 func (s piecePerResourcePiece) WriteAt(b []byte, off int64) (n int, err error) {
78         missinggo.LimitLen(&b, s.p.Length()-off)
79         return s.i.WriteAt(b, off)
80 }