mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-24 08:22:39 +00:00
red-channel-client: Move handle_migrate_data as virtual function
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
2ffa7d00c6
commit
2b04f644f6
@ -1148,8 +1148,9 @@ static bool restore_surfaces_lossy(DisplayChannelClient *dcc,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool dcc_handle_migrate_data(DisplayChannelClient *dcc, uint32_t size, void *message)
|
||||
bool DisplayChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
{
|
||||
DisplayChannelClient *dcc = this;
|
||||
DisplayChannel *display = DCC_TO_DC(dcc);
|
||||
int surfaces_restored = FALSE;
|
||||
SpiceMigrateDataHeader *header = (SpiceMigrateDataHeader *)message;
|
||||
|
||||
@ -49,6 +49,7 @@ protected:
|
||||
virtual bool config_socket() override;
|
||||
virtual void on_disconnect() override;
|
||||
virtual void send_item(RedPipeItem *item) override;
|
||||
virtual bool handle_migrate_data(uint32_t size, void *message) override;
|
||||
|
||||
public:
|
||||
red::unique_link<DisplayChannelClientPrivate> priv;
|
||||
|
||||
@ -21,8 +21,6 @@
|
||||
#include "display-channel-private.h"
|
||||
#include "red-qxl.h"
|
||||
|
||||
XXX_CAST(RedChannelClient, DisplayChannelClient, DISPLAY_CHANNEL_CLIENT);
|
||||
|
||||
G_DEFINE_TYPE(DisplayChannel, display_channel, TYPE_COMMON_GRAPHICS_CHANNEL)
|
||||
|
||||
static void display_channel_connect(RedChannel *channel, RedClient *client,
|
||||
@ -2225,11 +2223,6 @@ static uint64_t handle_migrate_data_get_serial(RedChannelClient *rcc, uint32_t s
|
||||
return migrate_data->message_serial;
|
||||
}
|
||||
|
||||
static bool handle_migrate_data(RedChannelClient *rcc, uint32_t size, void *message)
|
||||
{
|
||||
return dcc_handle_migrate_data(DISPLAY_CHANNEL_CLIENT(rcc), size, message);
|
||||
}
|
||||
|
||||
static SpiceCanvas *image_surfaces_get(SpiceImageSurfaces *surfaces, uint32_t surface_id)
|
||||
{
|
||||
DisplayChannelPrivate *p = SPICE_CONTAINEROF(surfaces, DisplayChannelPrivate, image_surfaces);
|
||||
@ -2510,7 +2503,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 = handle_migrate_data;
|
||||
channel_class->handle_migrate_data_get_serial = handle_migrate_data_get_serial;
|
||||
|
||||
// client callbacks
|
||||
|
||||
@ -55,6 +55,7 @@ protected:
|
||||
virtual void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
|
||||
virtual void on_disconnect() override;
|
||||
virtual void send_item(RedPipeItem *base) override;
|
||||
virtual bool handle_migrate_data(uint32_t size, void *message) override;
|
||||
};
|
||||
|
||||
RedChannelClient* inputs_channel_client_create(RedChannel *channel,
|
||||
|
||||
@ -40,8 +40,6 @@
|
||||
#include "migration-protocol.h"
|
||||
#include "utils.h"
|
||||
|
||||
XXX_CAST(RedChannelClient, InputsChannelClient, INPUTS_CHANNEL_CLIENT);
|
||||
|
||||
struct InputsChannel final: public RedChannel
|
||||
{
|
||||
VDAgentMouseState mouse_state;
|
||||
@ -528,12 +526,9 @@ static bool inputs_channel_handle_migrate_flush_mark(RedChannelClient *rcc)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool inputs_channel_handle_migrate_data(RedChannelClient *rcc,
|
||||
uint32_t size,
|
||||
void *message)
|
||||
bool InputsChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
{
|
||||
InputsChannelClient *icc = INPUTS_CHANNEL_CLIENT(rcc);
|
||||
InputsChannel *inputs = INPUTS_CHANNEL(rcc->get_channel());
|
||||
InputsChannel *inputs = INPUTS_CHANNEL(get_channel());
|
||||
SpiceMigrateDataHeader *header;
|
||||
SpiceMigrateDataInputs *mig_data;
|
||||
|
||||
@ -552,7 +547,7 @@ static bool inputs_channel_handle_migrate_data(RedChannelClient *rcc,
|
||||
return FALSE;
|
||||
}
|
||||
key_modifiers_sender(inputs);
|
||||
icc->handle_migrate_data(mig_data->motion_count);
|
||||
handle_migrate_data(mig_data->motion_count);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -616,7 +611,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_data = inputs_channel_handle_migrate_data;
|
||||
channel_class->handle_migrate_flush_mark = inputs_channel_handle_migrate_flush_mark;
|
||||
|
||||
// client callbacks
|
||||
|
||||
@ -43,6 +43,7 @@ protected:
|
||||
virtual void on_disconnect() override;
|
||||
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;
|
||||
|
||||
public:
|
||||
red::unique_link<MainChannelClientPrivate> priv;
|
||||
|
||||
@ -99,19 +99,17 @@ static void main_channel_push_migrate_data_item(MainChannel *main_chan)
|
||||
main_chan->pipes_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA);
|
||||
}
|
||||
|
||||
static bool main_channel_handle_migrate_data(RedChannelClient *rcc,
|
||||
uint32_t size, void *message)
|
||||
bool MainChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
{
|
||||
RedChannel *channel = rcc->get_channel();
|
||||
MainChannelClient *mcc = MAIN_CHANNEL_CLIENT(rcc);
|
||||
RedChannel *channel = get_channel();
|
||||
MainChannelClient *mcc = this;
|
||||
SpiceMigrateDataHeader *header = (SpiceMigrateDataHeader *)message;
|
||||
|
||||
/* not supported with multi-clients */
|
||||
spice_assert(channel->get_n_clients() == 1);
|
||||
|
||||
if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataMain)) {
|
||||
red_channel_warning(rcc->get_channel(),
|
||||
"bad message size %u", size);
|
||||
red_channel_warning(channel, "bad message size %u", size);
|
||||
return FALSE;
|
||||
}
|
||||
if (!migration_protocol_validate_header(header,
|
||||
@ -279,7 +277,6 @@ main_channel_class_init(MainChannelClass *klass)
|
||||
|
||||
/* channel callbacks */
|
||||
channel_class->handle_migrate_flush_mark = main_channel_handle_migrate_flush_mark;
|
||||
channel_class->handle_migrate_data = main_channel_handle_migrate_data;
|
||||
|
||||
// client callbacks
|
||||
channel_class->migrate = main_channel_client_migrate;
|
||||
|
||||
@ -1273,14 +1273,16 @@ void RedChannelClient::handle_migrate_flush_mark()
|
||||
// 3) source migrates to target
|
||||
// 4) target sends data to all
|
||||
// So need to make all the handlers work with per channel/client data (what data exactly?)
|
||||
void RedChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
void RedChannelClient::handle_migrate_data_early(uint32_t size, void *message)
|
||||
{
|
||||
RedChannel *channel = get_channel();
|
||||
RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel);
|
||||
|
||||
red_channel_debug(channel, "rcc %p size %u", this, size);
|
||||
|
||||
if (!klass->handle_migrate_data) {
|
||||
uint32_t flags;
|
||||
g_object_get(priv->channel, "migration-flags", &flags, NULL);
|
||||
if (!(flags & SPICE_MIGRATE_NEED_DATA_TRANSFER)) {
|
||||
return;
|
||||
}
|
||||
if (!is_waiting_for_migrate_data()) {
|
||||
@ -1290,7 +1292,7 @@ void RedChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
if (klass->handle_migrate_data_get_serial) {
|
||||
priv->set_message_serial(klass->handle_migrate_data_get_serial(this, size, message));
|
||||
}
|
||||
if (!klass->handle_migrate_data(this, size, message)) {
|
||||
if (!handle_migrate_data(size, message)) {
|
||||
spice_channel_client_error(this, "handle_migrate_data failed");
|
||||
return;
|
||||
}
|
||||
@ -1321,7 +1323,7 @@ bool RedChannelClient::handle_message(uint16_t type, uint32_t size, void *messag
|
||||
priv->wait_migrate_flush_mark = FALSE;
|
||||
break;
|
||||
case SPICE_MSGC_MIGRATE_DATA:
|
||||
handle_migrate_data(size, message);
|
||||
handle_migrate_data_early(size, message);
|
||||
break;
|
||||
case SPICE_MSGC_PONG:
|
||||
priv->handle_pong((SpiceMsgPing*) message);
|
||||
|
||||
@ -166,13 +166,15 @@ public:
|
||||
*/
|
||||
virtual void send_item(RedPipeItem *item) {};
|
||||
|
||||
virtual bool handle_migrate_data(uint32_t size, void *message) { return false; }
|
||||
|
||||
/* Private functions */
|
||||
private:
|
||||
void send_any_item(RedPipeItem *item);
|
||||
void handle_outgoing();
|
||||
void handle_incoming();
|
||||
void handle_migrate_flush_mark();
|
||||
void handle_migrate_data(uint32_t size, void *message);
|
||||
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);
|
||||
void send_set_ack();
|
||||
|
||||
@ -206,8 +206,6 @@ red_channel_constructed(GObject *object)
|
||||
G_OBJECT_CLASS(red_channel_parent_class)->constructed(object);
|
||||
|
||||
spice_assert(klass->parser != NULL);
|
||||
spice_assert(klass->handle_migrate_data ||
|
||||
!(self->priv->migration_flags & SPICE_MIGRATE_NEED_DATA_TRANSFER));
|
||||
}
|
||||
|
||||
static void red_channel_client_default_connect(RedChannel *channel, RedClient *client,
|
||||
|
||||
@ -45,8 +45,6 @@ struct RedClient;
|
||||
struct MainChannelClient;
|
||||
|
||||
typedef bool (*channel_handle_migrate_flush_mark_proc)(RedChannelClient *base);
|
||||
typedef bool (*channel_handle_migrate_data_proc)(RedChannelClient *base,
|
||||
uint32_t size, void *message);
|
||||
typedef uint64_t (*channel_handle_migrate_data_get_serial_proc)(RedChannelClient *base,
|
||||
uint32_t size, void *message);
|
||||
|
||||
@ -76,7 +74,6 @@ struct RedChannelClass
|
||||
spice_parse_channel_func_t parser;
|
||||
|
||||
channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark;
|
||||
channel_handle_migrate_data_proc handle_migrate_data;
|
||||
channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial;
|
||||
|
||||
/*
|
||||
|
||||
@ -20,8 +20,6 @@
|
||||
|
||||
#include "smartcard-channel-client.h"
|
||||
|
||||
XXX_CAST(RedChannelClient, SmartCardChannelClient, SMARTCARD_CHANNEL_CLIENT)
|
||||
|
||||
struct SmartCardChannelClientPrivate
|
||||
{
|
||||
SPICE_CXX_GLIB_ALLOCATOR
|
||||
@ -261,15 +259,12 @@ bool SmartCardChannelClient::handle_message(uint16_t type, uint32_t size, void *
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool smartcard_channel_client_handle_migrate_data(RedChannelClient *rcc,
|
||||
uint32_t size,
|
||||
void *message)
|
||||
bool SmartCardChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
{
|
||||
SmartCardChannelClient *scc;
|
||||
SmartCardChannelClient *scc = this;
|
||||
SpiceMigrateDataHeader *header;
|
||||
SpiceMigrateDataSmartcard *mig_data;
|
||||
|
||||
scc = SMARTCARD_CHANNEL_CLIENT(rcc);
|
||||
header = (SpiceMigrateDataHeader *)message;
|
||||
mig_data = (SpiceMigrateDataSmartcard *)(header + 1);
|
||||
if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSmartcard)) {
|
||||
|
||||
@ -42,6 +42,7 @@ private:
|
||||
virtual void on_disconnect() override;
|
||||
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;
|
||||
};
|
||||
|
||||
SmartCardChannelClient* smartcard_channel_client_create(RedChannel *channel,
|
||||
|
||||
@ -557,7 +557,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;
|
||||
channel_class->handle_migrate_data = smartcard_channel_client_handle_migrate_data;
|
||||
|
||||
// client callbacks
|
||||
channel_class->connect = smartcard_connect_client;
|
||||
|
||||
@ -162,6 +162,7 @@ protected:
|
||||
virtual void on_disconnect() override;
|
||||
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;
|
||||
};
|
||||
|
||||
static RedChannelClient *
|
||||
@ -439,14 +440,13 @@ static bool spicevmc_channel_client_handle_migrate_flush_mark(RedChannelClient *
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool spicevmc_channel_client_handle_migrate_data(RedChannelClient *rcc,
|
||||
uint32_t size, void *message)
|
||||
bool VmcChannelClient::handle_migrate_data(uint32_t size, void *message)
|
||||
{
|
||||
SpiceMigrateDataHeader *header;
|
||||
SpiceMigrateDataSpiceVmc *mig_data;
|
||||
RedVmcChannel *channel;
|
||||
|
||||
channel = RED_VMC_CHANNEL(rcc->get_channel());
|
||||
channel = RED_VMC_CHANNEL(get_channel());
|
||||
|
||||
header = (SpiceMigrateDataHeader *)message;
|
||||
mig_data = (SpiceMigrateDataSpiceVmc *)(header + 1);
|
||||
@ -701,7 +701,6 @@ red_vmc_channel_class_init(RedVmcChannelClass *klass)
|
||||
object_class->finalize = red_vmc_channel_finalize;
|
||||
|
||||
channel_class->handle_migrate_flush_mark = spicevmc_channel_client_handle_migrate_flush_mark;
|
||||
channel_class->handle_migrate_data = spicevmc_channel_client_handle_migrate_data;
|
||||
|
||||
// client callbacks
|
||||
channel_class->connect = spicevmc_connect;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user