X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/22c599abc18895f73e96095f35b71cf3357d41b4..d4207f0da06f9578a5d89f47f126ce5343c162bd:/hotline/file_header.go diff --git a/hotline/file_header.go b/hotline/file_header.go index 60c652e..b18229a 100644 --- a/hotline/file_header.go +++ b/hotline/file_header.go @@ -2,35 +2,45 @@ package hotline import ( "encoding/binary" - "github.com/jhalter/mobius/concat" + "io" + "slices" ) type FileHeader struct { - Size []byte // Total size of FileHeader payload - Type []byte // 0 for file, 1 for dir - FilePath []byte // encoded file path + Size [2]byte // Total size of FileHeader payload + Type [2]byte // 0 for file, 1 for dir + FilePath []byte // encoded file path + + readOffset int // Internal offset to track read progress } func NewFileHeader(fileName string, isDir bool) FileHeader { fh := FileHeader{ - Size: make([]byte, 2), - Type: []byte{0x00, 0x00}, FilePath: EncodeFilePath(fileName), } if isDir { - fh.Type = []byte{0x00, 0x01} + fh.Type = [2]byte{0x00, 0x01} } encodedPathLen := uint16(len(fh.FilePath) + len(fh.Type)) - binary.BigEndian.PutUint16(fh.Size, encodedPathLen) + binary.BigEndian.PutUint16(fh.Size[:], encodedPathLen) return fh } -func (fh *FileHeader) Payload() []byte { - return concat.Slices( - fh.Size, - fh.Type, +func (fh *FileHeader) Read(p []byte) (int, error) { + buf := slices.Concat( + fh.Size[:], + fh.Type[:], fh.FilePath, ) + + if fh.readOffset >= len(buf) { + return 0, io.EOF // All bytes have been read + } + + n := copy(p, buf[fh.readOffset:]) + fh.readOffset += n + + return n, nil }