[Spice-devel] [RFC PATCH spice v2 10/20] Handle the StreamInfo message from the streaming agent

Lukáš Hrázký lhrazky at redhat.com
Thu Aug 16 16:26:39 UTC 2018


The StreamInfo message contains the guest (xrandr) output ID of the
monitor that is being streamed. We store the guest_output_id in the
monitors_guest_output_id hash table for a later use.

Signed-off-by: Lukáš Hrázký <lhrazky at redhat.com>
---
 server/red-stream-device.c        | 40 +++++++++++++++++++++++++++++--
 server/stream-channel.c           | 11 +++++++++
 server/stream-channel.h           |  1 +
 server/tests/test-stream-device.c |  4 ++++
 4 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/server/red-stream-device.c b/server/red-stream-device.c
index fb036b93..4e85703b 100644
--- a/server/red-stream-device.c
+++ b/server/red-stream-device.c
@@ -34,6 +34,7 @@ struct StreamDevice {
     uint8_t hdr_pos;
     union {
         StreamMsgFormat format;
+        StreamMsgInfo info;
         StreamMsgCapabilities capabilities;
         StreamMsgCursorSet cursor_set;
         StreamMsgCursorMove cursor_move;
@@ -64,8 +65,8 @@ static void char_device_set_state(RedCharDevice *char_dev, int state);
 typedef bool StreamMsgHandler(StreamDevice *dev, SpiceCharDeviceInstance *sin)
     SPICE_GNUC_WARN_UNUSED_RESULT;
 
-static StreamMsgHandler handle_msg_format, handle_msg_data, handle_msg_cursor_set,
-    handle_msg_cursor_move, handle_msg_capabilities;
+static StreamMsgHandler handle_msg_format, handle_msg_info,
+    handle_msg_data, handle_msg_cursor_set, handle_msg_cursor_move, handle_msg_capabilities;
 
 static bool handle_msg_invalid(StreamDevice *dev, SpiceCharDeviceInstance *sin,
                                const char *error_msg) SPICE_GNUC_WARN_UNUSED_RESULT;
@@ -166,6 +167,13 @@ stream_device_partial_read(StreamDevice *dev, SpiceCharDeviceInstance *sin)
     case STREAM_TYPE_CAPABILITIES:
         handled = handle_msg_capabilities(dev, sin);
         break;
+    case STREAM_TYPE_INFO:
+        if (dev->hdr.size != sizeof(StreamMsgInfo)) {
+            handled = handle_msg_invalid(dev, sin, "Wrong size for StreamMsgInfo");
+        } else {
+            handled = handle_msg_info(dev, sin);
+        }
+        break;
     default:
         handled = handle_msg_invalid(dev, sin, "Invalid message type");
         break;
@@ -271,6 +279,34 @@ handle_msg_format(StreamDevice *dev, SpiceCharDeviceInstance *sin)
     return true;
 }
 
+static bool
+handle_msg_info(StreamDevice *dev, SpiceCharDeviceInstance *sin)
+{
+    SpiceCharDeviceInterface *sif = spice_char_device_get_interface(sin);
+
+    if (spice_extra_checks) {
+        spice_assert(dev->hdr_pos >= sizeof(StreamDevHeader));
+        spice_assert(dev->hdr.type == STREAM_TYPE_INFO);
+    }
+
+    int n = sif->read(sin, dev->msg->buf + dev->msg_pos, sizeof(StreamMsgInfo) - dev->msg_pos);
+    if (n < 0) {
+        return handle_msg_invalid(dev, sin, NULL);
+    }
+
+    dev->msg_pos += n;
+
+    if (dev->msg_pos < sizeof(StreamMsgInfo)) {
+        return false;
+    }
+
+    dev->msg->info.guest_output_id = GUINT32_FROM_LE(dev->msg->info.guest_output_id);
+
+    stream_channel_handle_stream_info(dev->stream_channel, &dev->msg->info);
+
+    return true;
+}
+
 static bool
 handle_msg_capabilities(StreamDevice *dev, SpiceCharDeviceInstance *sin)
 {
diff --git a/server/stream-channel.c b/server/stream-channel.c
index 2521d4dd..c9ebe6be 100644
--- a/server/stream-channel.c
+++ b/server/stream-channel.c
@@ -514,6 +514,17 @@ stream_channel_change_format(StreamChannel *channel, const StreamMsgFormat *fmt)
     red_channel_pipes_add_type(red_channel, RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT);
 }
 
+void
+stream_channel_handle_stream_info(StreamChannel *channel, const StreamMsgInfo *info)
+{
+    RedsState *reds = red_channel_get_server(RED_CHANNEL(channel));
+
+    uint32_t channel_id;
+    g_object_get(channel, "id", &channel_id, NULL);
+
+    reds_store_monitor_guest_output_id(reds, channel_id, 0 /*monitor_id*/, info->guest_output_id);
+}
+
 static inline void
 stream_channel_update_queue_stat(StreamChannel *channel,
                                  int32_t num_diff, int32_t size_diff)
diff --git a/server/stream-channel.h b/server/stream-channel.h
index e8bec80b..83c73012 100644
--- a/server/stream-channel.h
+++ b/server/stream-channel.h
@@ -60,6 +60,7 @@ struct StreamMsgStartStop;
 
 void stream_channel_change_format(StreamChannel *channel,
                                   const struct StreamMsgFormat *fmt);
+void stream_channel_handle_stream_info(StreamChannel *channel, const struct StreamMsgInfo *info);
 void stream_channel_send_data(StreamChannel *channel,
                               const void *data, size_t size,
                               uint32_t mm_time);
diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index f1707d2f..26fdb8d4 100644
--- a/server/tests/test-stream-device.c
+++ b/server/tests/test-stream-device.c
@@ -203,6 +203,10 @@ void stream_channel_change_format(StreamChannel *channel,
 {
 }
 
+void stream_channel_handle_stream_info(StreamChannel *channel, const StreamMsgInfo *info)
+{
+}
+
 void stream_channel_send_data(StreamChannel *channel,
                               const void *data, size_t size,
                               uint32_t mm_time)
-- 
2.18.0



More information about the Spice-devel mailing list