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