tstor/torrent/node/zip.go
Antonio Navarro Perez 657caea2d3 Add first working torrent implementation
Signed-off-by: Antonio Navarro Perez <antnavper@gmail.com>
2020-04-27 18:46:23 +02:00

82 lines
1.6 KiB
Go

package node
import (
"archive/zip"
"context"
"io"
"log"
"syscall"
"github.com/ajnavarro/distribyted/iio"
"github.com/hanwen/go-fuse/v2/fs"
"github.com/hanwen/go-fuse/v2/fuse"
"github.com/panjf2000/ants/v2"
)
var _ fs.NodeOnAdder = &ZipFolder{}
var _ fs.NodeGetattrer = &ZipFolder{}
type ZipFolder struct {
fs.Inode
readerFunc ReaderFunc
size int64
zr *zip.Reader
pool *ants.Pool
name string
}
func NewZipFolder(pool *ants.Pool, readerFunc ReaderFunc, size int64, name string) *ZipFolder {
return &ZipFolder{
readerFunc: readerFunc,
size: size,
pool: pool,
name: name,
}
}
func (folder *ZipFolder) OnAdd(ctx context.Context) {
err := folder.pool.Submit(func() {
reader, err := folder.readerFunc()
if err != nil {
log.Println("error opening reader for zip file", err, "NAME", folder.name)
}
zr, err := zip.NewReader(reader, folder.size)
if err != nil {
log.Println("error opening zip file:", err, "NAME", folder.name)
return
}
folder.zr = zr
for _, file := range folder.zr.File {
file := file
rf := func() (io.ReaderAt, error) {
zfr, err := file.Open()
if err != nil {
return nil, err
}
return iio.NewUnbufferedReaderAt(zfr), nil
}
LoadNodeByPath(
ctx,
folder.pool,
file.Name,
rf,
&folder.Inode,
file.FileInfo().Size(),
0,
0,
)
}
})
if err != nil {
log.Println("error on pool task", err)
}
}
func (folder *ZipFolder) Getattr(ctx context.Context, f fs.FileHandle, out *fuse.AttrOut) syscall.Errno {
out.Mode = syscall.S_IFDIR & 07777
return fs.OK
}