client.go | 12 +++++------- client_test.go | 8 ++++---- data/blob/blob.go | 14 ++++++++++++-- data/data.go | 19 +++++++++++++++++++ fs/torrentfs_test.go | 7 +++++-- torrent.go | 11 ++--------- diff --git a/client.go b/client.go index 8eeb5ad4ef55caeb5b6386cbf7937198e635b8c3..ce8d4e3cf9c98dbadb09f31b4a068cd80088a222 100644 --- a/client.go +++ b/client.go @@ -36,6 +36,7 @@ "strings" "syscall" "time" + "bitbucket.org/anacrolix/go.torrent/data" filePkg "bitbucket.org/anacrolix/go.torrent/data/file" "bitbucket.org/anacrolix/go.torrent/dht" "bitbucket.org/anacrolix/go.torrent/internal/pieceordering" @@ -455,8 +456,8 @@ disableUTP: cfg.DisableUTP, disableTCP: cfg.DisableTCP, _configDir: cfg.ConfigDir, config: *cfg, - torrentDataOpener: func(md *metainfo.Info) (StatelessData, error) { - return filePkg.TorrentData(md, cfg.DataDir), nil + torrentDataOpener: func(md *metainfo.Info) data.Data { + return filePkg.TorrentData(md, cfg.DataDir) }, quit: make(chan struct{}), @@ -1601,7 +1602,7 @@ cl.startTorrent(t) return } -type TorrentDataOpener func(*metainfo.Info) (StatelessData, error) +type TorrentDataOpener func(*metainfo.Info) data.Data func (cl *Client) setMetaData(t *torrent, md metainfo.Info, bytes []byte) (err error) { err = t.setMetadata(md, bytes, &cl.mu) @@ -1619,10 +1620,7 @@ err = errors.New("no porn plx") return } close(t.gotMetainfo) - td, err := cl.torrentDataOpener(&md) - if err != nil { - return - } + td := cl.torrentDataOpener(&md) err = cl.setStorage(t, td) return } diff --git a/client_test.go b/client_test.go index 48eddfec289859fbf3dd2f366752c66d12589865..01d923b82a4fe1c37f39d9e6614bdf3df5ba1264 100644 --- a/client_test.go +++ b/client_test.go @@ -12,7 +12,6 @@ "testing" "time" "bitbucket.org/anacrolix/go.torrent/data/blob" - "github.com/anacrolix/libtorgo/metainfo" "github.com/bradfitz/iter" @@ -254,9 +253,10 @@ if err != nil { t.Fatal(err) } defer os.RemoveAll(leecherDataDir) - cfg.TorrentDataOpener = func(info *metainfo.Info) (StatelessData, error) { - return blob.TorrentData(info, leecherDataDir), nil - } + // cfg.TorrentDataOpener = func(info *metainfo.Info) (data.Data, error) { + // return blob.TorrentData(info, leecherDataDir), nil + // } + cfg.TorrentDataOpener = blob.NewStore(leecherDataDir).OpenTorrent leecher, _ := NewClient(&cfg) defer leecher.Stop() leecherGreeting, _ := leecher.AddTorrent(mi) diff --git a/data/blob/blob.go b/data/blob/blob.go index 2f871d6fe69c2b254943eb85ccabbd9a9180e4ff..5802c18a15e15de2cc5c8b6b0d952658fd62a986 100644 --- a/data/blob/blob.go +++ b/data/blob/blob.go @@ -9,6 +9,8 @@ "io" "os" "path/filepath" + dataPkg "bitbucket.org/anacrolix/go.torrent/data" + "github.com/anacrolix/libtorgo/metainfo" ) @@ -22,8 +24,16 @@ info *metainfo.Info baseDir string } -func TorrentData(info *metainfo.Info, baseDir string) *data { - return &data{info, baseDir} +type store struct { + baseDir string +} + +func (me store) OpenTorrent(info *metainfo.Info) dataPkg.Data { + return &data{info, me.baseDir} +} + +func NewStore(baseDir string) dataPkg.Store { + return store{baseDir} } func (me *data) pieceHashHex(i int) string { diff --git a/data/data.go b/data/data.go new file mode 100644 index 0000000000000000000000000000000000000000..2364eee329df7f9963e1ced995e244f899c20a7c --- /dev/null +++ b/data/data.go @@ -0,0 +1,19 @@ +package data + +import ( + "io" + + "github.com/anacrolix/libtorgo/metainfo" +) + +type Store interface { + OpenTorrent(*metainfo.Info) Data +} + +type Data interface { + // OpenSection(off, n int64) (io.ReadCloser, error) + // ReadAt(p []byte, off int64) (n int, err error) + // Close() + WriteAt(p []byte, off int64) (n int, err error) + WriteSectionTo(w io.Writer, off, n int64) (written int64, err error) +} diff --git a/fs/torrentfs_test.go b/fs/torrentfs_test.go index 4c865ba4e483cc7759fe68ebb6e5f42e49f2c8a1..ab8bc0a0ac66efda9a9562d9404ccfdaf2e5dba3 100644 --- a/fs/torrentfs_test.go +++ b/fs/torrentfs_test.go @@ -14,6 +14,8 @@ "strings" "testing" "time" + "bitbucket.org/anacrolix/go.torrent/data" + "golang.org/x/net/context" "bitbucket.org/anacrolix/go.torrent" @@ -191,8 +193,9 @@ DisableTCP: true, NoDefaultBlocklist: true, - TorrentDataOpener: func(info *metainfo.Info) (torrent.StatelessData, error) { - return mmap.TorrentData(info, filepath.Join(layout.BaseDir, "download")) + TorrentDataOpener: func(info *metainfo.Info) data.Data { + ret, _ := mmap.TorrentData(info, filepath.Join(layout.BaseDir, "download")) + return ret }, // This can be used to check if clients can connect to other clients diff --git a/torrent.go b/torrent.go index cd9f2633ab48059ba784576f53ba23c016b29989..13ca8aa22cebd887835328e70ac9c8196945b8e0 100644 --- a/torrent.go +++ b/torrent.go @@ -12,6 +12,7 @@ "sort" "sync" "time" + "bitbucket.org/anacrolix/go.torrent/data" pp "bitbucket.org/anacrolix/go.torrent/peer_protocol" "bitbucket.org/anacrolix/go.torrent/tracker" "bitbucket.org/anacrolix/go.torrent/util" @@ -43,18 +44,10 @@ IPBytes string Port int } -type StatelessData interface { - // OpenSection(off, n int64) (io.ReadCloser, error) - // ReadAt(p []byte, off int64) (n int, err error) - // Close() - WriteAt(p []byte, off int64) (n int, err error) - WriteSectionTo(w io.Writer, off, n int64) (written int64, err error) -} - // Represents data storage for a Torrent. Additional optional interfaces to // implement are io.Closer, io.ReaderAt, StatefulData, and SectionOpener. type Data interface { - StatelessData + data.Data } // Data maintains per-piece persistent state.