From aefc220c027c98c0877cbb6dc7140e72f119262b Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Fri, 25 May 2018 20:01:11 +0100 Subject: [PATCH 15/43] file_xfer: Use destructor for FileXferTask Limit too much manual work. By default delete the file, unless success() is called. Signed-off-by: Frediano Ziglio Acked-by: Christophe Fergeau --- vdagent/file_xfer.cpp | 24 +++++++++++++++--------- vdagent/file_xfer.h | 4 +++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp index 8203b99..ff4c0b9 100644 --- a/vdagent/file_xfer.cpp +++ b/vdagent/file_xfer.cpp @@ -46,7 +46,6 @@ void FileXfer::reset() for (iter = _tasks.begin(); iter != _tasks.end(); iter++) { task = iter->second; - task->cancel(); delete task; } _tasks.clear(); @@ -181,14 +180,11 @@ bool FileXfer::handle_data(VDAgentFileXferDataMessage* data, return false; } vd_printf("%u completed", iter->first); + task->success(); status->result = VD_AGENT_FILE_XFER_STATUS_SUCCESS; fin: if (task) { - CloseHandle(task->handle); - if (status->result != VD_AGENT_FILE_XFER_STATUS_SUCCESS) { - DeleteFile(task->name); - } _tasks.erase(iter); delete task; } @@ -196,10 +192,21 @@ fin: return true; } -void FileXferTask::cancel() +FileXferTask::~FileXferTask() { - CloseHandle(handle); - DeleteFile(name); + if (handle != INVALID_HANDLE_VALUE) { + CloseHandle(handle); + DeleteFile(name); + } +} + +void FileXferTask::success() +{ + // close the handle so the destructor won't delete the file + if (handle != INVALID_HANDLE_VALUE) { + CloseHandle(handle); + handle = INVALID_HANDLE_VALUE; + } } void FileXfer::handle_status(VDAgentFileXferStatusMessage* status) @@ -218,7 +225,6 @@ void FileXfer::handle_status(VDAgentFileXferStatusMessage* status) return; } task = iter->second; - task->cancel(); _tasks.erase(iter); delete task; } diff --git a/vdagent/file_xfer.h b/vdagent/file_xfer.h index 747c29c..41f677a 100644 --- a/vdagent/file_xfer.h +++ b/vdagent/file_xfer.h @@ -30,12 +30,14 @@ struct FileXferTask { lstrcpyn(name, _name, ARRAYSIZE(name)); name[ARRAYSIZE(name)-1] = 0; } + ~FileXferTask(); + HANDLE handle; uint64_t size; uint64_t pos; TCHAR name[MAX_PATH]; - void cancel(); + void success(); }; typedef std::map FileXferTasks; -- 2.17.1