red-channel-client: Move handle_migrate_data as virtual function

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
Frediano Ziglio 2019-05-24 20:00:01 +01:00 committed by Frediano Ziglio
parent 2ffa7d00c6
commit 2b04f644f6
15 changed files with 27 additions and 47 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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();

View File

@ -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,

View File

@ -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;
/*

View File

@ -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)) {

View File

@ -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,

View File

@ -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;

View File

@ -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;