]> git.r.bdr.sh - rbdr/mobius/blame - hotline/file_header.go
Re-add UserList field to client
[rbdr/mobius] / hotline / file_header.go
CommitLineData
6988a057
JH
1package hotline
2
3import (
4 "encoding/binary"
9cf66aea 5 "io"
9c44621e 6 "slices"
6988a057
JH
7)
8
9type FileHeader struct {
9cf66aea
JH
10 Size [2]byte // Total size of FileHeader payload
11 Type [2]byte // 0 for file, 1 for dir
12 FilePath []byte // encoded file path
45ca5d60
JH
13
14 readOffset int // Internal offset to track read progress
6988a057
JH
15}
16
17func NewFileHeader(fileName string, isDir bool) FileHeader {
18 fh := FileHeader{
6988a057
JH
19 FilePath: EncodeFilePath(fileName),
20 }
21 if isDir {
9cf66aea 22 fh.Type = [2]byte{0x00, 0x01}
6988a057
JH
23 }
24
25 encodedPathLen := uint16(len(fh.FilePath) + len(fh.Type))
9cf66aea 26 binary.BigEndian.PutUint16(fh.Size[:], encodedPathLen)
6988a057
JH
27
28 return fh
29}
30
9cf66aea 31func (fh *FileHeader) Read(p []byte) (int, error) {
45ca5d60 32 buf := slices.Concat(
9cf66aea
JH
33 fh.Size[:],
34 fh.Type[:],
6988a057 35 fh.FilePath,
45ca5d60
JH
36 )
37
38 if fh.readOffset >= len(buf) {
39 return 0, io.EOF // All bytes have been read
40 }
41
42 n := copy(p, buf[fh.readOffset:])
43 fh.readOffset += n
44
45 return n, nil
6988a057 46}