Example #1
0
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);
    }
}
Example #2
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;
}