From 4154d7028943ca4bf0f1ff2e0480d688fc081fcc Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 25 May 2010 16:01:18 +0200 Subject: Client: Use the autogenerated demarshallers When a message has been read from the network we now pass it into the generated demarshaller for the channel. The demarshaller converts the network data to in-memory structures that is passed on to the spice internals. Additionally it also: * Converts endianness * Validates sizes of message and any pointers in it * Localizes offsets (converts them to pointers) * Checks for zero offsets in messages where they are not supported Some of this was previously done using custom code in the client, this is now removed. --- client/red_client.cpp | 51 +++++++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 30 deletions(-) (limited to 'client/red_client.cpp') diff --git a/client/red_client.cpp b/client/red_client.cpp index 8424a94b..8778eebc 100644 --- a/client/red_client.cpp +++ b/client/red_client.cpp @@ -293,9 +293,9 @@ void AgentTimer::response(AbstractProcessLoop& events_loop) THROW_ERR(SPICEC_ERROR_CODE_AGENT_TIMEOUT, "vdagent timeout"); } -class MainChannelLoop: public MessageHandlerImp { +class MainChannelLoop: public MessageHandlerImp { public: - MainChannelLoop(RedClient& client): MessageHandlerImp(client) {} + MainChannelLoop(RedClient& client): MessageHandlerImp(client) {} }; RedClient::RedClient(Application& application) @@ -320,35 +320,26 @@ RedClient::RedClient(Application& application) { MainChannelLoop* message_loop = static_cast(get_message_handler()); - message_loop->set_handler(SPICE_MSG_MIGRATE, &RedClient::handle_migrate, 0); - message_loop->set_handler(SPICE_MSG_SET_ACK, &RedClient::handle_set_ack, sizeof(SpiceMsgSetAck)); - message_loop->set_handler(SPICE_MSG_PING, &RedClient::handle_ping, sizeof(SpiceMsgPing)); - message_loop->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &RedClient::handle_wait_for_channels, - sizeof(SpiceMsgWaitForChannels)); - message_loop->set_handler(SPICE_MSG_DISCONNECTING, &RedClient::handle_disconnect, - sizeof(SpiceMsgDisconnect)); - message_loop->set_handler(SPICE_MSG_NOTIFY, &RedClient::handle_notify, sizeof(SpiceMsgNotify)); - - message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_BEGIN, &RedClient::handle_migrate_begin, - sizeof(SpiceMsgMainMigrationBegin)); - message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_CANCEL, &RedClient::handle_migrate_cancel, 0); + message_loop->set_handler(SPICE_MSG_MIGRATE, &RedClient::handle_migrate); + message_loop->set_handler(SPICE_MSG_SET_ACK, &RedClient::handle_set_ack); + message_loop->set_handler(SPICE_MSG_PING, &RedClient::handle_ping); + message_loop->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &RedClient::handle_wait_for_channels); + message_loop->set_handler(SPICE_MSG_DISCONNECTING, &RedClient::handle_disconnect); + message_loop->set_handler(SPICE_MSG_NOTIFY, &RedClient::handle_notify); + + message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_BEGIN, &RedClient::handle_migrate_begin); + message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_CANCEL, &RedClient::handle_migrate_cancel); message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST, - &RedClient::handle_migrate_switch_host, - sizeof(SpiceMsgMainMigrationSwitchHost)); - message_loop->set_handler(SPICE_MSG_MAIN_INIT, &RedClient::handle_init, sizeof(SpiceMsgMainInit)); - message_loop->set_handler(SPICE_MSG_MAIN_CHANNELS_LIST, &RedClient::handle_channels, - sizeof(SpiceMsgChannels)); - message_loop->set_handler(SPICE_MSG_MAIN_MOUSE_MODE, &RedClient::handle_mouse_mode, - sizeof(SpiceMsgMainMouseMode)); - message_loop->set_handler(SPICE_MSG_MAIN_MULTI_MEDIA_TIME, &RedClient::handle_mm_time, - sizeof(SpiceMsgMainMultiMediaTime)); - - message_loop->set_handler(SPICE_MSG_MAIN_AGENT_CONNECTED, &RedClient::handle_agent_connected, 0); - message_loop->set_handler(SPICE_MSG_MAIN_AGENT_DISCONNECTED, &RedClient::handle_agent_disconnected, - sizeof(SpiceMsgMainAgentDisconnect)); - message_loop->set_handler(SPICE_MSG_MAIN_AGENT_DATA, &RedClient::handle_agent_data, 0); - message_loop->set_handler(SPICE_MSG_MAIN_AGENT_TOKEN, &RedClient::handle_agent_tokens, - sizeof(SpiceMsgMainAgentTokens)); + &RedClient::handle_migrate_switch_host); + message_loop->set_handler(SPICE_MSG_MAIN_INIT, &RedClient::handle_init); + message_loop->set_handler(SPICE_MSG_MAIN_CHANNELS_LIST, &RedClient::handle_channels); + message_loop->set_handler(SPICE_MSG_MAIN_MOUSE_MODE, &RedClient::handle_mouse_mode); + message_loop->set_handler(SPICE_MSG_MAIN_MULTI_MEDIA_TIME, &RedClient::handle_mm_time); + + message_loop->set_handler(SPICE_MSG_MAIN_AGENT_CONNECTED, &RedClient::handle_agent_connected); + message_loop->set_handler(SPICE_MSG_MAIN_AGENT_DISCONNECTED, &RedClient::handle_agent_disconnected); + message_loop->set_handler(SPICE_MSG_MAIN_AGENT_DATA, &RedClient::handle_agent_data); + message_loop->set_handler(SPICE_MSG_MAIN_AGENT_TOKEN, &RedClient::handle_agent_tokens); start(); } -- cgit