diff options
Diffstat (limited to 'vendor/github.com/djherbis/buffer/file.go')
-rw-r--r-- | vendor/github.com/djherbis/buffer/file.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/vendor/github.com/djherbis/buffer/file.go b/vendor/github.com/djherbis/buffer/file.go new file mode 100644 index 0000000000..6eb77aabe6 --- /dev/null +++ b/vendor/github.com/djherbis/buffer/file.go @@ -0,0 +1,72 @@ +package buffer + +import ( + "bytes" + "encoding/gob" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/djherbis/buffer/wrapio" +) + +// File is used as the backing resource for a the NewFile BufferAt. +type File interface { + Name() string + Stat() (fi os.FileInfo, err error) + io.ReaderAt + io.WriterAt + Close() error +} + +type fileBuffer struct { + file File + *wrapio.Wrapper +} + +// NewFile returns a new BufferAt backed by "file" with max-size N. +func NewFile(N int64, file File) BufferAt { + return &fileBuffer{ + file: file, + Wrapper: wrapio.NewWrapper(file, 0, 0, N), + } +} + +func init() { + gob.Register(&fileBuffer{}) +} + +func (buf *fileBuffer) MarshalBinary() ([]byte, error) { + fullpath, err := filepath.Abs(filepath.Dir(buf.file.Name())) + if err != nil { + return nil, err + } + base := filepath.Base(buf.file.Name()) + buf.file.Close() + + buffer := bytes.NewBuffer(nil) + fmt.Fprintln(buffer, filepath.Join(fullpath, base)) + fmt.Fprintln(buffer, buf.Wrapper.N, buf.Wrapper.L, buf.Wrapper.O) + return buffer.Bytes(), nil +} + +func (buf *fileBuffer) UnmarshalBinary(data []byte) error { + buffer := bytes.NewBuffer(data) + var filename string + var N, L, O int64 + _, err := fmt.Fscanln(buffer, &filename) + if err != nil { + return err + } + + file, err := os.Open(filename) + if err != nil { + return err + } + buf.file = file + + _, err = fmt.Fscanln(buffer, &N, &L, &O) + buf.Wrapper = wrapio.NewWrapper(file, L, O, N) + return err +} |