mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2025-12-31 02:41:52 +00:00
main-channel-client: Pass directly a RedPipeItem from VDI
Provides a base class to allows RedCharDeviceVDIPort to pass a RedPipeItem to MainChannelClient instead of having to wrap into another item. Signed-off-by: Frediano Ziglio <freddy77@gmail.com> Acked-by: Julien Ropé <jrope@gmail.com>
This commit is contained in:
parent
d55c8837f8
commit
fa404f73d8
@ -69,14 +69,6 @@ struct RedTokensPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_AGENT_TO
|
||||
int tokens;
|
||||
};
|
||||
|
||||
struct RedAgentDataPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_AGENT_DATA> {
|
||||
~RedAgentDataPipeItem();
|
||||
uint8_t* data;
|
||||
size_t len;
|
||||
spice_marshaller_item_free_func free_data;
|
||||
void *opaque;
|
||||
};
|
||||
|
||||
struct RedInitPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_INIT> {
|
||||
int connection_id;
|
||||
int display_channels_hint;
|
||||
@ -213,31 +205,8 @@ void MainChannelClient::push_agent_tokens(uint32_t num_tokens)
|
||||
pipe_add_push(item);
|
||||
}
|
||||
|
||||
RedAgentDataPipeItem::~RedAgentDataPipeItem()
|
||||
void MainChannelClient::push_agent_data(RedAgentDataPipeItem *item)
|
||||
{
|
||||
free_data(data, opaque);
|
||||
}
|
||||
|
||||
static RedPipeItem *main_agent_data_item_new(uint8_t* data, size_t len,
|
||||
spice_marshaller_item_free_func free_data,
|
||||
void *opaque)
|
||||
{
|
||||
RedAgentDataPipeItem *item = new RedAgentDataPipeItem();
|
||||
|
||||
item->data = data;
|
||||
item->len = len;
|
||||
item->free_data = free_data;
|
||||
item->opaque = opaque;
|
||||
return item;
|
||||
}
|
||||
|
||||
void MainChannelClient::push_agent_data(uint8_t *data, size_t len,
|
||||
spice_marshaller_item_free_func free_data,
|
||||
void *opaque)
|
||||
{
|
||||
RedPipeItem *item;
|
||||
|
||||
item = main_agent_data_item_new(data, len, free_data, opaque);
|
||||
pipe_add_push(item);
|
||||
}
|
||||
|
||||
|
||||
@ -32,13 +32,13 @@ MainChannelClient *main_channel_client_create(MainChannel *main_chan, RedClient
|
||||
RedStream *stream, uint32_t connection_id,
|
||||
RedChannelCapabilities *caps);
|
||||
|
||||
struct RedAgentDataPipeItem;
|
||||
|
||||
class MainChannelClient final: public RedChannelClient
|
||||
{
|
||||
public:
|
||||
void push_agent_tokens(uint32_t num_tokens);
|
||||
void push_agent_data(uint8_t *data, size_t len,
|
||||
spice_marshaller_item_free_func free_data, void *opaque);
|
||||
void push_agent_data(RedAgentDataPipeItem *item);
|
||||
// TODO: huge. Consider making a reds_* interface for these functions
|
||||
// and calling from main.
|
||||
void push_init(int display_channels_hint, SpiceMouseMode current_mouse_mode,
|
||||
@ -115,6 +115,11 @@ enum {
|
||||
RED_PIPE_ITEM_TYPE_MAIN_REGISTERED_CHANNEL,
|
||||
};
|
||||
|
||||
struct RedAgentDataPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_AGENT_DATA> {
|
||||
int len = 0;
|
||||
uint8_t data[SPICE_AGENT_MAX_DATA_SIZE];
|
||||
};
|
||||
|
||||
RedPipeItem *main_mouse_mode_item_new(SpiceMouseMode current_mode, int is_client_mouse_allowed);
|
||||
|
||||
RedPipeItem *main_multi_media_time_item_new(uint32_t mm_time);
|
||||
|
||||
@ -153,16 +153,10 @@ struct ChannelSecurityOptions {
|
||||
ChannelSecurityOptions *next;
|
||||
};
|
||||
|
||||
/* Bogus pipe item type, we only need the RingItem and refcounting
|
||||
* from the base class and are not going to use the type
|
||||
*/
|
||||
struct RedVDIReadBuf final: public RedPipeItemNum<-1> {
|
||||
struct RedVDIReadBuf final: public RedAgentDataPipeItem {
|
||||
~RedVDIReadBuf();
|
||||
|
||||
RedCharDeviceVDIPort *dev;
|
||||
|
||||
int len;
|
||||
uint8_t data[SPICE_AGENT_MAX_DATA_SIZE];
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
@ -658,12 +652,6 @@ static void reds_agent_remove(RedsState *reds)
|
||||
}
|
||||
}
|
||||
|
||||
static void vdi_port_read_buf_release(uint8_t *data, void *opaque)
|
||||
{
|
||||
RedVDIReadBuf *read_buf = (RedVDIReadBuf *)opaque;
|
||||
red_pipe_item_unref(read_buf);
|
||||
}
|
||||
|
||||
/*
|
||||
returns the #AgentMsgFilterResult value:
|
||||
AGENT_MSG_FILTER_OK if the buffer can be forwarded,
|
||||
@ -701,7 +689,6 @@ static RedVDIReadBuf *vdi_read_buf_new(RedCharDeviceVDIPort *dev)
|
||||
{
|
||||
RedVDIReadBuf *buf = new RedVDIReadBuf();
|
||||
buf->dev = dev;
|
||||
buf->len = 0;
|
||||
return buf;
|
||||
}
|
||||
|
||||
@ -907,10 +894,7 @@ void RedCharDeviceVDIPort::send_msg_to_client(RedPipeItem *msg, RedCharDeviceCli
|
||||
RedVDIReadBuf *agent_data_buf = static_cast<RedVDIReadBuf*>(msg);
|
||||
|
||||
red_pipe_item_ref(msg);
|
||||
client->get_main()->push_agent_data(agent_data_buf->data,
|
||||
agent_data_buf->len,
|
||||
vdi_port_read_buf_release,
|
||||
agent_data_buf);
|
||||
client->get_main()->push_agent_data(agent_data_buf);
|
||||
}
|
||||
|
||||
void RedCharDeviceVDIPort::send_tokens_to_client(RedCharDeviceClientOpaque *opaque, uint32_t tokens)
|
||||
@ -1267,8 +1251,7 @@ void reds_on_main_channel_migrate(RedsState *reds, MainChannelClient *mcc)
|
||||
switch (vdi_port_read_buf_process(agent_dev, read_buf)) {
|
||||
case AGENT_MSG_FILTER_OK:
|
||||
reds_adjust_agent_capabilities(reds, (VDAgentMessage *)read_buf->data);
|
||||
mcc->push_agent_data(read_buf->data, read_buf->len,
|
||||
vdi_port_read_buf_release, read_buf);
|
||||
mcc->push_agent_data(read_buf);
|
||||
break;
|
||||
case AGENT_MSG_FILTER_PROTO_ERROR:
|
||||
reds_agent_remove(reds);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user