]> Sergey Matveev's repositories - btrtrc.git/blob - storage/interface.go
Do torrent storage flush on piece completion (#755)
[btrtrc.git] / storage / interface.go
1 package storage
2
3 import (
4         "io"
5
6         "github.com/anacrolix/torrent/metainfo"
7 )
8
9 type ClientImplCloser interface {
10         ClientImpl
11         Close() error
12 }
13
14 // Represents data storage for an unspecified torrent.
15 type ClientImpl interface {
16         OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error)
17 }
18
19 type TorrentCapacity *func() (cap int64, capped bool)
20
21 // Data storage bound to a torrent.
22 type TorrentImpl struct {
23         Piece func(p metainfo.Piece) PieceImpl
24         Close func() error
25         Flush func() error
26         // Storages that share the same space, will provide equal pointers. The function is called once
27         // to determine the storage for torrents sharing the same function pointer, and mutated in
28         // place.
29         Capacity TorrentCapacity
30 }
31
32 // Interacts with torrent piece data. Optional interfaces to implement include:
33 //   io.WriterTo, such as when a piece supports a more efficient way to write out incomplete chunks.
34 //   SelfHashing, such as when a piece supports a more efficient way to hash its contents.
35 type PieceImpl interface {
36         // These interfaces are not as strict as normally required. They can
37         // assume that the parameters are appropriate for the dimensions of the
38         // piece.
39         io.ReaderAt
40         io.WriterAt
41         // Called when the client believes the piece data will pass a hash check.
42         // The storage can move or mark the piece data as read-only as it sees
43         // fit.
44         MarkComplete() error
45         MarkNotComplete() error
46         // Returns true if the piece is complete.
47         Completion() Completion
48 }
49
50 type Completion struct {
51         Complete bool
52         Ok       bool
53 }
54
55 // Allows a storage backend to override hashing (i.e. if it can do it more efficiently than the torrent client can)
56 type SelfHashing interface {
57         SelfHash() (metainfo.Hash, error)
58 }