static void do_client_capabilities(struct vdagent_virtio_port *vport, VDAgentMessage *message_header, VDAgentAnnounceCapabilities *caps) { int new_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(message_header->size); if (capabilities_size != new_size) { capabilities_size = new_size; free(capabilities); capabilities = malloc(capabilities_size * sizeof(uint32_t)); if (!capabilities) { syslog(LOG_ERR, "oom allocating capabilities array (read)"); capabilities_size = 0; return; } } memcpy(capabilities, caps->caps, capabilities_size * sizeof(uint32_t)); if (caps->request) { /* Report the previous client has disconneced. */ do_client_disconnect(); if (debug) syslog(LOG_DEBUG, "New client connected"); client_connected = 1; send_capabilities(vport, 0); } }
void RedClient::on_agent_announce_capabilities( VDAgentAnnounceCapabilities* caps, uint32_t msg_size) { uint32_t caps_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(msg_size); if (_agent_caps_size != caps_size) { delete[] _agent_caps; _agent_caps = new uint32_t[caps_size]; ASSERT(_agent_caps != NULL); _agent_caps_size = caps_size; } memcpy(_agent_caps, caps->caps, sizeof(_agent_caps[0]) * caps_size); if (caps->request) { send_agent_announce_capabilities(false); } if (VD_AGENT_HAS_CAPABILITY(caps->caps, caps_size, VD_AGENT_CAP_DISPLAY_CONFIG) && !_agent_disp_config_sent) { // not sending the color depth through send_agent_monitors_config, since // it applies only for attached screens. send_agent_display_config(); } else if (!_auto_display_res) { /* some agents don't support monitors/displays agent messages, so * we'll never reach on_agent_reply which sends this * ATTACH_CHANNELS message which is needed for client startup to go * on. */ if (!_display_setting.is_empty()) { LOG_WARN("display options have been requested, but the agent doesn't support these options"); } send_main_attach_channels(); _application.deactivate_interval_timer(*_agent_timer); } }
bool VDAgent::handle_announce_capabilities(VDAgentAnnounceCapabilities* announce_capabilities, uint32_t msg_size) { uint32_t caps_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(msg_size); vd_printf("Got capabilities (%d)", caps_size); for (uint32_t i = 0 ; i < caps_size; ++i) { vd_printf("%X", announce_capabilities->caps[i]); } if (caps_size != _client_caps_size) { delete[] _client_caps; _client_caps = new uint32_t[caps_size]; ASSERT(_client_caps != NULL); _client_caps_size = caps_size; } memcpy(_client_caps, announce_capabilities->caps, sizeof(_client_caps[0]) * caps_size); if (announce_capabilities->request) { return send_announce_capabilities(false); } return true; }