}
type FlatFileInformationFork struct {
- Platform []byte // Operating System used. ("AMAC" or "MWIN")
- TypeSignature []byte // File type signature
- CreatorSignature []byte // File creator signature
- Flags []byte
- PlatformFlags []byte
- RSVD []byte
- CreateDate []byte
- ModifyDate []byte
- NameScript []byte
- NameSize []byte // Length of file name (Maximum 128 characters)
- Name []byte // File name
- CommentSize []byte // Length of the comment
- Comment []byte // File comment
+ Platform [4]byte // Operating System used. ("AMAC" or "MWIN")
+ TypeSignature [4]byte // File type signature
+ CreatorSignature [4]byte // File creator signature
+ Flags [4]byte
+ PlatformFlags [4]byte
+ RSVD [32]byte
+ CreateDate [8]byte
+ ModifyDate [8]byte
+ NameScript [2]byte
+ NameSize [2]byte // Length of file name (Maximum 128 characters)
+ Name []byte // File name
+ CommentSize [2]byte // Length of the comment
+ Comment []byte // File comment
readOffset int // Internal offset to track read progress
}
-func NewFlatFileInformationFork(fileName string, modifyTime []byte, typeSignature string, creatorSignature string) FlatFileInformationFork {
+func NewFlatFileInformationFork(fileName string, modifyTime [8]byte, typeSignature string, creatorSignature string) FlatFileInformationFork {
return FlatFileInformationFork{
- Platform: []byte("AMAC"), // TODO: Remove hardcode to support "AWIN" Platform (maybe?)
- TypeSignature: []byte(typeSignature), // TODO: Don't infer types from filename
- CreatorSignature: []byte(creatorSignature), // TODO: Don't infer types from filename
- Flags: []byte{0, 0, 0, 0}, // TODO: What is this?
- PlatformFlags: []byte{0, 0, 1, 0}, // TODO: What is this?
- RSVD: make([]byte, 32), // Unimplemented in Hotline Protocol
- CreateDate: modifyTime, // some filesystems don't support createTime
+ Platform: [4]byte{0x41, 0x4D, 0x41, 0x43}, // "AMAC" TODO: Remove hardcode to support "AWIN" Platform (maybe?)
+ TypeSignature: [4]byte([]byte(typeSignature)), // TODO: Don't infer types from filename
+ CreatorSignature: [4]byte([]byte(creatorSignature)), // TODO: Don't infer types from filename
+ PlatformFlags: [4]byte{0, 0, 1, 0}, // TODO: What is this?
+ CreateDate: modifyTime, // some filesystems don't support createTime
ModifyDate: modifyTime,
- NameScript: make([]byte, 2), // TODO: What is this?
Name: []byte(fileName),
- CommentSize: []byte{0, 0},
Comment: []byte{}, // TODO: implement (maybe?)
}
}
func (ffif *FlatFileInformationFork) friendlyType() []byte {
- if name, ok := friendlyCreatorNames[string(ffif.TypeSignature)]; ok {
+ if name, ok := friendlyCreatorNames[string(ffif.TypeSignature[:])]; ok {
return []byte(name)
}
- return ffif.TypeSignature
+ return ffif.TypeSignature[:]
}
func (ffif *FlatFileInformationFork) friendlyCreator() []byte {
- if name, ok := friendlyCreatorNames[string(ffif.CreatorSignature)]; ok {
+ if name, ok := friendlyCreatorNames[string(ffif.CreatorSignature[:])]; ok {
return []byte(name)
}
- return ffif.CreatorSignature
+ return ffif.CreatorSignature[:]
}
func (ffif *FlatFileInformationFork) setComment(comment []byte) error {
- ffif.CommentSize = make([]byte, 2)
+ commentSize := make([]byte, 2)
ffif.Comment = comment
- binary.BigEndian.PutUint16(ffif.CommentSize, uint16(len(comment)))
-
+ binary.BigEndian.PutUint16(commentSize, uint16(len(comment)))
+ ffif.CommentSize = [2]byte(commentSize)
// TODO: return err if comment is too long
return nil
}
func (ffif *FlatFileInformationFork) Read(p []byte) (int, error) {
buf := slices.Concat(
- ffif.Platform,
- ffif.TypeSignature,
- ffif.CreatorSignature,
- ffif.Flags,
- ffif.PlatformFlags,
- ffif.RSVD,
- ffif.CreateDate,
- ffif.ModifyDate,
- ffif.NameScript,
+ ffif.Platform[:],
+ ffif.TypeSignature[:],
+ ffif.CreatorSignature[:],
+ ffif.Flags[:],
+ ffif.PlatformFlags[:],
+ ffif.RSVD[:],
+ ffif.CreateDate[:],
+ ffif.ModifyDate[:],
+ ffif.NameScript[:],
ffif.ReadNameSize(),
ffif.Name,
- ffif.CommentSize,
+ ffif.CommentSize[:],
ffif.Comment,
)
bs := binary.BigEndian.Uint16(nameSize)
total := 72 + bs
- ffif.Platform = p[0:4]
- ffif.TypeSignature = p[4:8]
- ffif.CreatorSignature = p[8:12]
- ffif.Flags = p[12:16]
- ffif.PlatformFlags = p[16:20]
- ffif.RSVD = p[20:52]
- ffif.CreateDate = p[52:60]
- ffif.ModifyDate = p[60:68]
- ffif.NameScript = p[68:70]
- ffif.NameSize = p[70:72]
+ ffif.Platform = [4]byte(p[0:4])
+ ffif.TypeSignature = [4]byte(p[4:8])
+ ffif.CreatorSignature = [4]byte(p[8:12])
+ ffif.Flags = [4]byte(p[12:16])
+ ffif.PlatformFlags = [4]byte(p[16:20])
+ ffif.RSVD = [32]byte(p[20:52])
+ ffif.CreateDate = [8]byte(p[52:60])
+ ffif.ModifyDate = [8]byte(p[60:68])
+ ffif.NameScript = [2]byte(p[68:70])
+ ffif.NameSize = [2]byte(p[70:72])
ffif.Name = p[72:total]
if len(p) > int(total) {
- ffif.CommentSize = p[total : total+2]
- commentLen := binary.BigEndian.Uint16(ffif.CommentSize)
+ ffif.CommentSize = [2]byte(p[total : total+2])
+ commentLen := binary.BigEndian.Uint16(ffif.CommentSize[:])
commentStartPos := int(total) + 2
commentEndPos := int(total) + 2 + int(commentLen)
ffif.Comment = p[commentStartPos:commentEndPos]
- total = uint16(commentEndPos)
+ //total = uint16(commentEndPos)
}
return len(p), nil
bs := binary.BigEndian.Uint16(nameSize)
nameEnd := 72 + bs
- ffif.Platform = b[0:4]
- ffif.TypeSignature = b[4:8]
- ffif.CreatorSignature = b[8:12]
- ffif.Flags = b[12:16]
- ffif.PlatformFlags = b[16:20]
- ffif.RSVD = b[20:52]
- ffif.CreateDate = b[52:60]
- ffif.ModifyDate = b[60:68]
- ffif.NameScript = b[68:70]
- ffif.NameSize = b[70:72]
+ ffif.Platform = [4]byte(b[0:4])
+ ffif.TypeSignature = [4]byte(b[4:8])
+ ffif.CreatorSignature = [4]byte(b[8:12])
+ ffif.Flags = [4]byte(b[12:16])
+ ffif.PlatformFlags = [4]byte(b[16:20])
+ ffif.RSVD = [32]byte(b[20:52])
+ ffif.CreateDate = [8]byte(b[52:60])
+ ffif.ModifyDate = [8]byte(b[60:68])
+ ffif.NameScript = [2]byte(b[68:70])
+ ffif.NameSize = [2]byte(b[70:72])
ffif.Name = b[72:nameEnd]
if len(b) > int(nameEnd) {
- ffif.CommentSize = b[nameEnd : nameEnd+2]
- commentLen := binary.BigEndian.Uint16(ffif.CommentSize)
+ ffif.CommentSize = [2]byte(b[nameEnd : nameEnd+2])
+ commentLen := binary.BigEndian.Uint16(ffif.CommentSize[:])
commentStartPos := int(nameEnd) + 2
commentEndPos := int(nameEnd) + 2 + int(commentLen)
[]byte{0, 0, 0, 0},
make([]byte, 4),
ffo.FlatFileInformationFork.DataSize(),
- ffo.FlatFileInformationFork.Platform,
- ffo.FlatFileInformationFork.TypeSignature,
- ffo.FlatFileInformationFork.CreatorSignature,
- ffo.FlatFileInformationFork.Flags,
- ffo.FlatFileInformationFork.PlatformFlags,
- ffo.FlatFileInformationFork.RSVD,
- ffo.FlatFileInformationFork.CreateDate,
- ffo.FlatFileInformationFork.ModifyDate,
- ffo.FlatFileInformationFork.NameScript,
+ ffo.FlatFileInformationFork.Platform[:],
+ ffo.FlatFileInformationFork.TypeSignature[:],
+ ffo.FlatFileInformationFork.CreatorSignature[:],
+ ffo.FlatFileInformationFork.Flags[:],
+ ffo.FlatFileInformationFork.PlatformFlags[:],
+ ffo.FlatFileInformationFork.RSVD[:],
+ ffo.FlatFileInformationFork.CreateDate[:],
+ ffo.FlatFileInformationFork.ModifyDate[:],
+ ffo.FlatFileInformationFork.NameScript[:],
ffo.FlatFileInformationFork.ReadNameSize(),
ffo.FlatFileInformationFork.Name,
- ffo.FlatFileInformationFork.CommentSize,
+ ffo.FlatFileInformationFork.CommentSize[:],
ffo.FlatFileInformationFork.Comment,
ffo.FlatFileDataForkHeader.ForkType[:],
ffo.FlatFileDataForkHeader.CompressionType[:],