diff --git a/server/main-channel-client.cpp b/server/main-channel-client.cpp index 67b82c07..6423ecc0 100644 --- a/server/main-channel-client.cpp +++ b/server/main-channel-client.cpp @@ -69,14 +69,6 @@ struct RedTokensPipeItem: public RedPipeItemNum { - ~RedAgentDataPipeItem(); - uint8_t* data; - size_t len; - spice_marshaller_item_free_func free_data; - void *opaque; -}; - struct RedInitPipeItem: public RedPipeItemNum { 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); } diff --git a/server/main-channel-client.h b/server/main-channel-client.h index 59324669..c7973d29 100644 --- a/server/main-channel-client.h +++ b/server/main-channel-client.h @@ -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 { + 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); diff --git a/server/reds.cpp b/server/reds.cpp index ade19487..94a0d703 100644 --- a/server/reds.cpp +++ b/server/reds.cpp @@ -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(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);