]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/transaction_handlers.go
Fix some data races
[rbdr/mobius] / hotline / transaction_handlers.go
index 90ca6de50ec409d8cd905cbbc87aff62dd48a930..abe2c54489dd124fb63fd2be0f034d2323300576 100644 (file)
@@ -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[:]),
        ))
 
@@ -1510,12 +1521,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))