diff options
author | Frediano Ziglio <fziglio@redhat.com> | 2020-03-18 20:28:00 +0000 |
---|---|---|
committer | Frediano Ziglio <freddy77@gmail.com> | 2020-04-24 10:33:34 +0100 |
commit | a914784295b2ffed8ce002fab37fd158fdfba28d (patch) | |
tree | e2358b63f6b431439e04616393bdf7e46aca18e8 | |
parent | 3cad1e7570255a90aa07a1fea14fd0d112aec4c2 (diff) |
vdagent: Allow to return detailed message for file transfer
Reuse AgentFileXferStatusMessageFull and agent_prepare_filexfer_status
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
-rw-r--r-- | vdagent/file_xfer.cpp | 22 | ||||
-rw-r--r-- | vdagent/file_xfer.h | 7 | ||||
-rw-r--r-- | vdagent/vdagent.cpp | 27 |
3 files changed, 33 insertions, 23 deletions
diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp index 016bd4e..0322e03 100644 --- a/vdagent/file_xfer.cpp +++ b/vdagent/file_xfer.cpp @@ -77,7 +77,7 @@ static bool get_download_directory(TCHAR file_path[MAX_PATH]) } void FileXfer::handle_start(VDAgentFileXferStartMessage* start, - VDAgentFileXferStatusMessage* status) + AgentFileXferStatusMessageFull& status, size_t& status_size) { char* file_meta = (char*)start->data; TCHAR file_path[MAX_PATH]; @@ -88,8 +88,8 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, AsUser as_user; size_t wlen; - status->id = start->id; - status->result = VD_AGENT_FILE_XFER_STATUS_ERROR; + status.common.id = start->id; + status.common.result = VD_AGENT_FILE_XFER_STATUS_ERROR; if (!g_key_get_string(file_meta, "vdagent-file-xfer", "name", file_name, sizeof(file_name)) || !g_key_get_uint64(file_meta, "vdagent-file-xfer", "size", &file_size)) { vd_printf("file id %u meta parsing failed", start->id); @@ -165,17 +165,17 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, } auto task = std::make_shared<FileXferTask>(handle, file_size, file_path); _tasks[start->id] = task; - status->result = VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA; + status.common.result = VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA; } bool FileXfer::handle_data(VDAgentFileXferDataMessage* data, - VDAgentFileXferStatusMessage* status) + AgentFileXferStatusMessageFull& status, size_t& status_size) { FileXferTasks::iterator iter; DWORD written; - status->id = data->id; - status->result = VD_AGENT_FILE_XFER_STATUS_ERROR; + status.common.id = data->id; + status.common.result = VD_AGENT_FILE_XFER_STATUS_ERROR; iter = _tasks.find(data->id); if (iter == _tasks.end()) { vd_printf("file id %u not found", data->id); @@ -197,7 +197,7 @@ bool FileXfer::handle_data(VDAgentFileXferDataMessage* data, } vd_printf("%u completed", iter->first); task->success(); - status->result = VD_AGENT_FILE_XFER_STATUS_SUCCESS; + status.common.result = VD_AGENT_FILE_XFER_STATUS_SUCCESS; fin: _tasks.erase(iter); @@ -252,17 +252,17 @@ void FileXfer::handle_status(VDAgentFileXferStatusMessage* status) _tasks.erase(iter); } -bool FileXfer::dispatch(VDAgentMessage* msg, VDAgentFileXferStatusMessage* status) +bool FileXfer::dispatch(VDAgentMessage* msg, AgentFileXferStatusMessageFull& status, size_t& status_size) { bool ret = false; switch (msg->type) { case VD_AGENT_FILE_XFER_START: - handle_start((VDAgentFileXferStartMessage*)msg->data, status); + handle_start((VDAgentFileXferStartMessage*)msg->data, status, status_size); ret = true; break; case VD_AGENT_FILE_XFER_DATA: - ret = handle_data((VDAgentFileXferDataMessage*)msg->data, status); + ret = handle_data((VDAgentFileXferDataMessage*)msg->data, status, status_size); break; case VD_AGENT_FILE_XFER_STATUS: handle_status((VDAgentFileXferStatusMessage*)msg->data); diff --git a/vdagent/file_xfer.h b/vdagent/file_xfer.h index b138019..3723b38 100644 --- a/vdagent/file_xfer.h +++ b/vdagent/file_xfer.h @@ -20,6 +20,7 @@ #include <map> #include <memory> +#include <common/agent.h> #include "vdcommon.h" struct FileXferTask { @@ -46,12 +47,12 @@ typedef std::map<uint32_t, std::shared_ptr<FileXferTask> > FileXferTasks; class FileXfer { public: ~FileXfer(); - bool dispatch(VDAgentMessage* msg, VDAgentFileXferStatusMessage* status); + bool dispatch(VDAgentMessage* msg, AgentFileXferStatusMessageFull& status, size_t& status_size); void reset(); private: - void handle_start(VDAgentFileXferStartMessage* start, VDAgentFileXferStatusMessage* status); - bool handle_data(VDAgentFileXferDataMessage* data, VDAgentFileXferStatusMessage* status); + void handle_start(VDAgentFileXferStartMessage* start, AgentFileXferStatusMessageFull& status, size_t& status_size); + bool handle_data(VDAgentFileXferDataMessage* data, AgentFileXferStatusMessageFull& status, size_t& status_size); void handle_status(VDAgentFileXferStatusMessage* status); bool g_key_get_string(char* data, const char* group, const char* key, char* value, unsigned vsize); diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp index df794b8..36fc167 100644 --- a/vdagent/vdagent.cpp +++ b/vdagent/vdagent.cpp @@ -846,6 +846,7 @@ bool VDAgent::send_announce_capabilities(bool request) VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_SPARSE_MONITORS_CONFIG); VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_GUEST_LINEEND_CRLF); VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MAX_CLIPBOARD); + VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_FILE_XFER_DETAILED_ERRORS); vd_printf("Sending capabilities:"); for (uint32_t i = 0 ; i < caps_size; ++i) { vd_printf("%X", caps->caps[i]); @@ -1339,22 +1340,30 @@ void VDAgent::dispatch_message(VDAgentMessage* msg, uint32_t port) res = handle_announce_capabilities((VDAgentAnnounceCapabilities*)msg->data, msg->size); break; case VD_AGENT_FILE_XFER_START: { - VDAgentFileXferStatusMessage status; + AgentFileXferStatusMessageFull status; + size_t status_size = sizeof(status.common); if (_session_is_locked) { VDAgentFileXferStartMessage *s = (VDAgentFileXferStartMessage *)msg->data; - status.id = s->id; - status.result = VD_AGENT_FILE_XFER_STATUS_ERROR; - vd_printf("Fail to start file-xfer %u due: Locked session", status.id); - write_message(VD_AGENT_FILE_XFER_STATUS, sizeof(status), &status); - } else if (_file_xfer.dispatch(msg, &status)) { - write_message(VD_AGENT_FILE_XFER_STATUS, sizeof(status), &status); + status.common.id = s->id; + status.common.result = VD_AGENT_FILE_XFER_STATUS_ERROR; + vd_printf("Fail to start file-xfer %u due: Locked session", status.common.id); + agent_prepare_filexfer_status(&status, &status_size, + _client_caps.data(), _client_caps.size()); + write_message(VD_AGENT_FILE_XFER_STATUS, status_size, &status); + } else if (_file_xfer.dispatch(msg, status, status_size)) { + agent_prepare_filexfer_status(&status, &status_size, + _client_caps.data(), _client_caps.size()); + write_message(VD_AGENT_FILE_XFER_STATUS, status_size, &status); } break; } case VD_AGENT_FILE_XFER_STATUS: case VD_AGENT_FILE_XFER_DATA: { - VDAgentFileXferStatusMessage status; - if (_file_xfer.dispatch(msg, &status)) { + AgentFileXferStatusMessageFull status; + size_t status_size = sizeof(status.common); + if (_file_xfer.dispatch(msg, status, status_size)) { + agent_prepare_filexfer_status(&status, &status_size, + _client_caps.data(), _client_caps.size()); write_message(VD_AGENT_FILE_XFER_STATUS, sizeof(status), &status); } break; |