[Spice-devel] [PATCH spice-streaming-agent 7/8] Send the GraphicsDeviceInfo to the server
Lukáš Hrázký
lhrazky at redhat.com
Tue Jan 8 15:28:46 UTC 2019
Adds serialization of the GraphicsDeviceInfo message and sends it to the
server when it starts to stream.
Signed-off-by: Lukáš Hrázký <lhrazky at redhat.com>
---
src/spice-streaming-agent.cpp | 54 +++++++++++++++++++++++++++++------
1 file changed, 45 insertions(+), 9 deletions(-)
diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 3024d98..f3637d3 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -31,6 +31,7 @@
#include <poll.h>
#include <syslog.h>
#include <signal.h>
+#include <algorithm>
#include <exception>
#include <stdexcept>
#include <memory>
@@ -93,6 +94,33 @@ public:
}
};
+class DeviceDisplayInfoMessage : public OutboundMessage<StreamMsgDeviceDisplayInfo, DeviceDisplayInfoMessage, STREAM_TYPE_DEVICE_DISPLAY_INFO>
+{
+public:
+ DeviceDisplayInfoMessage(const DeviceDisplayInfo &info) : OutboundMessage(info) {}
+
+ static size_t size(const DeviceDisplayInfo &info)
+ {
+ return sizeof(PayloadType) + std::min(info.device_address.length(), 255lu) + 1;
+ }
+
+ void write_message_body(StreamPort &stream_port, const DeviceDisplayInfo &info)
+ {
+ std::string device_address = info.device_address;
+ if (device_address.length() > 255) {
+ syslog(LOG_WARNING,
+ "device address of display id %u is longer than 255 bytes, trimming.", info.id);
+ device_address = device_address.substr(0, 255);
+ }
+ StreamMsgDeviceDisplayInfo strm_msg_info{};
+ strm_msg_info.id = info.id;
+ strm_msg_info.device_display_id = info.device_display_id;
+ strm_msg_info.device_address_len = device_address.length() + 1;
+ stream_port.write(&strm_msg_info, sizeof(strm_msg_info));
+ stream_port.write(device_address.c_str(), device_address.length() + 1);
+ }
+};
+
static bool streaming_requested = false;
static bool quit_requested = false;
static std::set<SpiceVideoCodecType> client_codecs;
@@ -217,17 +245,25 @@ do_capture(StreamPort &stream_port, FrameLog &frame_log)
throw std::runtime_error("cannot find a suitable capture system");
}
+ std::vector<DeviceDisplayInfo> display_info;
try {
- std::vector<DeviceDisplayInfo> display_info = capture->get_device_display_info();
- syslog(LOG_DEBUG, "Got device info of %lu devices from the plugin", display_info.size());
- for (const auto &info : display_info) {
- syslog(LOG_DEBUG, " id %u: device address %s, device display id: %u",
- info.id,
- info.device_address.c_str(),
- info.device_display_id);
- }
+ display_info = capture->get_device_display_info();
} catch (const Error &e) {
- syslog(LOG_ERR, "Error while getting device info: %s", e.what());
+ syslog(LOG_ERR, "Error while getting device display info: %s", e.what());
+ }
+
+ syslog(LOG_DEBUG, "Got device info of %lu devices from the plugin", display_info.size());
+ for (const auto &info : display_info) {
+ syslog(LOG_DEBUG, " id %u: device address %s, device display id: %u",
+ info.id,
+ info.device_address.c_str(),
+ info.device_display_id);
+ }
+
+ if (display_info.size() > 0) {
+ stream_port.send<DeviceDisplayInfoMessage>(display_info[0]);
+ } else {
+ syslog(LOG_ERR, "Empty device display info from the plugin");
}
while (!quit_requested && streaming_requested) {
--
2.20.1
More information about the Spice-devel
mailing list