]> git.r.bdr.sh - rbdr/mobius/commitdiff
Implement file preview
authorJeff Halter <redacted>
Sun, 5 Jun 2022 22:27:48 +0000 (15:27 -0700)
committerJeff Halter <redacted>
Sun, 5 Jun 2022 22:27:48 +0000 (15:27 -0700)
hotline/file_transfer.go
hotline/server.go
hotline/transaction_handlers.go

index 65ef0b09e38ece13bc095e4eaade3a2ff9f0ddfd..9e86bb8724558164f948bc5a916f6c781cc4fb9c 100644 (file)
@@ -24,6 +24,7 @@ type FileTransfer struct {
        BytesSent       int
        clientID        uint16
        fileResumeData  *FileResumeData
+       options         []byte
 }
 
 func (ft *FileTransfer) String() string {
@@ -61,7 +62,6 @@ func readFolderUpload(buf []byte) folderUpload {
        return fu
 }
 
-
 func (fu *folderUpload) UnmarshalBinary(b []byte) error {
        fu.DataSize = [2]byte{b[0], b[1]}
        fu.IsFolder = [2]byte{b[2], b[3]}
index aebff6ed8af71e73b4534b631fb127ea0d27eb00..5ff88420a331372ca33b3a092739ee0436411b28 100644 (file)
@@ -688,9 +688,11 @@ func (s *Server) handleFileTransfer(conn io.ReadWriteCloser) error {
 
                s.Logger.Infow("File download started", "filePath", fullFilePath, "transactionRef", fileTransfer.ReferenceNumber)
 
-               // Start by sending flat file object to client
-               if _, err := conn.Write(ffo.BinaryMarshal()); err != nil {
-                       return err
+               if fileTransfer.options == nil {
+                       // Start by sending flat file object to client
+                       if _, err := conn.Write(ffo.BinaryMarshal()); err != nil {
+                               return err
+                       }
                }
 
                file, err := FS.Open(fullFilePath)
index 90ca6de50ec409d8cd905cbbc87aff62dd48a930..4a8683101d1ca45e490c61d342838d0b59336a08 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[:]),
        ))