]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/flattened_file_object.go
Implement file preview
[rbdr/mobius] / hotline / flattened_file_object.go
index ba6b0633160c9ec8728d81fcff5142e8a1c75b56..a43677b2da4a8e59302a5466aafa44e63079190e 100644 (file)
@@ -110,20 +110,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 +125,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
 }
@@ -175,15 +173,16 @@ func (f *flattenedFileObject) BinaryMarshal() []byte {
        return out
 }
 
-func NewFlattenedFileObject(fileRoot string, filePath, fileName []byte) (*flattenedFileObject, error) {
+func NewFlattenedFileObject(fileRoot string, filePath, fileName []byte, dataOffset int64) (*flattenedFileObject, error) {
        fullFilePath, err := readPath(fileRoot, filePath, fileName)
        if err != nil {
                return nil, err
        }
-       file, err := os.Open(fullFilePath)
+       file, err := effectiveFile(fullFilePath)
        if err != nil {
                return nil, err
        }
+
        defer func(file *os.File) { _ = file.Close() }(file)
 
        fileInfo, err := file.Stat()
@@ -192,7 +191,7 @@ func NewFlattenedFileObject(fileRoot string, filePath, fileName []byte) (*flatte
        }
 
        dataSize := make([]byte, 4)
-       binary.BigEndian.PutUint32(dataSize, uint32(fileInfo.Size()))
+       binary.BigEndian.PutUint32(dataSize, uint32(fileInfo.Size()-dataOffset))
 
        mTime := toHotlineTime(fileInfo.ModTime())