From: Jeff Halter Date: Sun, 5 Jun 2022 22:27:48 +0000 (-0700) Subject: Implement file preview X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/d1cd666473e5d9097b34bad3388c8c0595612089?ds=sidebyside;hp=050407a3b7f719ed6ce9367eb803bf948075e50e Implement file preview --- diff --git a/hotline/file_transfer.go b/hotline/file_transfer.go index 65ef0b0..9e86bb8 100644 --- a/hotline/file_transfer.go +++ b/hotline/file_transfer.go @@ -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]} diff --git a/hotline/server.go b/hotline/server.go index aebff6e..5ff8842 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -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) diff --git a/hotline/transaction_handlers.go b/hotline/transaction_handlers.go index 90ca6de..4a86831 100644 --- a/hotline/transaction_handlers.go +++ b/hotline/transaction_handlers.go @@ -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[:]), ))