mirror of
https://github.com/kopia/kopia.git
synced 2026-03-18 22:26:26 -04:00
71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package repo
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
type objectSectionReader struct {
|
|
baseReader ObjectReader
|
|
start, length int64
|
|
currentPosition int64
|
|
}
|
|
|
|
func (osr *objectSectionReader) Close() error {
|
|
return osr.baseReader.Close()
|
|
}
|
|
|
|
func (osr *objectSectionReader) Length() int64 {
|
|
return osr.length
|
|
}
|
|
|
|
func (osr *objectSectionReader) Read(p []byte) (n int, err error) {
|
|
if osr.currentPosition >= osr.length {
|
|
return 0, io.EOF
|
|
}
|
|
if max := osr.length - osr.currentPosition; int64(len(p)) > max {
|
|
p = p[0:max]
|
|
}
|
|
n, err = osr.baseReader.Read(p)
|
|
osr.currentPosition += int64(n)
|
|
return
|
|
}
|
|
|
|
func (osr *objectSectionReader) Seek(offset int64, whence int) (int64, error) {
|
|
if whence == 1 {
|
|
return osr.Seek(osr.currentPosition+offset, 0)
|
|
}
|
|
|
|
if whence == 2 {
|
|
return osr.Seek(osr.length+offset, 0)
|
|
}
|
|
|
|
if offset < 0 {
|
|
return -1, fmt.Errorf("Invalid seek.")
|
|
}
|
|
|
|
if offset > osr.length {
|
|
offset = osr.length
|
|
}
|
|
|
|
osr.currentPosition = offset
|
|
|
|
_, err := osr.baseReader.Seek(osr.start+osr.currentPosition, 0)
|
|
return osr.currentPosition, err
|
|
}
|
|
|
|
func newObjectSectionReader(start, length int64, baseReader ObjectReader) (ObjectReader, error) {
|
|
r := &objectSectionReader{
|
|
baseReader: baseReader,
|
|
start: start,
|
|
length: length,
|
|
}
|
|
|
|
if _, err := r.Seek(0, 0); err != nil {
|
|
r.Close()
|
|
return nil, err
|
|
}
|
|
|
|
return r, nil
|
|
}
|