forked from Shiloh/githaven
73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
|
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
|
||
|
}
|