]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/transaction_handlers.go
Replace unsafe conn.Read with io.ReadFull
[rbdr/mobius] / hotline / transaction_handlers.go
index 90ca6de50ec409d8cd905cbbc87aff62dd48a930..9e524e823e2d9d4e98e186a96f0d61b4e5ba9af0 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),
@@ -1313,8 +1313,6 @@ func HandleDownloadFile(cc *ClientConn, t *Transaction) (res []Transaction, err
        fileName := t.GetField(fieldFileName).Data
        filePath := t.GetField(fieldFilePath).Data
 
-       // 2 bytes
-       // transferOptions := t.GetField(fieldFileTransferOptions).Data
        resumeData := t.GetField(fieldFileResumeData).Data
 
        var dataOffset int64
@@ -1353,13 +1351,26 @@ func HandleDownloadFile(cc *ClientConn, t *Transaction) (res []Transaction, err
                ft.fileResumeData = &frd
        }
 
+       xferSize := ffo.TransferSize()
+
+       // Optional field for when a HL v1.5+ client requests file preview
+       // Used only for TEXT, JPEG, GIFF, BMP or PICT files
+       // The value will always be 2
+       if t.GetField(fieldFileTransferOptions).Data != nil {
+               ft.options = t.GetField(fieldFileTransferOptions).Data
+               xferSize = ffo.FlatFileDataForkHeader.DataSize[:]
+       }
+
+       cc.Server.mux.Lock()
+       defer cc.Server.mux.Unlock()
        cc.Server.FileTransfers[data] = ft
+
        cc.Transfers[FileDownload] = append(cc.Transfers[FileDownload], ft)
 
        res = append(res, cc.NewReply(t,
                NewField(fieldRefNum, transactionRef),
                NewField(fieldWaitingCount, []byte{0x00, 0x00}), // TODO: Implement waiting count
-               NewField(fieldTransferSize, ffo.TransferSize()),
+               NewField(fieldTransferSize, xferSize),
                NewField(fieldFileSize, ffo.FlatFileDataForkHeader.DataSize[:]),
        ))
 
@@ -1400,7 +1411,9 @@ func HandleDownloadFolder(cc *ClientConn, t *Transaction) (res []Transaction, er
                ReferenceNumber: transactionRef,
                Type:            FolderDownload,
        }
+       cc.Server.mux.Lock()
        cc.Server.FileTransfers[data] = fileTransfer
+       cc.Server.mux.Unlock()
        cc.Transfers[FolderDownload] = append(cc.Transfers[FolderDownload], fileTransfer)
 
        var fp FilePath
@@ -1510,12 +1523,14 @@ func HandleUploadFile(cc *ClientConn, t *Transaction) (res []Transaction, err er
        transactionRef := cc.Server.NewTransactionRef()
        data := binary.BigEndian.Uint32(transactionRef)
 
+       cc.Server.mux.Lock()
        cc.Server.FileTransfers[data] = &FileTransfer{
                FileName:        fileName,
                FilePath:        filePath,
                ReferenceNumber: transactionRef,
                Type:            FileUpload,
        }
+       cc.Server.mux.Unlock()
 
        replyT := cc.NewReply(t, NewField(fieldRefNum, transactionRef))