diff --git a/server/dcc.h b/server/dcc.h index e1f26802..e7b7970a 100644 --- a/server/dcc.h +++ b/server/dcc.h @@ -51,6 +51,7 @@ protected: virtual void send_item(RedPipeItem *item) override; virtual bool handle_migrate_data(uint32_t size, void *message) override; virtual void migrate() override; + virtual void handle_migrate_flush_mark() override; public: red::unique_link priv; diff --git a/server/display-channel.cpp b/server/display-channel.cpp index bfb08407..5c4d0e50 100644 --- a/server/display-channel.cpp +++ b/server/display-channel.cpp @@ -2205,12 +2205,11 @@ void display_channel_create_surface(DisplayChannel *display, uint32_t surface_id send_create_surface(display, surface_id, data_is_valid); } -static bool handle_migrate_flush_mark(RedChannelClient *rcc) +void DisplayChannelClient::handle_migrate_flush_mark() { - RedChannel *channel = rcc->get_channel(); + RedChannel *channel = get_channel(); channel->pipes_add_type(RED_PIPE_ITEM_TYPE_MIGRATE_DATA); - return TRUE; } static uint64_t handle_migrate_data_get_serial(RedChannelClient *rcc, uint32_t size, void *message) @@ -2501,7 +2500,6 @@ display_channel_class_init(DisplayChannelClass *klass) channel_class->parser = spice_get_client_channel_parser(SPICE_CHANNEL_DISPLAY, NULL); - channel_class->handle_migrate_flush_mark = handle_migrate_flush_mark; channel_class->handle_migrate_data_get_serial = handle_migrate_data_get_serial; // client callbacks diff --git a/server/inputs-channel-client.h b/server/inputs-channel-client.h index 600d6d98..7c802f58 100644 --- a/server/inputs-channel-client.h +++ b/server/inputs-channel-client.h @@ -57,6 +57,7 @@ protected: virtual void send_item(RedPipeItem *base) override; virtual bool handle_migrate_data(uint32_t size, void *message) override; virtual void migrate() override; + virtual void handle_migrate_flush_mark() override; }; RedChannelClient* inputs_channel_client_create(RedChannel *channel, diff --git a/server/inputs-channel.cpp b/server/inputs-channel.cpp index 9c69dc40..72a4583d 100644 --- a/server/inputs-channel.cpp +++ b/server/inputs-channel.cpp @@ -520,10 +520,9 @@ static void key_modifiers_sender(void *opaque) inputs_channel_push_keyboard_modifiers(inputs, inputs->modifiers); } -static bool inputs_channel_handle_migrate_flush_mark(RedChannelClient *rcc) +void InputsChannelClient::handle_migrate_flush_mark() { - rcc->pipe_add_type(RED_PIPE_ITEM_MIGRATE_DATA); - return TRUE; + pipe_add_type(RED_PIPE_ITEM_MIGRATE_DATA); } bool InputsChannelClient::handle_migrate_data(uint32_t size, void *message) @@ -610,9 +609,6 @@ inputs_channel_class_init(InputsChannelClass *klass) channel_class->parser = spice_get_client_channel_parser(SPICE_CHANNEL_INPUTS, NULL); - /* channel callbacks */ - channel_class->handle_migrate_flush_mark = inputs_channel_handle_migrate_flush_mark; - // client callbacks channel_class->connect = inputs_connect; } diff --git a/server/main-channel-client.h b/server/main-channel-client.h index 7f9a11ad..da90036a 100644 --- a/server/main-channel-client.h +++ b/server/main-channel-client.h @@ -45,6 +45,7 @@ protected: virtual void send_item(RedPipeItem *item) override; virtual bool handle_migrate_data(uint32_t size, void *message) override; virtual void migrate() override; + virtual void handle_migrate_flush_mark() override; public: red::unique_link priv; diff --git a/server/main-channel.cpp b/server/main-channel.cpp index 5be27a7c..72f28407 100644 --- a/server/main-channel.cpp +++ b/server/main-channel.cpp @@ -213,12 +213,11 @@ bool MainChannelClient::handle_message(uint16_t type, uint32_t size, void *messa return TRUE; } -static bool main_channel_handle_migrate_flush_mark(RedChannelClient *rcc) +void MainChannelClient::handle_migrate_flush_mark() { - RedChannel *channel = rcc->get_channel(); + RedChannel *channel = get_channel(); spice_debug("trace"); main_channel_push_migrate_data_item(MAIN_CHANNEL(channel)); - return TRUE; } MainChannelClient *main_channel_link(MainChannel *channel, RedClient *client, @@ -274,9 +273,6 @@ main_channel_class_init(MainChannelClass *klass) object_class->constructed = main_channel_constructed; channel_class->parser = spice_get_client_channel_parser(SPICE_CHANNEL_MAIN, NULL); - - /* channel callbacks */ - channel_class->handle_migrate_flush_mark = main_channel_handle_migrate_flush_mark; } static int main_channel_connect_semi_seamless(MainChannel *main_channel) diff --git a/server/red-channel-client.cpp b/server/red-channel-client.cpp index dbb0e84a..6ed21bd1 100644 --- a/server/red-channel-client.cpp +++ b/server/red-channel-client.cpp @@ -1259,11 +1259,6 @@ void RedChannelClientPrivate::handle_pong(SpiceMsgPing *ping) void RedChannelClient::handle_migrate_flush_mark() { - RedChannel *channel = get_channel(); - RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel); - if (klass->handle_migrate_flush_mark) { - klass->handle_migrate_flush_mark(this); - } } // TODO: the whole migration is broken with multiple clients. What do we want to do? diff --git a/server/red-channel-client.h b/server/red-channel-client.h index 3e1c9fa7..24ecd267 100644 --- a/server/red-channel-client.h +++ b/server/red-channel-client.h @@ -175,7 +175,7 @@ private: void send_any_item(RedPipeItem *item); void handle_outgoing(); void handle_incoming(); - void handle_migrate_flush_mark(); + virtual void handle_migrate_flush_mark(); void handle_migrate_data_early(uint32_t size, void *message); inline bool prepare_pipe_add(RedPipeItem *item); void pipe_add_before_pos(RedPipeItem *item, GList *pipe_item_pos); diff --git a/server/red-channel.h b/server/red-channel.h index 24c807a0..1ced241f 100644 --- a/server/red-channel.h +++ b/server/red-channel.h @@ -44,7 +44,6 @@ struct RedChannelClient; struct RedClient; struct MainChannelClient; -typedef bool (*channel_handle_migrate_flush_mark_proc)(RedChannelClient *base); typedef uint64_t (*channel_handle_migrate_data_get_serial_proc)(RedChannelClient *base, uint32_t size, void *message); @@ -72,7 +71,6 @@ struct RedChannelClass */ spice_parse_channel_func_t parser; - channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark; channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial; /* diff --git a/server/smartcard-channel-client.cpp b/server/smartcard-channel-client.cpp index 259ad4f8..8d683041 100644 --- a/server/smartcard-channel-client.cpp +++ b/server/smartcard-channel-client.cpp @@ -298,10 +298,9 @@ bool SmartCardChannelClient::handle_migrate_data(uint32_t size, void *message) mig_data); } -bool smartcard_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc) +void SmartCardChannelClient::handle_migrate_flush_mark() { - rcc->pipe_add_type(RED_PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA); - return TRUE; + pipe_add_type(RED_PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA); } void smartcard_channel_client_set_char_device(SmartCardChannelClient *scc, diff --git a/server/smartcard-channel-client.h b/server/smartcard-channel-client.h index 87a71aa6..21a4d31a 100644 --- a/server/smartcard-channel-client.h +++ b/server/smartcard-channel-client.h @@ -43,14 +43,13 @@ private: virtual bool handle_message(uint16_t type, uint32_t size, void *message) override; virtual void send_item(RedPipeItem *item) override; virtual bool handle_migrate_data(uint32_t size, void *message) override; + virtual void handle_migrate_flush_mark() override; }; SmartCardChannelClient* smartcard_channel_client_create(RedChannel *channel, RedClient *client, RedStream *stream, RedChannelCapabilities *caps); -bool smartcard_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc); - void smartcard_channel_client_send_data(RedChannelClient *rcc, SpiceMarshaller *m, RedPipeItem *item, @@ -60,10 +59,6 @@ void smartcard_channel_client_send_error(RedChannelClient *rcc, SpiceMarshaller *m, RedPipeItem *item); -bool smartcard_channel_client_handle_migrate_data(RedChannelClient *rcc, - uint32_t size, - void *message); - void smartcard_channel_client_set_char_device(SmartCardChannelClient *scc, RedCharDeviceSmartcard *device); diff --git a/server/smartcard.cpp b/server/smartcard.cpp index 1a7ebe23..949a3f03 100644 --- a/server/smartcard.cpp +++ b/server/smartcard.cpp @@ -556,8 +556,6 @@ red_smartcard_channel_class_init(RedSmartcardChannelClass *klass) channel_class->parser = spice_get_client_channel_parser(SPICE_CHANNEL_SMARTCARD, NULL); - channel_class->handle_migrate_flush_mark = smartcard_channel_client_handle_migrate_flush_mark; - // client callbacks channel_class->connect = smartcard_connect_client; } diff --git a/server/spicevmc.cpp b/server/spicevmc.cpp index 41adcbe9..37da0d00 100644 --- a/server/spicevmc.cpp +++ b/server/spicevmc.cpp @@ -163,6 +163,7 @@ protected: virtual bool handle_message(uint16_t type, uint32_t size, void *msg) override; virtual void send_item(RedPipeItem *item) override; virtual bool handle_migrate_data(uint32_t size, void *message) override; + virtual void handle_migrate_flush_mark() override; }; static RedChannelClient * @@ -434,10 +435,9 @@ void VmcChannelClient::on_disconnect() } } -static bool spicevmc_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc) +void VmcChannelClient::handle_migrate_flush_mark() { - rcc->pipe_add_type(RED_PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA); - return TRUE; + pipe_add_type(RED_PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA); } bool VmcChannelClient::handle_migrate_data(uint32_t size, void *message) @@ -700,8 +700,6 @@ red_vmc_channel_class_init(RedVmcChannelClass *klass) object_class->constructed = red_vmc_channel_constructed; object_class->finalize = red_vmc_channel_finalize; - channel_class->handle_migrate_flush_mark = spicevmc_channel_client_handle_migrate_flush_mark; - // client callbacks channel_class->connect = spicevmc_connect; }