BytesSent int
clientID uint16
fileResumeData *FileResumeData
+ options []byte
}
func (ft *FileTransfer) String() string {
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]}
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)
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
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[:]),
))