X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/16a4ad707a05df25c9d12b8cc89fb3a9e3be0dba..95b51279959956123f87f798d93ee7f1521c0caa:/hotline/flattened_file_object.go diff --git a/hotline/flattened_file_object.go b/hotline/flattened_file_object.go index 6f38e46..6b8d3d9 100644 --- a/hotline/flattened_file_object.go +++ b/hotline/flattened_file_object.go @@ -55,15 +55,15 @@ type FlatFileInformationFork struct { Comment []byte // File comment } -func NewFlatFileInformationFork(fileName string, modifyTime []byte) FlatFileInformationFork { +func NewFlatFileInformationFork(fileName string, modifyTime []byte, typeSignature string, creatorSignature string) FlatFileInformationFork { return FlatFileInformationFork{ - Platform: []byte("AMAC"), // TODO: Remove hardcode to support "AWIN" Platform (maybe?) - TypeSignature: []byte(fileTypeFromFilename(fileName).TypeCode), // TODO: Don't infer types from filename - CreatorSignature: []byte(fileTypeFromFilename(fileName).CreatorCode), // 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: []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 ModifyDate: modifyTime, NameScript: make([]byte, 2), // TODO: What is this? Name: []byte(fileName), @@ -72,6 +72,14 @@ func NewFlatFileInformationFork(fileName string, modifyTime []byte) FlatFileInfo } } +func (ffif *FlatFileInformationFork) friendlyType() []byte { + + if name, ok := friendlyCreatorNames[string(ffif.TypeSignature)]; ok { + return []byte(name) + } + return ffif.CreatorSignature +} + // DataSize calculates the size of the flat file information fork, which is // 72 bytes for the fixed length fields plus the length of the Name + Comment func (ffif *FlatFileInformationFork) DataSize() []byte { @@ -110,20 +118,10 @@ type FlatFileDataForkHeader struct { } func (ffif *FlatFileInformationFork) UnmarshalBinary(b []byte) error { - nameSize := b[70:72] bs := binary.BigEndian.Uint16(nameSize) - nameEnd := 72 + bs - commentSize := b[nameEnd : nameEnd+2] - commentLen := binary.BigEndian.Uint16(commentSize) - - commentStartPos := int(nameEnd) + 2 - commentEndPos := int(nameEnd) + 2 + int(commentLen) - - comment := b[commentStartPos:commentEndPos] - ffif.Platform = b[0:4] ffif.TypeSignature = b[4:8] ffif.CreatorSignature = b[8:12] @@ -135,8 +133,16 @@ func (ffif *FlatFileInformationFork) UnmarshalBinary(b []byte) error { ffif.NameScript = b[68:70] ffif.NameSize = b[70:72] ffif.Name = b[72:nameEnd] - ffif.CommentSize = b[nameEnd : nameEnd+2] - ffif.Comment = comment + + if len(b) > int(nameEnd) { + ffif.CommentSize = b[nameEnd : nameEnd+2] + commentLen := binary.BigEndian.Uint16(ffif.CommentSize) + + commentStartPos := int(nameEnd) + 2 + commentEndPos := int(nameEnd) + 2 + int(commentLen) + + ffif.Comment = b[commentStartPos:commentEndPos] + } return nil } @@ -197,9 +203,11 @@ func NewFlattenedFileObject(fileRoot string, filePath, fileName []byte, dataOffs mTime := toHotlineTime(fileInfo.ModTime()) + ft, _ := fileTypeFromInfo(fileInfo) + return &flattenedFileObject{ FlatFileHeader: NewFlatFileHeader(), - FlatFileInformationFork: NewFlatFileInformationFork(string(fileName), mTime), + FlatFileInformationFork: NewFlatFileInformationFork(string(fileName), mTime, ft.TypeCode, ft.CreatorCode), FlatFileDataForkHeader: FlatFileDataForkHeader{ ForkType: [4]byte{0x44, 0x41, 0x54, 0x41}, // "DATA" CompressionType: [4]byte{},