[Spice-devel] [PATCH spice v2 2/2] reds: Simplify vdi_port_read_buf_process
Pavel Grunt
pgrunt at redhat.com
Tue Sep 13 21:29:17 UTC 2016
Reuse and handle the return value from agent_msg_filter_process_data
---
v2 per Frediano's comments:
- clarified the commit message
- documented return values
- added fall through comment
---
server/reds.c | 69 +++++++++++++++++++++++++++--------------------------------
1 file changed, 31 insertions(+), 38 deletions(-)
diff --git a/server/reds.c b/server/reds.c
index 5ff50cd..d0adcaa 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -763,37 +763,23 @@ static void vdi_port_read_buf_release(uint8_t *data, void *opaque)
red_pipe_item_unref((RedPipeItem *)opaque);
}
-/* returns TRUE if the buffer can be forwarded */
-static gboolean vdi_port_read_buf_process(RedCharDeviceVDIPort *dev,
- RedVDIReadBuf *buf, gboolean *error)
+/*
+ returns the #AgentMsgFilterResult value:
+ AGENT_MSG_FILTER_OK if the buffer can be forwarded,
+ AGENT_MSG_FILTER_DISCARD if the buffer can be discarded
+ other values on error
+*/
+static AgentMsgFilterResult vdi_port_read_buf_process(RedCharDeviceVDIPort *dev,
+ RedVDIReadBuf *buf)
{
- AgentMsgFilterResult res;
-
- *error = FALSE;
-
switch (dev->priv->vdi_chunk_header.port) {
- case VDP_CLIENT_PORT: {
- res = agent_msg_filter_process_data(&dev->priv->read_filter,
- buf->data, buf->len);
- switch (res) {
- case AGENT_MSG_FILTER_OK:
- return TRUE;
- case AGENT_MSG_FILTER_DISCARD:
- return FALSE;
- case AGENT_MSG_FILTER_MONITORS_CONFIG:
- g_warn_if_reached();
- /* fall through */
- case AGENT_MSG_FILTER_PROTO_ERROR:
- *error = TRUE;
- return FALSE;
- }
- }
+ case VDP_CLIENT_PORT:
+ return agent_msg_filter_process_data(&dev->priv->read_filter, buf->data, buf->len);
case VDP_SERVER_PORT:
- return FALSE;
+ return AGENT_MSG_FILTER_DISCARD;
default:
spice_warning("invalid port");
- *error = TRUE;
- return FALSE;
+ return AGENT_MSG_FILTER_PROTO_ERROR;
}
}
@@ -884,7 +870,6 @@ static RedPipeItem *vdi_port_read_one_msg_from_device(SpiceCharDeviceInstance *s
dev->priv->read_state = VDI_PORT_READ_STATE_READ_DATA;
}
case VDI_PORT_READ_STATE_READ_DATA: {
- gboolean error = FALSE;
n = sif->read(reds->vdagent, dev->priv->receive_pos, dev->priv->receive_len);
if (!n) {
return NULL;
@@ -903,12 +888,16 @@ static RedPipeItem *vdi_port_read_one_msg_from_device(SpiceCharDeviceInstance *s
} else {
dev->priv->read_state = VDI_PORT_READ_STATE_GET_BUFF;
}
- if (vdi_port_read_buf_process(reds->agent_dev, dispatch_buf, &error)) {
+ switch (vdi_port_read_buf_process(reds->agent_dev, dispatch_buf)) {
+ case AGENT_MSG_FILTER_OK:
return &dispatch_buf->base;
- } else {
- if (error) {
- reds_agent_remove(reds);
- }
+ case AGENT_MSG_FILTER_MONITORS_CONFIG:
+ g_warn_if_reached();
+ /* fall through */
+ case AGENT_MSG_FILTER_PROTO_ERROR:
+ reds_agent_remove(reds);
+ /* fall through */
+ case AGENT_MSG_FILTER_DISCARD:
red_pipe_item_unref(&dispatch_buf->base);
}
}
@@ -1278,22 +1267,26 @@ void reds_on_main_channel_migrate(RedsState *reds, MainChannelClient *mcc)
if (agent_dev->priv->read_filter.msg_data_to_read ||
read_data_len > sizeof(VDAgentMessage)) { /* msg header has been read */
RedVDIReadBuf *read_buf = agent_dev->priv->current_read_buf;
- gboolean error = FALSE;
spice_debug("push partial read %u (msg first chunk? %d)", read_data_len,
!agent_dev->priv->read_filter.msg_data_to_read);
read_buf->len = read_data_len;
- if (vdi_port_read_buf_process(reds->agent_dev, read_buf, &error)) {
+ switch (vdi_port_read_buf_process(reds->agent_dev, read_buf)) {
+ case AGENT_MSG_FILTER_OK:
main_channel_client_push_agent_data(mcc,
read_buf->data,
read_buf->len,
vdi_port_read_buf_release,
read_buf);
- } else {
- if (error) {
- reds_agent_remove(reds);
- }
+ break;
+ case AGENT_MSG_FILTER_MONITORS_CONFIG:
+ g_warn_if_reached();
+ /* fall through */
+ case AGENT_MSG_FILTER_PROTO_ERROR:
+ reds_agent_remove(reds);
+ /* fall through */
+ case AGENT_MSG_FILTER_DISCARD:
red_pipe_item_unref(&read_buf->base);
}
--
2.10.0
More information about the Spice-devel
mailing list