--- server/agent-msg-filter.c | 30 ++++++++++++++++++------------ server/agent-msg-filter.h | 5 +++-- server/reds.c | 9 +++++---- 3 files changed, 26 insertions(+), 18 deletions(-)
diff --git a/server/agent-msg-filter.c b/server/agent-msg-filter.c index 3867d11..cd1f78c 100644 --- a/server/agent-msg-filter.c +++ b/server/agent-msg-filter.c @@ -22,10 +22,12 @@ #include "red_common.h" #include "agent-msg-filter.h" -void agent_msg_filter_init(struct AgentMsgFilter *filter, int copy_paste) +void agent_msg_filter_init(struct AgentMsgFilter *filter, + int copy_paste, int discard_all) { memset(filter, 0, sizeof(*filter)); filter->copy_paste_enabled = copy_paste; + filter->discard_all = discard_all; } int agent_msg_filter_process_data(struct AgentMsgFilter *filter, @@ -61,19 +63,23 @@ data_to_read: return AGENT_MSG_FILTER_PROTO_ERROR; } - switch (msg_header.type) { - case VD_AGENT_CLIPBOARD: - case VD_AGENT_CLIPBOARD_GRAB: - case VD_AGENT_CLIPBOARD_REQUEST: - case VD_AGENT_CLIPBOARD_RELEASE: - if (filter->copy_paste_enabled) { + if (filter->discard_all) { + filter->result = AGENT_MSG_FILTER_DISCARD; + } else { + switch (msg_header.type) { + case VD_AGENT_CLIPBOARD: + case VD_AGENT_CLIPBOARD_GRAB: + case VD_AGENT_CLIPBOARD_REQUEST: + case VD_AGENT_CLIPBOARD_RELEASE: + if (filter->copy_paste_enabled) { + filter->result = AGENT_MSG_FILTER_OK; + } else { + filter->result = AGENT_MSG_FILTER_DISCARD; + } + break; + default: filter->result = AGENT_MSG_FILTER_OK; - } else { - filter->result = AGENT_MSG_FILTER_DISCARD; } - break; - default: - filter->result = AGENT_MSG_FILTER_OK; } filter->msg_data_to_read = msg_header.size; diff --git a/server/agent-msg-filter.h b/server/agent-msg-filter.h index 99dbb8c..ecccfc7 100644 --- a/server/agent-msg-filter.h +++ b/server/agent-msg-filter.h @@ -32,13 +32,14 @@ enum { }; typedef struct AgentMsgFilter { - struct VDAgentMessage msg_header; int msg_data_to_read; int result; int copy_paste_enabled; + int discard_all; } AgentMsgFilter; -void agent_msg_filter_init(struct AgentMsgFilter *filter, int copy_paste); +void agent_msg_filter_init(struct AgentMsgFilter *filter, + int copy_paste, int discard_all); int agent_msg_filter_process_data(struct AgentMsgFilter *filter, uint8_t *data, uint32_t len); diff --git a/server/reds.c b/server/reds.c index 7a3399e..40b6bb0 100644 --- a/server/reds.c +++ b/server/reds.c @@ -713,7 +713,7 @@ static void reds_reset_vdp() ring_add(&state->read_bufs, &state->current_read_buf->link); state->current_read_buf = NULL; } - agent_msg_filter_init(&state->read_filter, agent_copypaste); + agent_msg_filter_init(&state->read_filter, agent_copypaste, FALSE); state->client_agent_started = FALSE; } @@ -744,7 +744,8 @@ static void reds_disconnect() red_printf(""); reds->disconnecting = TRUE; reds_reset_outgoing(); - agent_msg_filter_init(&reds->agent_state.write_filter, agent_copypaste); + agent_msg_filter_init(&reds->agent_state.write_filter, agent_copypaste, + FALSE); if (reds->agent_state.connected) { SpiceCharDeviceInterface *sif; @@ -3750,8 +3751,8 @@ static void init_vd_agent_resources() ring_init(&state->internal_bufs); ring_init(&state->write_queue); ring_init(&state->read_bufs); - agent_msg_filter_init(&state->write_filter, agent_copypaste); - agent_msg_filter_init(&state->read_filter, agent_copypaste); + agent_msg_filter_init(&state->write_filter, agent_copypaste, FALSE); + agent_msg_filter_init(&state->read_filter, agent_copypaste, FALSE); state->read_state = VDI_PORT_READ_STATE_READ_HADER; state->recive_pos = (uint8_t *)&state->vdi_chunk_header; -- 1.7.4.2 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel