summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <fziglio@redhat.com>2020-03-18 20:28:00 +0000
committerFrediano Ziglio <freddy77@gmail.com>2020-04-24 10:33:34 +0100
commita914784295b2ffed8ce002fab37fd158fdfba28d (patch)
treee2358b63f6b431439e04616393bdf7e46aca18e8
parent3cad1e7570255a90aa07a1fea14fd0d112aec4c2 (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.cpp22
-rw-r--r--vdagent/file_xfer.h7
-rw-r--r--vdagent/vdagent.cpp27
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;