From: Marc-André Lureau <marcandre.lureau(a)redhat.com>
Helpers to start the qemu-rdp server and set it up.
Signed-off-by: Marc-André Lureau <marcandre.lureau(a)redhat.com>
---
po/POTFILES | 1 +
src/qemu/meson.build | 1 +
src/qemu/qemu_domain.c | 1 +
src/qemu/qemu_domain.h | 2 +
src/qemu/qemu_rdp.c | 405 +++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_rdp.h | 71 ++++++++
6 files changed, 481 insertions(+)
create mode 100644 src/qemu/qemu_rdp.c
create mode 100644 src/qemu/qemu_rdp.h
diff --git a/src/qemu/qemu_rdp.c b/src/qemu/qemu_rdp.c
new file mode 100644
index 0000000000..e881b74ee3
--- /dev/null
+++ b/src/qemu/qemu_rdp.c
@@ -0,0 +1,405 @@
+/*
+ * qemu_rdp.c: QEMU Rdp support
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <gio/gio.h>
+
+#include "qemu_dbus.h"
+#include "qemu_extdevice.h"
+#include "qemu_security.h"
+#include "qemu_rdp.h"
+#include "virenum.h"
+#include "virerror.h"
+#include "virjson.h"
+#include "virlog.h"
+#include "virpidfile.h"
+#include "virutil.h"
+#include "virgdbus.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+VIR_LOG_INIT("qemu.rdp");
+
+VIR_ENUM_IMPL(qemuRdpFeature,
+ QEMU_RDP_FEATURE_LAST,
+ "",
+ "dbus-address",
+ "remotefx"
+);
+
+#define ORG_QEMUDISPLAY_RDP "org.QemuDisplay.RDP"
+#define ORG_QEMUDISPLAY_RDP_PATH "/org/qemu_display/rdp"
+#define ORG_QEMUDISPLAY_RDP_IFACE "org.QemuDisplay.RDP"
+
+
+void
+qemuRdpFree(qemuRdp *rdp)
+{
+ if (!rdp)
+ return;
+
+ virBitmapFree(rdp->features);
+ g_free(rdp);
+}
+
+
+void
+qemuRdpSetFeature(qemuRdp *rdp,
+ qemuRdpFeature feature)
+{
+ ignore_value(virBitmapSetBit(rdp->features, feature));
+}
+
+
+bool
+qemuRdpHasFeature(const qemuRdp *rdp,
+ qemuRdpFeature feature)
+{
+ return virBitmapIsBitSet(rdp->features, feature);
+}
+
+
+qemuRdp *
+qemuRdpNew(void)
+{
+ g_autoptr(qemuRdp) rdp = g_new0(qemuRdp, 1);
+
+ rdp->features = virBitmapNew(QEMU_RDP_FEATURE_LAST);
+ rdp->pid = -1;
+
+ return g_steal_pointer(&rdp);
+}
+
+
+qemuRdp *
+qemuRdpNewForHelper(const char *helper)
+{
+ g_autoptr(qemuRdp) rdp = NULL;
+ g_autoptr(virCommand) cmd = NULL;
+ g_autofree char *output = NULL;
+ g_autoptr(virJSONValue) doc = NULL;
+ virJSONValue *featuresJSON;
+ g_autofree char *helperPath = NULL;
+ size_t i, nfeatures;
+
+ helperPath = virFindFileInPath(helper);
+ if (!helperPath) {
+ virReportSystemError(errno,
+ _("'%1$s' is not a suitable qemu-rdp helper
name"),
+ helper);
+ return NULL;
+ }
+
+ rdp = qemuRdpNew();
+ cmd = virCommandNewArgList(helperPath, "--print-capabilities", NULL);
+ virCommandSetOutputBuffer(cmd, &output);
+ if (virCommandRun(cmd, NULL) < 0)
+ return NULL;
+
+ if (!(doc = virJSONValueFromString(output)) ||
+ !(featuresJSON = virJSONValueObjectGetArray(doc, "features"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unable to parse json capabilities '%1$s'"),
It feels to me like this needs a "from" or "for" in order to
disambiguate the meaning of the string, just:
s/capabilities/capabilities for/
s/capabilities/capabilities from/
would be sufficient.