]>
Commit | Line | Data |
---|---|---|
1 | package hotline | |
2 | ||
3 | import ( | |
4 | "encoding/binary" | |
5 | "io" | |
6 | "slices" | |
7 | ) | |
8 | ||
9 | type FileHeader struct { | |
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 | |
13 | ||
14 | readOffset int // Internal offset to track read progress | |
15 | } | |
16 | ||
17 | func NewFileHeader(fileName string, isDir bool) FileHeader { | |
18 | fh := FileHeader{ | |
19 | Type: [2]byte{0x00, 0x00}, | |
20 | FilePath: EncodeFilePath(fileName), | |
21 | } | |
22 | if isDir { | |
23 | fh.Type = [2]byte{0x00, 0x01} | |
24 | } | |
25 | ||
26 | encodedPathLen := uint16(len(fh.FilePath) + len(fh.Type)) | |
27 | binary.BigEndian.PutUint16(fh.Size[:], encodedPathLen) | |
28 | ||
29 | return fh | |
30 | } | |
31 | ||
32 | func (fh *FileHeader) Read(p []byte) (int, error) { | |
33 | buf := slices.Concat( | |
34 | fh.Size[:], | |
35 | fh.Type[:], | |
36 | fh.FilePath, | |
37 | ) | |
38 | ||
39 | if fh.readOffset >= len(buf) { | |
40 | return 0, io.EOF // All bytes have been read | |
41 | } | |
42 | ||
43 | n := copy(p, buf[fh.readOffset:]) | |
44 | fh.readOffset += n | |
45 | ||
46 | return n, nil | |
47 | } |