X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/9c44621ee1ca9abfca79c593e80193afd9204c83..80aed6b19ff0b0927670e459ce5cc7a16ef047ec:/hotline/file_header.go diff --git a/hotline/file_header.go b/hotline/file_header.go index 61b8e28..b18229a 100644 --- a/hotline/file_header.go +++ b/hotline/file_header.go @@ -2,35 +2,45 @@ package hotline import ( "encoding/binary" + "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 slices.Concat( - 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 }