]> git.r.bdr.sh - rbdr/mobius/commitdiff
Implement some special case file descriptions
authorJeff Halter <redacted>
Sun, 5 Jun 2022 23:43:51 +0000 (16:43 -0700)
committerJeff Halter <redacted>
Sun, 5 Jun 2022 23:43:51 +0000 (16:43 -0700)
hotline/file_types.go
hotline/files.go
hotline/flattened_file_object.go
hotline/flattened_file_object_test.go
hotline/transaction_handlers.go
hotline/transaction_handlers_test.go
hotline/transfer_test.go

index ae4bd3642b633e9c8ff449c9f2011309bfa4d862..e9f45bb59ce1e5653cf6f48d319fe462029bd2eb 100644 (file)
@@ -1,10 +1,8 @@
 package hotline
 
 type fileType struct {
-       TypeCode       string // 4 byte type code used in file transfers
-       CreatorCode    string // 4 byte creator code used in file transfers
-       CreatorString  string // variable length string used in file get info
-       FileTypeString string // variable length string used in file get info
+       TypeCode    string // 4 byte type code used in file transfers
+       CreatorCode string // 4 byte creator code used in file transfers
 }
 
 var defaultFileType = fileType{
@@ -62,3 +60,12 @@ var fileTypes = map[string]fileType{
                CreatorCode: "HTLC",
        },
 }
+
+// A small number of type codes are displayed in the GetInfo window with a friendly name instead of the 4 letter code
+var friendlyCreatorNames = map[string]string{
+       "fldr": "Folder",
+       "flda": "Folder Alias",
+       "HTft": "Incomplete File",
+       "SIT!": "StuffIt Archive",
+       "TEXT": "Text File",
+}
index 478041ba21066453d8a30a308544f76739f6fb33..7c2cd1a8bf3688ec8e56ead5b632a69cca470280 100644 (file)
@@ -27,6 +27,17 @@ func fileTypeFromFilename(fn string) fileType {
        return defaultFileType
 }
 
+func fileTypeFromInfo(info os.FileInfo) (ft fileType, err error) {
+       if info.IsDir() {
+               ft.CreatorCode = "n/a "
+               ft.TypeCode = "fldr"
+       } else {
+               ft = fileTypeFromFilename(info.Name())
+       }
+
+       return ft, nil
+}
+
 func getFileNameList(filePath string) (fields []Field, err error) {
        files, err := ioutil.ReadDir(filePath)
        if err != nil {
index a43677b2da4a8e59302a5466aafa44e63079190e..6b8d3d9f788a948416eda05d0a8f1fd7c5b6801d 100644 (file)
@@ -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 {
@@ -195,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{},
index 1d438188bb1380f1b4ec7a0e4e6f58b3b8728bc2..656af6808fd866d8ee01735ee5ea3a9d4a55b121 100644 (file)
@@ -30,7 +30,7 @@ func TestNewFlattenedFileObject(t *testing.T) {
                        want: &flattenedFileObject{
                                FlatFileHeader:                NewFlatFileHeader(),
                                FlatFileInformationForkHeader: FlatFileInformationForkHeader{},
-                               FlatFileInformationFork:       NewFlatFileInformationFork("testfile.txt", make([]byte, 8)),
+                               FlatFileInformationFork:       NewFlatFileInformationFork("testfile.txt", make([]byte, 8), "", ""),
                                FlatFileDataForkHeader: FlatFileDataForkHeader{
                                        ForkType:        [4]byte{0x4d, 0x41, 0x43, 0x52}, // DATA
                                        CompressionType: [4]byte{0, 0, 0, 0},
index abe2c54489dd124fb63fd2be0f034d2323300576..5dc2be5b8d51307444f313657456fa40aca4e4a7 100644 (file)
@@ -419,7 +419,7 @@ func HandleGetFileInfo(cc *ClientConn, t *Transaction) (res []Transaction, err e
 
        res = append(res, cc.NewReply(t,
                NewField(fieldFileName, fileName),
-               NewField(fieldFileTypeString, ffo.FlatFileInformationFork.TypeSignature),
+               NewField(fieldFileTypeString, ffo.FlatFileInformationFork.friendlyType()),
                NewField(fieldFileCreatorString, ffo.FlatFileInformationFork.CreatorSignature),
                NewField(fieldFileComment, ffo.FlatFileInformationFork.Comment),
                NewField(fieldFileType, ffo.FlatFileInformationFork.TypeSignature),
index 9165a6629196c6c3ae062c74fb01f27a7089f3ab..6ff8cf158bef72627b8f70bc9ccbe424636e38af 100644 (file)
@@ -649,7 +649,7 @@ func TestHandleGetFileInfo(t *testing.T) {
                                        ErrorCode: []byte{0, 0, 0, 0},
                                        Fields: []Field{
                                                NewField(fieldFileName, []byte("testfile.txt")),
-                                               NewField(fieldFileTypeString, []byte("TEXT")),
+                                               NewField(fieldFileTypeString, []byte("Text File")),
                                                NewField(fieldFileCreatorString, []byte("ttxt")),
                                                NewField(fieldFileComment, []byte{}),
                                                NewField(fieldFileType, []byte("TEXT")),
index 23b30ef3e95bca3d4f17f9a18ef47138cb296687..255d914829cc5ca7e00b26b140f5cb422474896b 100644 (file)
@@ -121,7 +121,7 @@ func Test_receiveFile(t *testing.T) {
                                        testFile := flattenedFileObject{
                                                FlatFileHeader:                NewFlatFileHeader(),
                                                FlatFileInformationForkHeader: FlatFileInformationForkHeader{},
-                                               FlatFileInformationFork:       NewFlatFileInformationFork("testfile.txt", make([]byte, 8)),
+                                               FlatFileInformationFork:       NewFlatFileInformationFork("testfile.txt", make([]byte, 8), "TEXT", "TEXT"),
                                                FlatFileDataForkHeader: FlatFileDataForkHeader{
                                                        ForkType:        [4]byte{0x4d, 0x41, 0x43, 0x52}, // DATA
                                                        CompressionType: [4]byte{0, 0, 0, 0},