summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <freddy77@gmail.com>2020-08-27 18:54:31 +0100
committerFrediano Ziglio <freddy77@gmail.com>2020-09-15 11:55:45 +0100
commit0d7d0d35d814571f078816fb36305de03db642b7 (patch)
tree05eed8b58730542bb4d0cb0dfb8c41d074afbc22
parentb03c894c2189c8c2393f38e65ebde73f84dab7c3 (diff)
agent: Extend agent_check_message to support VDAgentMonitorsConfig extension
Add support for VD_AGENT_CONFIG_MONITORS_FLAG_PHYSICAL_SIZE flag. Signed-off-by: Frediano Ziglio <freddy77@gmail.com> Acked-by: Marc-André Lureau <marcandre.lureau@gmail.com>
-rw-r--r--common/agent.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/common/agent.c b/common/agent.c
index e7df786..75faee5 100644
--- a/common/agent.c
+++ b/common/agent.c
@@ -245,6 +245,31 @@ agent_message_graphics_device_info_check_from_le(const VDAgentMessage *message_h
return AGENT_CHECK_NO_ERROR;
}
+static AgentCheckResult
+agent_message_monitors_config_from_le(const VDAgentMessage *message_header, uint8_t *message)
+{
+ uint32_from_le(message, sizeof(VDAgentMonitorsConfig), 0);
+ VDAgentMonitorsConfig *vdata = (VDAgentMonitorsConfig*) message;
+ vdata->flags &= ~(VD_AGENT_CONFIG_MONITORS_FLAG_USE_POS|
+ VD_AGENT_CONFIG_MONITORS_FLAG_PHYSICAL_SIZE);
+ size_t element_size = sizeof(vdata->monitors[0]);
+ if ((vdata->flags & VD_AGENT_CONFIG_MONITORS_FLAG_PHYSICAL_SIZE) != 0) {
+ element_size += sizeof(VDAgentMonitorMM);
+ }
+ const size_t max_monitors =
+ (message_header->size - sizeof(*vdata)) / element_size;
+ if (vdata->num_of_monitors > max_monitors) {
+ return AGENT_CHECK_TRUNCATED;
+ }
+ uint32_from_le(message, sizeof(vdata->monitors[0]) * vdata->num_of_monitors,
+ sizeof(*vdata));
+ if ((vdata->flags & VD_AGENT_CONFIG_MONITORS_FLAG_PHYSICAL_SIZE) != 0) {
+ uint16_from_le(message, sizeof(VDAgentMonitorMM) * vdata->num_of_monitors,
+ sizeof(*vdata) + sizeof(vdata->monitors[0]) * vdata->num_of_monitors);
+ }
+ return AGENT_CHECK_NO_ERROR;
+}
+
AgentCheckResult
agent_check_message(const VDAgentMessage *message_header, uint8_t *message,
const uint32_t *capabilities, uint32_t capabilities_size)
@@ -266,16 +291,9 @@ agent_check_message(const VDAgentMessage *message_header, uint8_t *message,
case VD_AGENT_ANNOUNCE_CAPABILITIES:
uint32_from_le(message, message_header->size, 0);
break;
- case VD_AGENT_MONITORS_CONFIG: {
- uint32_from_le(message, message_header->size, 0);
- VDAgentMonitorsConfig *vdata = (VDAgentMonitorsConfig*) message;
- const size_t max_monitors =
- (message_header->size - sizeof(*vdata)) / sizeof(vdata->monitors[0]);
- if (vdata->num_of_monitors > max_monitors) {
- return AGENT_CHECK_TRUNCATED;
- }
- break;
- }
+ case VD_AGENT_MONITORS_CONFIG:
+ return agent_message_monitors_config_from_le(message_header, message);
+
case VD_AGENT_CLIPBOARD:
case VD_AGENT_CLIPBOARD_GRAB:
case VD_AGENT_CLIPBOARD_REQUEST: