From: Matt Joiner Date: Tue, 18 Nov 2014 20:36:27 +0000 (-0600) Subject: Expose a wrapped metainfo type with helper methods X-Git-Tag: v1.0.0~1510 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=06e240e1985d0f67c8ff54b46222ca8d7422bead;p=btrtrc.git Expose a wrapped metainfo type with helper methods --- diff --git a/TODO b/TODO index 74c698bf..60275f37 100644 --- a/TODO +++ b/TODO @@ -6,4 +6,5 @@ * Remove non-deterministic stuff from unit tests, like the tracker UDP and fuse fs stuff. * Expose a public Torrent type bound to a given client or similar to work with common per-torrent operations. * Split scraping and announcing on DHT into separate routines. - * Ping nodes that stop being good. \ No newline at end of file + * Ping nodes that stop being good. + * Merge duplicate magnet data. \ No newline at end of file diff --git a/fs/torrentfs.go b/fs/torrentfs.go index 4bdcd781..ed5e5b2c 100644 --- a/fs/torrentfs.go +++ b/fs/torrentfs.go @@ -12,7 +12,6 @@ import ( "bazil.org/fuse" fusefs "bazil.org/fuse/fs" "bitbucket.org/anacrolix/go.torrent" - "github.com/anacrolix/libtorgo/metainfo" ) const ( @@ -52,7 +51,7 @@ type rootNode struct { type node struct { path []string - metadata *metainfo.Info + metadata *torrent.MetaInfo FS *torrentFS InfoHash torrent.InfoHash } @@ -225,10 +224,6 @@ func (dn dirNode) Attr() (attr fuse.Attr) { return } -func isSingleFileTorrent(md *metainfo.Info) bool { - return len(md.Files) == 0 -} - func (me rootNode) Lookup(name string, intr fusefs.Intr) (_node fusefs.Node, err fuse.Error) { for _, t := range me.fs.Client.Torrents() { if t.Name() != name || t.Info == nil { @@ -239,7 +234,7 @@ func (me rootNode) Lookup(name string, intr fusefs.Intr) (_node fusefs.Node, err FS: me.fs, InfoHash: t.InfoHash, } - if isSingleFileTorrent(t.Info) { + if t.Info.SingleFile() { _node = fileNode{__node, uint64(t.Info.Length), 0} } else { _node = dirNode{__node} @@ -253,15 +248,14 @@ func (me rootNode) Lookup(name string, intr fusefs.Intr) (_node fusefs.Node, err } func (me rootNode) ReadDir(intr fusefs.Intr) (dirents []fuse.Dirent, err fuse.Error) { - for _, _torrent := range me.fs.Client.Torrents() { - metaInfo := _torrent.Info - if metaInfo == nil { + for _, t := range me.fs.Client.Torrents() { + if t.Info == nil { continue } dirents = append(dirents, fuse.Dirent{ - Name: metaInfo.Name, + Name: t.Info.Name, Type: func() fuse.DirentType { - if isSingleFileTorrent(metaInfo) { + if t.Info.SingleFile() { return fuse.DT_File } else { return fuse.DT_Dir diff --git a/metainfo.go b/metainfo.go new file mode 100644 index 00000000..73429d50 --- /dev/null +++ b/metainfo.go @@ -0,0 +1,17 @@ +package torrent + +import "github.com/anacrolix/libtorgo/metainfo" + +type MetaInfo struct { + *metainfo.Info +} + +func newMetaInfo(info *metainfo.Info) *MetaInfo { + return &MetaInfo{ + Info: info, + } +} + +func (me *MetaInfo) SingleFile() bool { + return len(me.Info.Files) == 0 +} diff --git a/torrent.go b/torrent.go index 3e42eec0..08733826 100644 --- a/torrent.go +++ b/torrent.go @@ -58,7 +58,7 @@ type torrent struct { dataLock sync.RWMutex Data mmap_span.MMapSpan - Info *metainfo.Info + Info *MetaInfo // Active peer connections. Conns []*connection // Set of addrs to which we're attempting to connect. @@ -195,7 +195,7 @@ func infoPieceHashes(info *metainfo.Info) (ret []string) { // Called when metadata for a torrent becomes available. func (t *torrent) setMetadata(md metainfo.Info, dataDir string, infoBytes []byte) (err error) { - t.Info = &md + t.Info = newMetaInfo(&md) t.MetaData = infoBytes t.metadataHave = nil t.Data, err = mmapTorrentData(&md, dataDir)