[Spice-devel] [PATCH spice-gtk v2] build-sys: remove the spice-controller library
Victor Toso
victortoso at redhat.com
Tue Aug 1 10:30:45 UTC 2017
Hi,
On Tue, Aug 01, 2017 at 11:16:27AM +0100, marcandre.lureau at redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau at redhat.com>
>
> The spice-controller was a small library to let NPAPI browser plugins
> communicate with the spice client. Due to usage of vala, the library
> could not promise ABI stability, and was also considerer a pretty
> poor implementation.
>
> Furthermore, major browser vendors began to phase out NPAPI support in
> 2013, and some would like to see it gone by the end of this
> year (realistically, it may not happen though).
>
> As an alternative, remote-viewer (the first class Spice client)
> learned to connect with a file of mime type application/x-virt-viewer,
> as early as February 2013 with v0.5.5. I also proposed a DBus
> controller, and a simpler way to pass connection details via stdin.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
Considering that we had no further comments on [0]
Acked-by: Victor Toso <victortoso at redhat.com>
[0] https://lists.freedesktop.org/archives/spice-devel/2017-June/038226.html
> ---
> Makefile.am | 4 -
> configure.ac | 9 -
> data/Makefile.am | 4 -
> data/org.spicespace.spicy.json | 2 +-
> data/spice-protocol.vapi | 210 -----------------
> doc/reference/Makefile.am | 1 -
> spice-controller.pc.in | 12 -
> src/Makefile.am | 4 -
> src/controller/Makefile.am | 103 ---------
> src/controller/controller.vala | 286 -----------------------
> src/controller/custom.h | 22 --
> src/controller/custom.vapi | 28 ---
> src/controller/dump.c | 115 ----------
> src/controller/foreign-menu.vala | 197 ----------------
> src/controller/gio-windows-2.0.vapi | 30 ---
> src/controller/menu.vala | 108 ---------
> src/controller/namedpipe.c | 270 ----------------------
> src/controller/namedpipe.h | 59 -----
> src/controller/namedpipeconnection.c | 245 --------------------
> src/controller/namedpipeconnection.h | 56 -----
> src/controller/namedpipelistener.c | 330 ---------------------------
> src/controller/namedpipelistener.h | 70 ------
> src/controller/spice-controller-listener.c | 159 -------------
> src/controller/spice-controller-listener.h | 47 ----
> src/controller/spice-foreign-menu-listener.c | 161 -------------
> src/controller/spice-foreign-menu-listener.h | 47 ----
> src/controller/test.c | 289 -----------------------
> src/controller/util.vala | 42 ----
> src/controller/win32-util.c | 161 -------------
> src/controller/win32-util.h | 30 ---
> 30 files changed, 1 insertion(+), 3100 deletions(-)
> delete mode 100644 data/spice-protocol.vapi
> delete mode 100644 spice-controller.pc.in
> delete mode 100644 src/controller/Makefile.am
> delete mode 100644 src/controller/controller.vala
> delete mode 100644 src/controller/custom.h
> delete mode 100644 src/controller/custom.vapi
> delete mode 100644 src/controller/dump.c
> delete mode 100644 src/controller/foreign-menu.vala
> delete mode 100644 src/controller/gio-windows-2.0.vapi
> delete mode 100644 src/controller/menu.vala
> delete mode 100644 src/controller/namedpipe.c
> delete mode 100644 src/controller/namedpipe.h
> delete mode 100644 src/controller/namedpipeconnection.c
> delete mode 100644 src/controller/namedpipeconnection.h
> delete mode 100644 src/controller/namedpipelistener.c
> delete mode 100644 src/controller/namedpipelistener.h
> delete mode 100644 src/controller/spice-controller-listener.c
> delete mode 100644 src/controller/spice-controller-listener.h
> delete mode 100644 src/controller/spice-foreign-menu-listener.c
> delete mode 100644 src/controller/spice-foreign-menu-listener.h
> delete mode 100644 src/controller/test.c
> delete mode 100644 src/controller/util.vala
> delete mode 100644 src/controller/win32-util.c
> delete mode 100644 src/controller/win32-util.h
>
> diff --git a/Makefile.am b/Makefile.am
> index ccb81aa..8717cbc 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -22,10 +22,6 @@ if WITH_GTK
> pkgconfig_DATA += spice-client-gtk-3.0.pc
> endif
>
> -if WITH_CONTROLLER
> -pkgconfig_DATA += spice-controller.pc
> -endif
> -
> DISTCLEANFILES = $(pkgconfig_DATA)
>
> EXTRA_DIST = \
> diff --git a/configure.ac b/configure.ac
> index f915d81..4a4e8a6 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -523,13 +523,6 @@ m4_ifdef([GOBJECT_INTROSPECTION_CHECK],[
> ])
> AM_CONDITIONAL([G_IR_SCANNER_SYMBOL_PREFIX], [test "x$has_symbol_prefix" = "xyes"])
>
> -AC_ARG_ENABLE([controller],
> - AS_HELP_STRING([--enable-controller], [Enable controller build @<:@default=yes@:>@]),
> - [],
> - enable_controller="yes")
> -
> -AM_CONDITIONAL(WITH_CONTROLLER, [test "x$enable_controller" != "xno"])
> -
> AC_ARG_ENABLE([vala],
> AS_HELP_STRING([--enable-vala], [Check for vala requirements @<:@default=no@:>@]),
> [],
> @@ -604,12 +597,10 @@ AC_OUTPUT([
> Makefile
> spice-client-glib-2.0.pc
> spice-client-gtk-3.0.pc
> -spice-controller.pc
> data/Makefile
> po/Makefile.in
> src/Makefile
> src/spice-version.h
> -src/controller/Makefile
> tools/Makefile
> doc/Makefile
> doc/reference/Makefile
> diff --git a/data/Makefile.am b/data/Makefile.am
> index 06592de..59e90f9 100644
> --- a/data/Makefile.am
> +++ b/data/Makefile.am
> @@ -1,13 +1,9 @@
> NULL=
>
> EXTRA_DIST = \
> - spice-protocol.vapi \
> org.spice-space.lowlevelusbaccess.policy \
> $(NULL)
>
> -vapidir = $(VAPIDIR)
> -vapi_DATA = spice-protocol.vapi
> -
> policydir = $(POLICYDIR)
> policy_DATA = org.spice-space.lowlevelusbaccess.policy
>
> diff --git a/data/org.spicespace.spicy.json b/data/org.spicespace.spicy.json
> index 1e03bf9..064b9a6 100644
> --- a/data/org.spicespace.spicy.json
> +++ b/data/org.spicespace.spicy.json
> @@ -58,7 +58,7 @@
> "PYTHONPATH": "/app"
> }
> },
> - "config-opts": [ "--disable-controller", "--disable-vala",
> + "config-opts": [ "--disable-vala",
> "--disable-gtk-doc", "--enable-python-checks" ],
> "sources": [
> {
> diff --git a/data/spice-protocol.vapi b/data/spice-protocol.vapi
> deleted file mode 100644
> index cca03ed..0000000
> --- a/data/spice-protocol.vapi
> +++ /dev/null
> @@ -1,210 +0,0 @@
> -namespace SpiceProtocol {
> - [CCode (cprefix = "Controller", cheader_filename = "spice/controller_prot.h")]
> - namespace Controller {
> - [CCode (cname = "CONTROLLER_MAGIC")]
> - public const uint32 MAGIC;
> - [CCode (cname = "CONTROLLER_VERSION")]
> - public const int VERSION;
> -
> - [Compact]
> - public struct InitHeader {
> - uint32 magic;
> - uint32 version;
> - uint32 size;
> - }
> -
> - [Compact]
> - public struct Init {
> - InitHeader base;
> - uint64 credentials;
> - uint32 flags;
> - }
> -
> - [CCode (cprefix = "CONTROLLER_FLAG_")]
> - [Flags]
> - public enum Flag {
> - EXCLUSIVE,
> - }
> -
> - [Compact]
> - public struct Msg {
> - uint32 id;
> - uint32 size;
> - }
> -
> - [CCode (cprefix = "CONTROLLER_")]
> - public enum MsgId {
> - //external app -> spice client
> - HOST,
> - PORT,
> - SPORT,
> - PASSWORD,
> -
> - SECURE_CHANNELS,
> - DISABLE_CHANNELS,
> -
> - TLS_CIPHERS,
> - CA_FILE,
> - HOST_SUBJECT,
> -
> - FULL_SCREEN,
> - SET_TITLE,
> -
> - CREATE_MENU,
> - DELETE_MENU,
> -
> - HOTKEYS,
> - SEND_CAD,
> -
> - CONNECT,
> - SHOW,
> - HIDE,
> -
> - ENABLE_SMARTCARD,
> -
> - ENABLE_USB,
> - ENABLE_USB_AUTOSHARE,
> - USB_FILTER,
> -
> - PROXY,
> -
> - //spice client -> external app
> - MENU_ITEM_CLICK,
> -
> - COLOR_DEPTH,
> - DISABLE_EFFECTS,
> - }
> -
> - [CCode (cname = "unsigned int", cprefix = "CONTROLLER_", has_type_id = false)]
> - [Flags]
> - public enum Display {
> - SET_FULL_SCREEN,
> - AUTO_DISPLAY_RES,
> - }
> -
> - [Compact]
> - [CCode (cname = "ControllerValue")]
> - public struct MsgValue: Msg {
> - Msg base;
> - uint32 value;
> - }
> -
> - [Compact]
> - [CCode (cname = "ControllerData")]
> - public struct MsgData {
> - Msg base;
> - uint8 data[0];
> - }
> -
> - [CCode (cname = "CONTROLLER_MENU_ITEM_DELIMITER")]
> - public static string MENU_ITEM_DELIMITER;
> - [CCode (cname = "CONTROLLER_MENU_PARAM_DELIMITER")]
> - public static string MENU_PARAM_DELIMITER;
> -
> - [CCode (cname = "SPICE_MENU_INTERNAL_ID_BASE")]
> - public static int MENU_INTERNAL_ID_BASE;
> - [CCode (cname = "SPICE_MENU_INTERNAL_ID_SHIFT")]
> - public static int MENU_INTERNAL_ID_SHIFT;
> -
> - [CCode (cprefix = "CONTROLLER_MENU_FLAGS_", cname = "unsigned int", has_type_id = false)]
> - [Flags]
> - public enum MenuFlags {
> - SEPARATOR,
> - DISABLED,
> - POPUP,
> - CHECKED,
> - GRAYED,
> - }
> - }
> -
> - [CCode (cprefix = "FrgMenu", cheader_filename = "spice/foreign_menu_prot.h")]
> - namespace ForeignMenu {
> - [CCode (cname = "FOREIGN_MENU_MAGIC")]
> - public const uint32 MAGIC;
> - [CCode (cname = "FOREIGN_MENU_VERSION")]
> - public const int VERSION;
> -
> - [Compact]
> - public struct InitHeader {
> - uint32 magic;
> - uint32 version;
> - uint32 size;
> - }
> -
> - [Compact]
> - [CCode (has_destroy_function = false)]
> - public struct Init {
> - InitHeader base;
> - uint64 credentials;
> - string title; // utf8
> - }
> -
> - [Compact]
> - public struct Msg {
> - uint32 id;
> - uint32 size;
> - }
> -
> - [CCode (cprefix = "FOREIGN_MENU_", cname = "int")]
> - public enum MsgId {
> - //external app -> spice client
> - SET_TITLE,
> - ADD_ITEM,
> - MODIFY_ITEM,
> - REMOVE_ITEM,
> - CLEAR,
> -
> - //spice client -> external app
> - ITEM_EVENT,
> - APP_ACTIVATED,
> - APP_DEACTIVATED,
> - }
> -
> - [Compact]
> - [CCode (cname = "FrgMenuSetTitle")]
> - public struct SetTitle {
> - Msg base;
> - string string; // utf8
> - }
> -
> - [CCode (cprefix = "FOREIGN_MENU_ITEM_TYPE_", cname = "unsigned int", has_type_id = false)]
> - [Flags]
> - public enum MenuFlags {
> - CHECKED,
> - DIM,
> - SEPARATOR
> - }
> -
> - [Compact]
> - [CCode (cname = "FrgMenuAddItem")]
> - public struct AddItem {
> - Msg base;
> - uint32 id;
> - uint32 type;
> - uint32 position;
> - string string; // utf8
> - }
> -
> - [Compact]
> - [CCode (cname = "FrgMenuRmItem")]
> - public struct RmItem {
> - Msg base;
> - uint32 id;
> - }
> -
> - [CCode (cprefix = "FOREIGN_MENU_EVENT_", cname = "int")]
> - public enum EventType {
> - CLICK,
> - CHECKED,
> - UNCHECKED,
> - }
> -
> - [Compact]
> - [CCode (cname = "FrgMenuEvent")]
> - public struct Event {
> - Msg base;
> - uint32 id;
> - uint32 action;
> - }
> - }
> -}
> diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am
> index 999c1dc..c7d09f0 100644
> --- a/doc/reference/Makefile.am
> +++ b/doc/reference/Makefile.am
> @@ -28,7 +28,6 @@ IGNORE_HFILES= \
> channel-usbredir-priv.h \
> client_sw_canvas.h \
> continuation.h \
> - controller \
> coroutine.h \
> decode.h \
> desktop-integration.h \
> diff --git a/spice-controller.pc.in b/spice-controller.pc.in
> deleted file mode 100644
> index 7dfe4b4..0000000
> --- a/spice-controller.pc.in
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -prefix=@prefix@
> -exec_prefix=@exec_prefix@
> -libdir=@libdir@
> -includedir=@includedir@
> -
> -Name: spice-controller
> -Description: SPICE Client controller library
> -Version: @VERSION@
> -
> -Requires: glib-2.0
> -Libs: -L${libdir} -lspice-controller
> -Cflags: -I${includedir}/spice-controller
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 5430d84..4dbc2eb 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -1,10 +1,6 @@
> NULL =
> SUBDIRS =
>
> -if WITH_CONTROLLER
> -SUBDIRS += controller
> -endif
> -
> KEYMAPS = \
> vncdisplaykeymap_xorgevdev2xtkbd.c \
> vncdisplaykeymap_xorgkbd2xtkbd.c \
> diff --git a/src/controller/Makefile.am b/src/controller/Makefile.am
> deleted file mode 100644
> index c68373c..0000000
> --- a/src/controller/Makefile.am
> +++ /dev/null
> @@ -1,103 +0,0 @@
> -NULL =
> -
> -# FIXME: We need to disable the deprecation warnings until valac stops
> -# generating code that uses the deprecated GSimpleAsyncResult class.
> -AM_CPPFLAGS = \
> - -DG_LOG_DOMAIN=\"GSpiceController\" \
> - $(GIO_CFLAGS) \
> - $(COMMON_CFLAGS) \
> - -Wno-deprecated-declarations \
> - $(NULL)
> -
> -# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
> -AM_LDFLAGS = \
> - -no-undefined \
> - $(GIO_LIBS) \
> - $(NULL)
> -
> -AM_VALAFLAGS = \
> - --pkg gio-2.0 \
> - --pkg spice-protocol --vapidir=$(top_srcdir)/data \
> - --pkg custom --vapidir=$(srcdir) \
> - -C \
> - $(NULL)
> -
> -lib_LTLIBRARIES = libspice-controller.la
> -noinst_PROGRAMS = test-controller spice-controller-dump
> -
> -libspice_controller_la_VALASOURCES = \
> - menu.vala \
> - controller.vala \
> - foreign-menu.vala \
> - util.vala \
> - $(NULL)
> -
> -libspice_controller_la_BUILT_SOURCES = \
> - $(libspice_controller_la_VALASOURCES:.vala=.c) \
> - spice-controller.h \
> - $(NULL)
> -
> -BUILT_SOURCES = \
> - $(libspice_controller_la_BUILT_SOURCES) \
> - controller.vala.stamp \
> - $(NULL)
> -
> -libspice_controller_la_SOURCES = \
> - $(libspice_controller_la_BUILT_SOURCES) \
> - custom.h \
> - spice-controller-listener.c \
> - spice-controller-listener.h \
> - spice-foreign-menu-listener.c \
> - spice-foreign-menu-listener.h \
> - $(NULL)
> -
> -if OS_WIN32
> -libspice_controller_la_SOURCES += \
> - namedpipe.c \
> - namedpipe.h \
> - namedpipeconnection.c \
> - namedpipeconnection.h \
> - namedpipelistener.c \
> - namedpipelistener.h \
> - win32-util.c \
> - win32-util.h \
> - $(NULL)
> -endif
> -libspice_controller_la_LDFLAGS = \
> - $(AM_LDFLAGS) \
> - -version-info 0:0:0 \
> - $(NULL)
> -
> -libspice_controllerincludedir = $(includedir)/spice-controller
> -libspice_controllerinclude_HEADERS = \
> - spice-controller.h
> -
> -test_controller_SOURCES = test.c
> -test_controller_LDADD = libspice-controller.la
> -
> -spice_controller_dump_SOURCES = dump.c
> -spice_controller_dump_LDADD = libspice-controller.la
> -
> -controller.vala.stamp: $(libspice_controller_la_VALASOURCES) custom.vapi
> - @if test -z "$(VALAC)"; then \
> - echo "" ; \
> - echo " *** Error: missing valac!" ; \
> - echo " *** You must run autogen.sh or configure --enable-vala" ; \
> - echo "" ; \
> - exit 1 ; \
> - fi
> - $(VALA_V)$(VALAC) $(VALAFLAGS) $(AM_VALAFLAGS) \
> - $(addprefix $(srcdir)/,$(libspice_controller_la_VALASOURCES)) \
> - -H spice-controller.h
> - @touch $@
> -
> -$(libspice_controller_la_BUILT_SOURCES): controller.vala.stamp
> -
> -EXTRA_DIST = \
> - $(libspice_controller_la_VALASOURCES) \
> - controller.vala.stamp \
> - custom.vapi \
> - gio-windows-2.0.vapi \
> - $(NULL)
> -
> --include $(top_srcdir)/git.mk
> diff --git a/src/controller/controller.vala b/src/controller/controller.vala
> deleted file mode 100644
> index 84b4527..0000000
> --- a/src/controller/controller.vala
> +++ /dev/null
> @@ -1,286 +0,0 @@
> -// Copyright (C) 2011 Red Hat, Inc.
> -
> -// 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/>.
> -
> -using GLib;
> -using Custom;
> -using Win32;
> -using Spice;
> -using SpiceProtocol;
> -
> -namespace SpiceCtrl {
> -
> -public errordomain Error {
> - VALUE,
> -}
> -
> -public class Controller: Object {
> - public string host { private set; get; }
> - public uint32 port { private set; get; }
> - public uint32 sport { private set; get; }
> - public string password { private set; get; }
> - public SpiceProtocol.Controller.Display display_flags { private set; get; }
> - public string tls_ciphers { private set; get; }
> - public string host_subject { private set; get; }
> - public string ca_file { private set; get; }
> - public string title { private set; get; }
> - public string hotkeys { private set; get; }
> - public string[] secure_channels { private set; get; }
> - public string[] disable_channels { private set; get; }
> - public SpiceCtrl.Menu? menu { private set; get; }
> - public bool enable_smartcard { private set; get; }
> - public bool send_cad { private set; get; }
> - public string[] disable_effects {private set; get; }
> - public uint32 color_depth {private set; get; }
> - public bool enable_usbredir { private set; get; }
> - public bool enable_usb_autoshare { private set; get; }
> - public string usb_filter { private set; get; }
> - public string proxy { private set; get; }
> -
> - public signal void do_connect ();
> - public signal void show ();
> - public signal void hide ();
> -
> - public signal void client_connected ();
> -
> - public void menu_item_click_msg (int32 item_id) {
> - var msg = SpiceProtocol.Controller.MsgValue ();
> - msg.base.size = (uint32)sizeof (SpiceProtocol.Controller.MsgValue);
> - msg.base.id = SpiceProtocol.Controller.MsgId.MENU_ITEM_CLICK;
> - msg.value = item_id;
> - unowned uint8[] p = ((uint8[])(&msg))[0:msg.base.size];
> - send_msg.begin (p);
> - }
> -
> - public async bool send_msg (uint8[] p) throws GLib.Error {
> - // vala FIXME: pass Controller.Msg instead
> - // vala doesn't keep reference on the struct in async methods
> - // it copies only base, which is not enough to transmit the whole
> - // message.
> - try {
> - if (excl_connection != null) {
> - yield output_stream_write (excl_connection.output_stream, p);
> - } else {
> - foreach (var c in clients)
> - yield output_stream_write (c.output_stream, p);
> - }
> - } catch (GLib.Error e) {
> - warning (e.message);
> - }
> -
> - return true;
> - }
> -
> - private GLib.IOStream? excl_connection;
> - private int nclients;
> - List<IOStream> clients;
> -
> - private bool handle_message (SpiceProtocol.Controller.Msg* msg) {
> - var v = (SpiceProtocol.Controller.MsgValue*)(msg);
> - var d = (SpiceProtocol.Controller.MsgData*)(msg);
> - unowned string str = (string)(&d.data);
> -
> - switch (msg.id) {
> - case SpiceProtocol.Controller.MsgId.HOST:
> - host = str;
> - debug ("got HOST: %s".printf (str));
> - break;
> - case SpiceProtocol.Controller.MsgId.PORT:
> - port = v.value;
> - debug ("got PORT: %u".printf (port));
> - break;
> - case SpiceProtocol.Controller.MsgId.SPORT:
> - sport = v.value;
> - debug ("got SPORT: %u".printf (sport));
> - break;
> - case SpiceProtocol.Controller.MsgId.PASSWORD:
> - password = str;
> - debug ("got PASSWORD");
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.SECURE_CHANNELS:
> - secure_channels = str.split(",");
> - debug ("got SECURE_CHANNELS %s".printf (str));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.DISABLE_CHANNELS:
> - disable_channels = str.split(",");
> - debug ("got DISABLE_CHANNELS %s".printf (str));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.TLS_CIPHERS:
> - tls_ciphers = str;
> - debug ("got TLS_CIPHERS %s".printf (str));
> - break;
> - case SpiceProtocol.Controller.MsgId.CA_FILE:
> - ca_file = str;
> - debug ("got CA_FILE %s".printf (str));
> - break;
> - case SpiceProtocol.Controller.MsgId.HOST_SUBJECT:
> - host_subject = str;
> - debug ("got HOST_SUBJECT %s".printf (str));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.FULL_SCREEN:
> - display_flags = (SpiceProtocol.Controller.Display)v.value;
> - debug ("got FULL_SCREEN 0x%x".printf (v.value));
> - break;
> - case SpiceProtocol.Controller.MsgId.SET_TITLE:
> - title = str;
> - debug ("got TITLE %s".printf (str));
> - break;
> - case SpiceProtocol.Controller.MsgId.ENABLE_SMARTCARD:
> - enable_smartcard = (bool)v.value;
> - debug ("got ENABLE_SMARTCARD 0x%x".printf (v.value));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.CREATE_MENU:
> - menu = new SpiceCtrl.Menu.from_string (str);
> - debug ("got CREATE_MENU %s".printf (str));
> - break;
> - case SpiceProtocol.Controller.MsgId.DELETE_MENU:
> - menu = null;
> - debug ("got DELETE_MENU request");
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.SEND_CAD:
> - send_cad = (bool)v.value;
> - debug ("got SEND_CAD %u".printf (v.value));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.HOTKEYS:
> - hotkeys = str;
> - debug ("got HOTKEYS %s".printf (str));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.COLOR_DEPTH:
> - color_depth = v.value;
> - debug ("got COLOR_DEPTH %u".printf (v.value));
> - break;
> - case SpiceProtocol.Controller.MsgId.DISABLE_EFFECTS:
> - disable_effects = str.split(",");
> - debug ("got DISABLE_EFFECTS %s".printf (str));
> - break;
> -
> - case SpiceProtocol.Controller.MsgId.CONNECT:
> - do_connect ();
> - debug ("got CONNECT request");
> - break;
> - case SpiceProtocol.Controller.MsgId.SHOW:
> - show ();
> - debug ("got SHOW request");
> - break;
> - case SpiceProtocol.Controller.MsgId.HIDE:
> - hide ();
> - debug ("got HIDE request");
> - break;
> - case SpiceProtocol.Controller.MsgId.ENABLE_USB:
> - enable_usbredir = (bool)v.value;
> - debug ("got ENABLE_USB %u".printf (v.value));
> - break;
> - case SpiceProtocol.Controller.MsgId.ENABLE_USB_AUTOSHARE:
> - enable_usb_autoshare = (bool)v.value;
> - debug ("got ENABLE_USB_AUTOSHARE %u".printf (v.value));
> - break;
> - case SpiceProtocol.Controller.MsgId.USB_FILTER:
> - usb_filter = str;
> - debug ("got USB_FILTER %s".printf (str));
> - break;
> - case SpiceProtocol.Controller.MsgId.PROXY:
> - proxy = str;
> - debug ("got PROXY %s".printf (str));
> - break;
> - default:
> - debug ("got unknown msg.id %u".printf (msg.id));
> - warn_if_reached ();
> - return false;
> - }
> - return true;
> - }
> -
> - private async void handle_client (IOStream c) throws GLib.Error {
> - var excl = false;
> -
> - debug ("new socket client, reading init header");
> -
> - var p = new uint8[sizeof(SpiceProtocol.Controller.Init)];
> - var init = (SpiceProtocol.Controller.Init*)p;
> - yield input_stream_read (c.input_stream, p);
> - if (warn_if (init.base.magic != SpiceProtocol.Controller.MAGIC))
> - return;
> - if (warn_if (init.base.version != SpiceProtocol.Controller.VERSION))
> - return;
> - if (warn_if (init.base.size < sizeof (SpiceProtocol.Controller.Init)))
> - return;
> - if (warn_if (init.credentials != 0))
> - return;
> - if (warn_if (excl_connection != null))
> - return;
> -
> - excl = (bool)(init.flags & SpiceProtocol.Controller.Flag.EXCLUSIVE);
> - if (excl) {
> - if (nclients > 1) {
> - warning (@"Can't make the client exclusive, there is already $nclients connected clients");
> - return;
> - }
> - excl_connection = c;
> - }
> -
> - client_connected ();
> -
> - for (;;) {
> - var t = new uint8[sizeof(SpiceProtocol.Controller.Msg)];
> - yield input_stream_read (c.input_stream, t);
> - var msg = (SpiceProtocol.Controller.Msg*)t;
> - debug ("new message " + msg.id.to_string () + "size " + msg.size.to_string ());
> - if (warn_if (msg.size < sizeof (SpiceProtocol.Controller.Msg)))
> - break;
> -
> - if (msg.size > sizeof (SpiceProtocol.Controller.Msg)) {
> - t.resize ((int)msg.size);
> - msg = (SpiceProtocol.Controller.Msg*)t;
> - yield input_stream_read (c.input_stream, t[sizeof(SpiceProtocol.Controller.Msg):msg.size]);
> - }
> -
> - handle_message (msg);
> - }
> -
> - if (excl)
> - excl_connection = null;
> - }
> -
> - public Controller() {
> - }
> -
> - public async void listen (string? addr = null) throws GLib.Error, SpiceCtrl.Error
> - {
> - var listener = ControllerListener.new_listener (addr);
> -
> - for (;;) {
> - var c = yield listener.accept_async ();
> - nclients += 1;
> - clients.append (c);
> - try {
> - yield handle_client (c);
> - } catch (GLib.Error e) {
> - warning (e.message);
> - }
> - c.close ();
> - clients.remove (c);
> - nclients -= 1;
> - }
> - }
> -}
> -
> -} // SpiceCtrl
> diff --git a/src/controller/custom.h b/src/controller/custom.h
> deleted file mode 100644
> index 7f849fc..0000000
> --- a/src/controller/custom.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -#ifndef CUSTOM_H_
> -#define CUSTOM_H_
> -
> -#include <glib.h>
> -
> -static inline gboolean g_warn_if_expr (gboolean condition,
> - const char *pretty_func,
> - const char *expression) {
> - if G_UNLIKELY(condition) {
> - g_log (G_LOG_DOMAIN,
> - G_LOG_LEVEL_CRITICAL,
> - "%s: `%s' condition reached",
> - pretty_func,
> - expression);
> - }
> -
> - return condition;
> -}
> -
> -#define g_warn_if(expr) g_warn_if_expr((expr), __PRETTY_FUNCTION__, #expr)
> -
> -#endif
> diff --git a/src/controller/custom.vapi b/src/controller/custom.vapi
> deleted file mode 100644
> index a12fdec..0000000
> --- a/src/controller/custom.vapi
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -using GLib;
> -
> -namespace Custom {
> -
> - [CCode (cname = "g_warn_if", cheader_filename = "custom.h")]
> - public bool warn_if(bool condition);
> -}
> -
> -namespace Spice {
> -
> - [CCode (cname = "GObject", ref_function = "g_object_ref", unref_function = "g_object_unref", free_function = "")]
> - class ControllerListener {
> - [CCode (cname = "spice_controller_listener_new", cheader_filename = "spice-controller-listener.h")]
> - public static ControllerListener new_listener (string addr) throws GLib.Error;
> -
> - [CCode (cname = "spice_controller_listener_accept_async", cheader_filename = "spice-controller-listener.h")]
> - public async unowned GLib.IOStream accept_async (GLib.Cancellable? cancellable = null, out GLib.Object? source_object = null) throws GLib.Error;
> - }
> -
> - [CCode (cname = "GObject", ref_function = "g_object_ref", unref_function = "g_object_unref", free_function = "")]
> - class ForeignMenuListener {
> - [CCode (cname = "spice_foreign_menu_listener_new", cheader_filename = "spice-foreign-menu-listener.h")]
> - public static ForeignMenuListener new_listener (string addr) throws GLib.Error;
> -
> - [CCode (cname = "spice_foreign_menu_listener_accept_async", cheader_filename = "spice-foreign-menu-listener.h")]
> - public async unowned GLib.IOStream accept_async (GLib.Cancellable? cancellable = null, out GLib.Object? source_object = null) throws GLib.Error;
> - }
> -}
> diff --git a/src/controller/dump.c b/src/controller/dump.c
> deleted file mode 100644
> index b260264..0000000
> --- a/src/controller/dump.c
> +++ /dev/null
> @@ -1,115 +0,0 @@
> -/* Copyright (C) 2011 Red Hat, Inc. */
> -
> -/* 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 <stdio.h>
> -#include <stdint.h>
> -
> -#ifdef WIN32
> -#include <windows.h>
> -#else
> -#include <sys/socket.h>
> -#ifdef HAVE_SYS_TYPES_H
> -#include <sys/types.h>
> -#endif
> -#include <sys/un.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <string.h>
> -#include <errno.h>
> -#endif
> -
> -#include "spice-controller.h"
> -
> -SpiceCtrlController *ctrl = NULL;
> -SpiceCtrlForeignMenu *menu = NULL;
> -GMainLoop *loop = NULL;
> -
> -void signaled (GObject *gobject, const gchar *signal_name)
> -{
> - g_message ("signaled: %s", signal_name);
> -}
> -
> -void notified (GObject *gobject, GParamSpec *pspec,
> - gpointer user_data)
> -{
> - GValue value = { 0, };
> - GValue strvalue = { 0, };
> -
> - g_return_if_fail (gobject != NULL);
> - g_return_if_fail (pspec != NULL);
> -
> - g_value_init (&value, pspec->value_type);
> - g_value_init (&strvalue, G_TYPE_STRING);
> - g_object_get_property (gobject, pspec->name, &value);
> -
> - if (pspec->value_type == G_TYPE_STRV) {
> - gchar** p = (gchar **)g_value_get_boxed (&value);
> - g_message ("notify::%s == ", pspec->name);
> - while (*p)
> - g_message ("%s", *p++);
> - } else if (G_TYPE_IS_OBJECT(pspec->value_type)) {
> - GObject *o = g_value_get_object (&value);
> - g_message ("notify::%s == %s", pspec->name, o ? G_OBJECT_TYPE_NAME (o) : "null");
> - } else {
> - g_value_transform (&value, &strvalue);
> - g_message ("notify::%s = %s", pspec->name, g_value_get_string (&strvalue));
> - }
> -
> - g_value_unset (&value);
> - g_value_unset (&strvalue);
> -}
> -
> -void connect_signals (gpointer obj)
> -{
> - guint i, n_ids = 0;
> - guint *ids = NULL;
> - GType type = G_OBJECT_TYPE (obj);
> -
> - ids = g_signal_list_ids (type, &n_ids);
> - for (i = 0; i < n_ids; i++) {
> - const gchar *name = g_signal_name (ids[i]);
> - g_signal_connect (obj, name, G_CALLBACK (signaled), (gpointer)name);
> - }
> -}
> -
> -int main (int argc, char *argv[])
> -{
> - loop = g_main_loop_new (NULL, FALSE);
> -
> - if (argc > 1 && g_str_equal(argv[1], "--menu")) {
> - menu = spice_ctrl_foreign_menu_new ();
> - g_signal_connect (menu, "notify", G_CALLBACK (notified), NULL);
> - connect_signals (menu);
> -
> - spice_ctrl_foreign_menu_listen (menu, NULL, NULL, NULL);
> - } else {
> - ctrl = spice_ctrl_controller_new ();
> - g_signal_connect (ctrl, "notify", G_CALLBACK (notified), NULL);
> - connect_signals (ctrl);
> -
> - spice_ctrl_controller_listen (ctrl, NULL, NULL, NULL);
> - }
> -
> - g_main_loop_run (loop);
> -
> - if (ctrl != NULL)
> - g_object_unref (ctrl);
> - if (menu != NULL)
> - g_object_unref (menu);
> -
> - return 0;
> -}
> diff --git a/src/controller/foreign-menu.vala b/src/controller/foreign-menu.vala
> deleted file mode 100644
> index 005955a..0000000
> --- a/src/controller/foreign-menu.vala
> +++ /dev/null
> @@ -1,197 +0,0 @@
> -// Copyright (C) 2012 Red Hat, Inc.
> -
> -// 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/>.
> -
> -using Custom;
> -
> -namespace SpiceCtrl {
> -
> -public class ForeignMenu: Object {
> -
> - public Menu menu { get; private set; }
> - public string title { get; private set; }
> -
> - public signal void client_connected ();
> -
> - private int nclients;
> - private List<IOStream> clients;
> -
> - public ForeignMenu() {
> - menu = new Menu ();
> - }
> -
> - public void menu_item_click_msg (int32 item_id) {
> - debug ("clicked id: %d".printf (item_id));
> -
> - var msg = SpiceProtocol.ForeignMenu.Event ();
> - msg.base.size = (uint32)sizeof (SpiceProtocol.ForeignMenu.Event);
> - msg.base.id = SpiceProtocol.ForeignMenu.MsgId.ITEM_EVENT;
> - msg.id = item_id;
> - msg.action = SpiceProtocol.ForeignMenu.EventType.CLICK;
> -
> - unowned uint8[] p = ((uint8[])(&msg))[0:msg.base.size];
> - send_msg.begin (p);
> - }
> -
> - public void menu_item_checked_msg (int32 item_id, bool checked = true) {
> - debug ("%schecked id: %d".printf (checked ? "" : "un", item_id));
> -
> - var msg = SpiceProtocol.ForeignMenu.Event ();
> - msg.base.size = (uint32)sizeof (SpiceProtocol.ForeignMenu.Event);
> - msg.base.id = SpiceProtocol.ForeignMenu.MsgId.ITEM_EVENT;
> - msg.id = item_id;
> - msg.action = checked ?
> - SpiceProtocol.ForeignMenu.EventType.CHECKED :
> - SpiceProtocol.ForeignMenu.EventType.UNCHECKED;
> -
> - unowned uint8[] p = ((uint8[])(&msg))[0:msg.base.size];
> - send_msg.begin (p);
> - }
> -
> - public void app_activated_msg (bool activated = true) {
> - var msg = SpiceProtocol.ForeignMenu.Msg ();
> - msg.size = (uint32)sizeof (SpiceProtocol.ForeignMenu.Event);
> - msg.id = activated ?
> - SpiceProtocol.ForeignMenu.MsgId.APP_ACTIVATED :
> - SpiceProtocol.ForeignMenu.MsgId.APP_DEACTIVATED;
> -
> - unowned uint8[] p = ((uint8[])(&msg))[0:msg.size];
> - send_msg.begin (p);
> - }
> -
> - public async bool send_msg (owned uint8[] p) throws GLib.Error {
> - // vala FIXME: pass Controller.Msg instead
> - // vala doesn't keep reference on the struct in async methods
> - // it copies only base, which is not enough to transmit the whole
> - // message.
> - try {
> - foreach (var c in clients) {
> - yield output_stream_write (c.output_stream, p);
> - }
> - } catch (GLib.Error e) {
> - warning (e.message);
> - }
> -
> - return true;
> - }
> -
> - SpiceProtocol.Controller.MenuFlags get_menu_flags (uint32 type) {
> - SpiceProtocol.Controller.MenuFlags flags = 0;
> -
> - if ((SpiceProtocol.ForeignMenu.MenuFlags.CHECKED & type) != 0)
> - flags |= SpiceProtocol.Controller.MenuFlags.CHECKED;
> - if ((SpiceProtocol.ForeignMenu.MenuFlags.DIM & type) != 0)
> - flags |= SpiceProtocol.Controller.MenuFlags.GRAYED;
> -
> - return flags;
> - }
> -
> - private bool handle_message (SpiceProtocol.ForeignMenu.Msg* msg) {
> - switch (msg.id) {
> - case SpiceProtocol.ForeignMenu.MsgId.SET_TITLE:
> - var t = (SpiceProtocol.ForeignMenu.SetTitle*)(msg);
> - title = t.string;
> - break;
> - case SpiceProtocol.ForeignMenu.MsgId.ADD_ITEM:
> - var i = (SpiceProtocol.ForeignMenu.AddItem*)(msg);
> - debug ("add id:%u type:%u position:%u title:%s", i.id, i.type, i.position, i.string);
> - menu.items.append (new MenuItem ((int)i.id, i.string, get_menu_flags (i.type)));
> - notify_property ("menu");
> - break;
> - case SpiceProtocol.ForeignMenu.MsgId.MODIFY_ITEM:
> - debug ("deprecated: modify item");
> - break;
> - case SpiceProtocol.ForeignMenu.MsgId.REMOVE_ITEM:
> - var i = (SpiceProtocol.ForeignMenu.RmItem*)(msg);
> - debug ("not implemented: remove id:%u".printf (i.id));
> - break;
> - case SpiceProtocol.ForeignMenu.MsgId.CLEAR:
> - menu = new Menu ();
> - break;
> - default:
> - warn_if_reached ();
> - return false;
> - }
> - return true;
> - }
> -
> - private async void handle_client (IOStream c) throws GLib.Error {
> - debug ("new socket client, reading init header");
> -
> - var p = new uint8[sizeof(SpiceProtocol.ForeignMenu.InitHeader)];
> - var header = (SpiceProtocol.ForeignMenu.InitHeader*)p;
> - yield input_stream_read (c.input_stream, p);
> - if (warn_if (header.magic != SpiceProtocol.ForeignMenu.MAGIC))
> - return;
> - if (warn_if (header.version != SpiceProtocol.ForeignMenu.VERSION))
> - return;
> - if (warn_if (header.size < sizeof (SpiceProtocol.ForeignMenu.Init)))
> - return;
> -
> - var cp = new uint8[sizeof(uint64)];
> - yield input_stream_read (c.input_stream, cp);
> - uint64 credentials = *(uint64*)cp;
> - if (warn_if (credentials != 0))
> - return;
> -
> - var title_size = header.size - sizeof(SpiceProtocol.ForeignMenu.Init);
> - var title = new uint8[title_size + 1];
> - yield c.input_stream.read_async (title[0:title_size]);
> - this.title = (string)title;
> -
> - client_connected ();
> -
> - for (;;) {
> - var t = new uint8[sizeof(SpiceProtocol.ForeignMenu.Msg)];
> - yield input_stream_read (c.input_stream, t);
> - var msg = (SpiceProtocol.ForeignMenu.Msg*)t;
> - debug ("new message " + msg.id.to_string () + "size " + msg.size.to_string ());
> -
> - if (warn_if (msg.size < sizeof (SpiceProtocol.ForeignMenu.Msg)))
> - break;
> -
> - if (msg.size > sizeof (SpiceProtocol.ForeignMenu.Msg)) {
> - t.resize ((int)msg.size);
> - msg = (SpiceProtocol.ForeignMenu.Msg*)t;
> -
> - yield input_stream_read (c.input_stream, t[sizeof(SpiceProtocol.ForeignMenu.Msg):msg.size]);
> - }
> -
> - handle_message (msg);
> - }
> -
> - }
> -
> - public async void listen (string? addr = null) throws GLib.Error, SpiceCtrl.Error
> - {
> - var listener = Spice.ForeignMenuListener.new_listener (addr);
> -
> - for (;;) {
> - var c = yield listener.accept_async ();
> - nclients += 1;
> - clients.append (c);
> - try {
> - yield handle_client (c);
> - } catch (GLib.Error e) {
> - warning (e.message);
> - }
> - c.close ();
> - clients.remove (c);
> - nclients -= 1;
> - }
> - }
> -
> -}
> -
> -} // SpiceCtrl
> diff --git a/src/controller/gio-windows-2.0.vapi b/src/controller/gio-windows-2.0.vapi
> deleted file mode 100644
> index a09cfe8..0000000
> --- a/src/controller/gio-windows-2.0.vapi
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/* gio-windows-2.0.vapi generated by vapigen. */
> -/* NOT YET UPSTREAM: https://bugzilla.gnome.org/show_bug.cgi?id=650052 */
> -
> -[CCode (cprefix = "GLib", lower_case_cprefix = "glib_")]
> -namespace GLib {
> - [CCode (cheader_filename = "gio/gwin32inputstream.h")]
> - public class Win32InputStream : GLib.InputStream {
> - public weak GLib.InputStream parent_instance;
> - [CCode (cname = "g_win32_input_stream_new", type = "GInputStream*", has_construct_function = false)]
> - public Win32InputStream (void* handle, bool close_handle);
> - [CCode (cname = "g_win32_input_stream_get_close_handle")]
> - public static bool get_close_handle (GLib.Win32InputStream stream);
> - [CCode (cname = "g_win32_input_stream_get_handle")]
> - public static void* get_handle (GLib.Win32InputStream stream);
> - [CCode (cname = "g_win32_input_stream_set_close_handle")]
> - public static void set_close_handle (GLib.Win32InputStream stream, bool close_handle);
> - }
> - [CCode (cheader_filename = "gio/gwin32inputstream.h")]
> - public class Win32OutputStream : GLib.OutputStream {
> - public weak GLib.OutputStream parent_instance;
> - [CCode (cname = "g_win32_output_stream_new", type = "GOutputStream*", has_construct_function = false)]
> - public Win32OutputStream (void* handle, bool close_handle);
> - [CCode (cname = "g_win32_output_stream_get_close_handle")]
> - public static bool get_close_handle (GLib.Win32OutputStream stream);
> - [CCode (cname = "g_win32_output_stream_get_handle")]
> - public static void* get_handle (GLib.Win32OutputStream stream);
> - [CCode (cname = "g_win32_output_stream_set_close_handle")]
> - public static void set_close_handle (GLib.Win32OutputStream stream, bool close_handle);
> - }
> -}
> diff --git a/src/controller/menu.vala b/src/controller/menu.vala
> deleted file mode 100644
> index 7e8fc16..0000000
> --- a/src/controller/menu.vala
> +++ /dev/null
> @@ -1,108 +0,0 @@
> -// Copyright (C) 2011 Red Hat, Inc.
> -
> -// 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/>.
> -
> -using GLib;
> -using Custom;
> -using SpiceProtocol.Controller;
> -
> -namespace SpiceCtrl {
> -
> -public class MenuItem: Object {
> -
> - public Menu submenu;
> - public int parent_id;
> - public int id;
> - public string text;
> - public string accel;
> - public SpiceProtocol.Controller.MenuFlags flags;
> -
> - public MenuItem (int id, string text, SpiceProtocol.Controller.MenuFlags flags) {
> - this.id = id;
> - this.text = text;
> - this.flags = flags;
> - }
> -
> - public MenuItem.from_string (string str) throws SpiceCtrl.Error {
> - var params = str.split (SpiceProtocol.Controller.MENU_PARAM_DELIMITER);
> - if (warn_if (params.length != 5))
> - throw new SpiceCtrl.Error.VALUE(""); /* Vala: why is it mandatory to give a string? */
> - parent_id = int.parse (params[0]);
> - id = int.parse (params[1]);
> - var textaccel = params[2].split ("\t");
> - text = textaccel[0];
> - if (textaccel.length > 1)
> - accel = textaccel[1];
> - flags = (SpiceProtocol.Controller.MenuFlags)int.parse (params[3]);
> -
> - submenu = new Menu ();
> - }
> -
> - public string to_string () {
> - var sub = submenu.to_string ();
> - var str = @"pid: $parent_id, id: $id, text: \"$text\", flags: $flags";
> - foreach (var l in sub.to_string ().split ("\n")) {
> - if (l == "")
> - continue;
> - str += @"\n $l";
> - }
> - return str;
> - }
> -}
> -
> -public class Menu: Object {
> -
> - public List<MenuItem> items;
> -
> - public Menu? find_id (int id) {
> - if (id == 0)
> - return this;
> -
> - foreach (var item in items) {
> - if (item.id == id)
> - return item.submenu;
> -
> - var menu = item.submenu.find_id (id);
> - if (menu != null)
> - return menu;
> - }
> -
> - return null;
> - }
> -
> - public Menu.from_string (string str) {
> - foreach (var itemstr in str.split (SpiceProtocol.Controller.MENU_ITEM_DELIMITER)) {
> - try {
> - if (itemstr.length == 0)
> - continue;
> - var item = new MenuItem.from_string (itemstr);
> - var parent = find_id (item.parent_id);
> - if (parent == null)
> - throw new SpiceCtrl.Error.VALUE("Invalid parent menu id");
> - parent.items.append (item);
> - } catch (SpiceCtrl.Error e) {
> - warning (e.message);
> - }
> - }
> - }
> -
> - public string to_string () {
> - var str = "";
> - foreach (var i in items)
> - str += @"\n$i";
> - return str;
> - }
> -}
> -
> -} // SpiceCtrl
> diff --git a/src/controller/namedpipe.c b/src/controller/namedpipe.c
> deleted file mode 100644
> index 5312218..0000000
> --- a/src/controller/namedpipe.c
> +++ /dev/null
> @@ -1,270 +0,0 @@
> -/*
> - Copyright (C) 2011 Red Hat, Inc.
> -
> - 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 "namedpipe.h"
> -
> -#include <windows.h>
> -#include <stdio.h>
> -#include <conio.h>
> -#include <tchar.h>
> -
> -static void spice_named_pipe_initable_iface_init (GInitableIface *iface);
> -static gboolean spice_named_pipe_initable_init (GInitable *initable,
> - GCancellable *cancellable,
> - GError **error);
> -
> -G_DEFINE_TYPE_WITH_CODE (SpiceNamedPipe, spice_named_pipe, G_TYPE_OBJECT,
> - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
> - spice_named_pipe_initable_iface_init));
> -
> -enum
> -{
> - PROP_0,
> - PROP_NAME,
> - PROP_HANDLE,
> -};
> -
> -struct _SpiceNamedPipePrivate
> -{
> - gchar * name;
> - GError * construct_error;
> - guint inited : 1;
> - HANDLE handle;
> -};
> -
> -static void
> -spice_named_pipe_finalize (GObject *object)
> -{
> - SpiceNamedPipe *np = SPICE_NAMED_PIPE (object);
> -
> - g_clear_error (&np->priv->construct_error);
> -
> - g_free (np->priv->name);
> - np->priv->name = NULL;
> -
> - if (np->priv->handle)
> - {
> - CloseHandle (np->priv->handle);
> - np->priv->handle = NULL;
> - }
> -
> - if (G_OBJECT_CLASS (spice_named_pipe_parent_class)->finalize)
> - G_OBJECT_CLASS (spice_named_pipe_parent_class)->finalize (object);
> -}
> -
> -#define DEFAULT_PIPE_BUF_SIZE 4096
> -
> -static void
> -spice_named_pipe_constructed (GObject *object)
> -{
> - SpiceNamedPipe *np = SPICE_NAMED_PIPE (object);
> -
> - if (np->priv->handle)
> - /* TODO: find a way to ensure user provided handle is a named
> - pipe, in overlapped mode */
> - goto end;
> -
> - np->priv->handle = CreateNamedPipe (np->priv->name,
> - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
> - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
> - PIPE_UNLIMITED_INSTANCES,
> - DEFAULT_PIPE_BUF_SIZE, DEFAULT_PIPE_BUF_SIZE,
> - 0, NULL);
> -
> - if (np->priv->handle == INVALID_HANDLE_VALUE)
> - {
> - int errsv = GetLastError ();
> - gchar *emsg = g_win32_error_message (errsv);
> -
> - g_set_error (&np->priv->construct_error,
> - G_IO_ERROR,
> - g_io_error_from_win32_error (errsv),
> - "Error CreateNamedPipe(): %s",
> - emsg);
> -
> - g_free (emsg);
> - return;
> - }
> -
> - /* TODO: we could have a client backlog by creating many pipes, the
> - maximum number of outstanding connections.. or we could just let
> - the named_pipe_listener take multiple NamedPipe instances */
> -end:
> - g_assert (np->priv->handle != INVALID_HANDLE_VALUE);
> - return;
> -}
> -
> -static void
> -spice_named_pipe_get_property (GObject *object,
> - guint prop_id,
> - GValue *value,
> - GParamSpec *pspec)
> -{
> - SpiceNamedPipe *np = SPICE_NAMED_PIPE (object);
> -
> - switch (prop_id)
> - {
> - case PROP_NAME:
> - g_value_set_string (value, np->priv->name);
> - break;
> - case PROP_HANDLE:
> - g_value_set_pointer (value, np->priv->handle);
> - break;
> - default:
> - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> - }
> -}
> -
> -static void
> -spice_named_pipe_set_property (GObject *object,
> - guint prop_id,
> - const GValue *value,
> - GParamSpec *pspec)
> -{
> - SpiceNamedPipe *np = SPICE_NAMED_PIPE (object);
> -
> - switch (prop_id)
> - {
> - case PROP_NAME:
> - g_free (np->priv->name);
> - np->priv->name = g_value_dup_string (value);
> - break;
> - case PROP_HANDLE:
> - np->priv->handle = g_value_get_pointer (value);
> - break;
> - default:
> - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> - }
> -}
> -
> -static void
> -spice_named_pipe_class_init (SpiceNamedPipeClass *klass)
> -{
> - GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
> -
> - g_type_class_add_private (klass, sizeof (SpiceNamedPipePrivate));
> -
> - gobject_class->set_property = spice_named_pipe_set_property;
> - gobject_class->get_property = spice_named_pipe_get_property;
> - gobject_class->finalize = spice_named_pipe_finalize;
> - gobject_class->constructed = spice_named_pipe_constructed;
> -
> - g_object_class_install_property (gobject_class, PROP_NAME,
> - g_param_spec_string ("name",
> - "Pipe Name",
> - "The NamedPipe name",
> - NULL,
> - G_PARAM_CONSTRUCT_ONLY |
> - G_PARAM_READWRITE |
> - G_PARAM_STATIC_STRINGS));
> -
> - g_object_class_install_property (gobject_class, PROP_HANDLE,
> - g_param_spec_pointer ("handle",
> - "Pipe handle",
> - "The pipe handle",
> - G_PARAM_CONSTRUCT_ONLY |
> - G_PARAM_READWRITE |
> - G_PARAM_STATIC_STRINGS));
> -}
> -
> -static void
> -spice_named_pipe_init (SpiceNamedPipe *np)
> -{
> - np->priv = G_TYPE_INSTANCE_GET_PRIVATE (np,
> - SPICE_TYPE_NAMED_PIPE,
> - SpiceNamedPipePrivate);
> -}
> -
> -static gboolean
> -spice_named_pipe_initable_init (GInitable *initable,
> - GCancellable *cancellable,
> - GError **error)
> -{
> - SpiceNamedPipe *np;
> -
> - g_return_val_if_fail (SPICE_IS_NAMED_PIPE (initable), FALSE);
> -
> - np = SPICE_NAMED_PIPE (initable);
> -
> - if (cancellable != NULL)
> - {
> - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
> - "Cancellable initialization not supported");
> - return FALSE;
> - }
> -
> - np->priv->inited = TRUE;
> -
> - if (np->priv->construct_error)
> - {
> - if (error)
> - *error = g_error_copy (np->priv->construct_error);
> - return FALSE;
> - }
> -
> -
> - return TRUE;
> -}
> -
> -static void
> -spice_named_pipe_initable_iface_init (GInitableIface *iface)
> -{
> - iface->init = spice_named_pipe_initable_init;
> -}
> -
> -SpiceNamedPipe *
> -spice_named_pipe_new (const gchar *name, GError **error)
> -{
> - return SPICE_NAMED_PIPE (g_initable_new (SPICE_TYPE_NAMED_PIPE,
> - NULL, error,
> - "name", name,
> - NULL));
> -}
> -
> -void *
> -spice_named_pipe_get_handle (SpiceNamedPipe *namedpipe)
> -{
> - g_return_val_if_fail (SPICE_IS_NAMED_PIPE (namedpipe), NULL);
> -
> - return namedpipe->priv->handle;
> -}
> -
> -gboolean
> -spice_named_pipe_close (SpiceNamedPipe *np,
> - GError **error)
> -{
> - BOOL res;
> -
> - g_return_val_if_fail (SPICE_IS_NAMED_PIPE (np), FALSE);
> -
> - res = CloseHandle (np->priv->handle);
> - np->priv->handle = NULL;
> - if (!res)
> - {
> - int errsv = GetLastError ();
> - gchar *emsg = g_win32_error_message (errsv);
> -
> - g_set_error (error, G_IO_ERROR,
> - g_io_error_from_win32_error (errsv),
> - "Error closing handle: %s",
> - emsg);
> - g_free (emsg);
> - return FALSE;
> - }
> -
> - return TRUE;
> -}
> diff --git a/src/controller/namedpipe.h b/src/controller/namedpipe.h
> deleted file mode 100644
> index e0e873b..0000000
> --- a/src/controller/namedpipe.h
> +++ /dev/null
> @@ -1,59 +0,0 @@
> -/*
> - Copyright (C) 2011 Red Hat, Inc.
> -
> - 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/>.
> -*/
> -#ifndef __NAMED_PIPE_H__
> -#define __NAMED_PIPE_H__
> -
> -#include <gio/gio.h>
> -
> -G_BEGIN_DECLS
> -
> -#define SPICE_TYPE_NAMED_PIPE (spice_named_pipe_get_type ())
> -#define SPICE_NAMED_PIPE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
> - SPICE_TYPE_NAMED_PIPE, SpiceNamedPipe))
> -#define SPICE_NAMED_PIPE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \
> - SPICE_TYPE_NAMED_PIPE, SpiceNamedPipeClass))
> -#define SPICE_IS_NAMED_PIPE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \
> - SPICE_TYPE_NAMED_PIPE))
> -#define SPICE_IS_NAMED_PIPE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \
> - SPICE_TYPE_NAMED_PIPE))
> -#define SPICE_NAMED_PIPE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \
> - SPICE_TYPE_NAMED_PIPE, SpiceNamedPipeClass))
> -
> -typedef struct _SpiceNamedPipe SpiceNamedPipe;
> -typedef struct _SpiceNamedPipePrivate SpiceNamedPipePrivate;
> -typedef struct _SpiceNamedPipeClass SpiceNamedPipeClass;
> -
> -struct _SpiceNamedPipeClass
> -{
> - GObjectClass parent_class;
> -};
> -
> -struct _SpiceNamedPipe
> -{
> - GObject parent_instance;
> - SpiceNamedPipePrivate *priv;
> -};
> -
> -GType spice_named_pipe_get_type (void) G_GNUC_CONST;
> -
> -SpiceNamedPipe * spice_named_pipe_new (const gchar *name, GError **error);
> -void * spice_named_pipe_get_handle(SpiceNamedPipe *namedpipe);
> -gboolean spice_named_pipe_close (SpiceNamedPipe *namedpipe,
> - GError **error);
> -G_END_DECLS
> -
> -#endif /* __NAMED_PIPE_H__ */
> diff --git a/src/controller/namedpipeconnection.c b/src/controller/namedpipeconnection.c
> deleted file mode 100644
> index 3173b61..0000000
> --- a/src/controller/namedpipeconnection.c
> +++ /dev/null
> @@ -1,245 +0,0 @@
> -/*
> - Copyright (C) 2011 Red Hat, Inc.
> -
> - 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 "namedpipeconnection.h"
> -
> -#include <windows.h>
> -#include <stdio.h>
> -#include <conio.h>
> -#include <tchar.h>
> -
> -#include <gio/gwin32inputstream.h>
> -#include <gio/gwin32outputstream.h>
> -
> -G_DEFINE_TYPE (SpiceNamedPipeConnection, spice_named_pipe_connection,
> - G_TYPE_IO_STREAM)
> -
> -enum
> -{
> - PROP_0,
> - PROP_NAMED_PIPE,
> -};
> -
> -struct _SpiceNamedPipeConnectionPrivate
> -{
> - GInputStream *input_stream;
> - GOutputStream *output_stream;
> - SpiceNamedPipe *namedpipe;
> - gboolean in_dispose;
> -};
> -
> -static void
> -spice_named_pipe_connection_init (SpiceNamedPipeConnection *connection)
> -{
> - connection->priv = G_TYPE_INSTANCE_GET_PRIVATE (connection,
> - SPICE_TYPE_NAMED_PIPE_CONNECTION,
> - SpiceNamedPipeConnectionPrivate);
> -}
> -
> -static void
> -spice_named_pipe_connection_get_property (GObject *object,
> - guint prop_id,
> - GValue *value,
> - GParamSpec *pspec)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (object);
> -
> - switch (prop_id)
> - {
> - case PROP_NAMED_PIPE:
> - g_return_if_fail (c->priv->namedpipe == NULL);
> - g_value_set_object (value, c->priv->namedpipe);
> - break;
> - default:
> - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> - }
> -}
> -
> -static void
> -spice_named_pipe_connection_set_property (GObject *object,
> - guint prop_id,
> - const GValue *value,
> - GParamSpec *pspec)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (object);
> -
> - switch (prop_id)
> - {
> - case PROP_NAMED_PIPE:
> - c->priv->namedpipe = g_value_get_object (value);
> - break;
> - default:
> - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> - }
> -}
> -
> -static GInputStream *
> -spice_named_pipe_connection_get_input_stream (GIOStream *io_stream)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (io_stream);
> - HANDLE h = spice_named_pipe_get_handle (c->priv->namedpipe);
> -
> - g_return_val_if_fail (h != NULL, NULL);
> -
> - if (c->priv->input_stream == NULL)
> - c->priv->input_stream = g_win32_input_stream_new (h, FALSE);
> -
> - return c->priv->input_stream;
> -}
> -
> -static GOutputStream *
> -spice_named_pipe_connection_get_output_stream (GIOStream *io_stream)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (io_stream);
> - HANDLE h = spice_named_pipe_get_handle (c->priv->namedpipe);
> -
> - g_return_val_if_fail (h != NULL, NULL);
> -
> - if (c->priv->output_stream == NULL)
> - c->priv->output_stream = g_win32_output_stream_new (h, FALSE);
> -
> - return c->priv->output_stream;
> -}
> -
> -static void
> -spice_named_pipe_connection_dispose (GObject *object)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (object);
> -
> - c->priv->in_dispose = TRUE;
> -
> - if (G_OBJECT_CLASS (spice_named_pipe_connection_parent_class)->dispose)
> - G_OBJECT_CLASS (spice_named_pipe_connection_parent_class)->dispose (object);
> -
> - c->priv->in_dispose = FALSE;
> -}
> -
> -static void
> -spice_named_pipe_connection_finalize (GObject *object)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (object);
> -
> - if (c->priv->output_stream)
> - {
> - g_object_unref (c->priv->output_stream);
> - c->priv->output_stream = NULL;
> - }
> -
> - if (c->priv->input_stream)
> - {
> - g_object_unref (c->priv->input_stream);
> - c->priv->input_stream = NULL;
> - }
> -
> - g_object_unref (c->priv->namedpipe);
> -
> - if (G_OBJECT_CLASS (spice_named_pipe_connection_parent_class)->finalize)
> - G_OBJECT_CLASS (spice_named_pipe_connection_parent_class)->finalize (object);
> -}
> -
> -static gboolean
> -spice_named_pipe_connection_close (GIOStream *stream,
> - GCancellable *cancellable,
> - GError **error)
> -{
> - SpiceNamedPipeConnection *c = SPICE_NAMED_PIPE_CONNECTION (stream);
> -
> - if (c->priv->output_stream)
> - g_output_stream_close (c->priv->output_stream, cancellable, NULL);
> - if (c->priv->input_stream)
> - g_input_stream_close (c->priv->input_stream, cancellable, NULL);
> -
> - /* Don't close the underlying socket if this is being called
> - * as part of dispose(); when destroying the GSocketConnection,
> - * we only want to close the socket if we're holding the last
> - * reference on it, and in that case it will close itself when
> - * we unref namedpipe in finalize().
> - */
> - if (c->priv->in_dispose)
> - return TRUE;
> -
> - return spice_named_pipe_close (c->priv->namedpipe, error);
> -}
> -
> -static void
> -spice_named_pipe_connection_close_async (GIOStream *stream,
> - int io_priority,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data)
> -{
> - GSimpleAsyncResult *res;
> - GIOStreamClass *class;
> - GError *error;
> -
> - class = G_IO_STREAM_GET_CLASS (stream);
> -
> - /* namedpipe close is not blocking, just do it! */
> - error = NULL;
> - if (class->close_fn &&
> - !class->close_fn (stream, cancellable, &error))
> - {
> - g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
> - callback, user_data,
> - error);
> - return;
> - }
> -
> - res = g_simple_async_result_new (G_OBJECT (stream),
> - callback,
> - user_data,
> - spice_named_pipe_connection_close_async);
> - g_simple_async_result_complete_in_idle (res);
> - g_object_unref (res);
> -}
> -
> -static gboolean
> -spice_named_pipe_connection_close_finish (GIOStream *stream,
> - GAsyncResult *result,
> - GError **error)
> -{
> - return TRUE;
> -}
> -
> -static void
> -spice_named_pipe_connection_class_init (SpiceNamedPipeConnectionClass *klass)
> -{
> - GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
> - GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass);
> -
> - g_type_class_add_private (klass, sizeof (SpiceNamedPipeConnectionPrivate));
> -
> - gobject_class->set_property = spice_named_pipe_connection_set_property;
> - gobject_class->get_property = spice_named_pipe_connection_get_property;
> - gobject_class->dispose = spice_named_pipe_connection_dispose;
> - gobject_class->finalize = spice_named_pipe_connection_finalize;
> -
> - stream_class->get_input_stream = spice_named_pipe_connection_get_input_stream;
> - stream_class->get_output_stream = spice_named_pipe_connection_get_output_stream;
> - stream_class->close_fn = spice_named_pipe_connection_close;
> - stream_class->close_async = spice_named_pipe_connection_close_async;
> - stream_class->close_finish = spice_named_pipe_connection_close_finish;
> -
> - g_object_class_install_property (gobject_class, PROP_NAMED_PIPE,
> - g_param_spec_object ("namedpipe",
> - "NamedPipe",
> - "The associated NamedPipe",
> - SPICE_TYPE_NAMED_PIPE,
> - G_PARAM_CONSTRUCT_ONLY |
> - G_PARAM_READWRITE |
> - G_PARAM_STATIC_STRINGS));
> -}
> diff --git a/src/controller/namedpipeconnection.h b/src/controller/namedpipeconnection.h
> deleted file mode 100644
> index 86f0be6..0000000
> --- a/src/controller/namedpipeconnection.h
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/*
> - Copyright (C) 2011 Red Hat, Inc.
> -
> - 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/>.
> -*/
> -#ifndef __NAMED_PIPE_CONNECTION_H__
> -#define __NAMED_PIPE_CONNECTION_H__
> -
> -#include <gio/gio.h>
> -#include "namedpipe.h"
> -
> -G_BEGIN_DECLS
> -
> -#define SPICE_TYPE_NAMED_PIPE_CONNECTION (spice_named_pipe_connection_get_type ())
> -#define SPICE_NAMED_PIPE_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
> - SPICE_TYPE_NAMED_PIPE_CONNECTION, SpiceNamedPipeConnection))
> -#define SPICE_NAMED_PIPE_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \
> - SPICE_TYPE_NAMED_PIPE_CONNECTION, SpiceNamedPipeConnectionClass))
> -#define SPICE_IS_NAMED_PIPE_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \
> - SPICE_TYPE_NAMED_PIPE_CONNECTION))
> -#define SPICE_IS_NAMED_PIPE_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \
> - SPICE_TYPE_NAMED_PIPE_CONNECTION))
> -#define SPICE_NAMED_PIPE_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \
> - SPICE_TYPE_NAMED_PIPE_CONNECTION, SpiceNamedPipeConnectionClass))
> -
> -typedef struct _SpiceNamedPipeConnection SpiceNamedPipeConnection;
> -typedef struct _SpiceNamedPipeConnectionPrivate SpiceNamedPipeConnectionPrivate;
> -typedef struct _SpiceNamedPipeConnectionClass SpiceNamedPipeConnectionClass;
> -
> -struct _SpiceNamedPipeConnectionClass
> -{
> - GIOStreamClass parent_class;
> -};
> -
> -struct _SpiceNamedPipeConnection
> -{
> - GIOStream parent_instance;
> - SpiceNamedPipeConnectionPrivate *priv;
> -};
> -
> -GType spice_named_pipe_connection_get_type (void) G_GNUC_CONST;
> -
> -G_END_DECLS
> -
> -#endif /* __NAMED_PIPE_CONNECTION_H__ */
> diff --git a/src/controller/namedpipelistener.c b/src/controller/namedpipelistener.c
> deleted file mode 100644
> index b4b6057..0000000
> --- a/src/controller/namedpipelistener.c
> +++ /dev/null
> @@ -1,330 +0,0 @@
> -/*
> - Copyright (C) 2011 Red Hat, Inc.
> -
> - 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 "namedpipelistener.h"
> -
> -#include <windows.h>
> -#include <stdio.h>
> -#include <conio.h>
> -#include <tchar.h>
> -
> -static GSource *g_win32_handle_source_add (HANDLE handle,
> - GSourceFunc callback,
> - gpointer user_data);
> -
> -G_DEFINE_TYPE (SpiceNamedPipeListener, spice_named_pipe_listener, G_TYPE_OBJECT);
> -
> -struct _SpiceNamedPipeListenerPrivate
> -{
> - GQueue namedpipes;
> -};
> -
> -static void
> -spice_named_pipe_listener_dispose (GObject *object)
> -{
> - SpiceNamedPipeListener *listener = SPICE_NAMED_PIPE_LISTENER (object);
> - SpiceNamedPipe *p;
> -
> - while ((p = g_queue_pop_head (&listener->priv->namedpipes)) != NULL)
> - g_object_unref (p);
> -
> - g_return_if_fail (g_queue_get_length (&listener->priv->namedpipes) == 0);
> - g_queue_clear (&listener->priv->namedpipes);
> -
> - if (G_OBJECT_CLASS (spice_named_pipe_listener_parent_class)->dispose)
> - G_OBJECT_CLASS (spice_named_pipe_listener_parent_class)->dispose (object);
> -}
> -
> -static void
> -spice_named_pipe_listener_class_init (SpiceNamedPipeListenerClass *klass)
> -{
> - GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
> -
> - g_type_class_add_private (klass, sizeof (SpiceNamedPipeListenerPrivate));
> -
> - gobject_class->dispose = spice_named_pipe_listener_dispose;
> -}
> -
> -static void
> -spice_named_pipe_listener_init (SpiceNamedPipeListener *listener)
> -{
> - listener->priv = G_TYPE_INSTANCE_GET_PRIVATE (listener,
> - SPICE_TYPE_NAMED_PIPE_LISTENER,
> - SpiceNamedPipeListenerPrivate);
> -
> - g_queue_init (&listener->priv->namedpipes);
> -}
> -
> -void
> -spice_named_pipe_listener_add_named_pipe (SpiceNamedPipeListener *listener,
> - SpiceNamedPipe *namedpipe)
> -{
> - g_return_if_fail (SPICE_IS_NAMED_PIPE_LISTENER (listener));
> - g_return_if_fail (SPICE_IS_NAMED_PIPE (namedpipe));
> -
> - g_queue_push_head (&listener->priv->namedpipes, g_object_ref (namedpipe));
> -}
> -
> -typedef struct {
> - GCancellable *cancellable;
> - GSource *source;
> - GSimpleAsyncResult *async_result;
> - SpiceNamedPipe *np;
> - OVERLAPPED overlapped;
> -} ConnectData;
> -
> -static void
> -connect_cancelled (GCancellable *cancellable,
> - gpointer user_data)
> -{
> - ConnectData *c = user_data;
> - GError *error = NULL;
> -
> - g_source_destroy (c->source);
> - c->source = NULL;
> -
> - g_cancellable_set_error_if_cancelled (cancellable, &error);
> - g_simple_async_result_set_from_error (c->async_result, error);
> - g_error_free (error);
> -
> - g_simple_async_result_complete (c->async_result);
> - g_object_unref (c->async_result);
> -}
> -
> -static gboolean
> -connect_ready (gpointer user_data)
> -{
> - ConnectData *c = user_data;
> - gulong cbret;
> - gboolean success;
> -
> - /* Now complete the result (assuming it wasn't already completed) */
> - g_return_val_if_fail (c->async_result != NULL, FALSE);
> -
> - success = GetOverlappedResult (c->np, &c->overlapped, &cbret, FALSE);
> - if (!success)
> - {
> - int errsv = GetLastError ();
> - gchar *emsg = g_win32_error_message (errsv);
> -
> - g_simple_async_result_set_error (c->async_result,
> - G_IO_ERROR,
> - G_IO_ERROR_INVALID_ARGUMENT,
> - "GetOverlappedResult(): %s %d",
> - emsg, errsv);
> - g_free (emsg);
> - }
> -
> - g_simple_async_result_complete (c->async_result);
> - g_object_unref (c->async_result); /* TODO: that sould free c? */
> -
> - return FALSE;
> -}
> -
> -static void
> -connect_data_free (gpointer data)
> -{
> - ConnectData *c = data;
> -
> - if (c->source)
> - {
> - g_source_destroy (c->source);
> - g_source_unref (c->source);
> - c->source = NULL;
> - }
> - if (c->cancellable)
> - {
> - g_signal_handlers_disconnect_by_func (c->cancellable, connect_cancelled, c);
> - g_object_unref (c->cancellable);
> - c->cancellable = NULL;
> - }
> -
> - if (c->async_result) /* this is only a weak reference */
> - c->async_result = NULL;
> -
> - if (c->overlapped.hEvent != NULL)
> - {
> - CloseHandle (c->overlapped.hEvent);
> - c->overlapped.hEvent = NULL;
> - }
> -
> - if (c->np != NULL)
> - {
> - g_object_unref (c->np);
> - c->np = NULL;
> - }
> -
> - g_free (c);
> -}
> -
> -void
> -spice_named_pipe_listener_accept_async (SpiceNamedPipeListener *listener,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data)
> -{
> - ConnectData *c;
> - SpiceNamedPipe *namedpipe;
> -
> - g_return_if_fail (SPICE_IS_NAMED_PIPE_LISTENER (listener));
> -
> - namedpipe = SPICE_NAMED_PIPE (g_queue_pop_head (&listener->priv->namedpipes));
> - /* do not unref, we keep that ref */
> - g_return_if_fail (namedpipe != NULL);
> -
> - c = g_new0 (ConnectData, 1);
> - c->np = namedpipe; /* transfer what used to be the avail_namedpipes ref */
> - c->async_result = g_simple_async_result_new (G_OBJECT (listener), callback, user_data,
> - spice_named_pipe_listener_accept_async);
> - c->overlapped.hEvent = CreateEvent (NULL, /* default security attribute */
> - TRUE, /* manual-reset event */
> - TRUE, /* initial state = signaled */
> - NULL); /* unnamed event object */
> - g_simple_async_result_set_op_res_gpointer (c->async_result, c, connect_data_free);
> -
> - if (ConnectNamedPipe (spice_named_pipe_get_handle (namedpipe), &c->overlapped) != 0)
> - {
> - /* we shouldn't get there if the listener is in non-blocking */
> - g_warn_if_reached ();
> - }
> -
> - switch (GetLastError ())
> - {
> - case ERROR_SUCCESS:
> - case ERROR_IO_PENDING:
> - break;
> - case ERROR_PIPE_CONNECTED:
> - g_simple_async_result_complete_in_idle (c->async_result);
> - g_object_unref (c->async_result);
> - return;
> - default:
> - g_simple_async_report_error_in_idle (G_OBJECT (listener),
> - callback, user_data,
> - G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
> - "ConnectNamedPipe() failed %ld", GetLastError ());
> - g_object_unref (c->async_result);
> - return;
> - }
> -
> - c->source = g_win32_handle_source_add (c->overlapped.hEvent,
> - connect_ready, c);
> -
> - if (cancellable)
> - {
> - c->cancellable = g_object_ref (cancellable);
> - g_signal_connect (cancellable, "cancelled",
> - G_CALLBACK (connect_cancelled), c);
> - }
> -}
> -
> -SpiceNamedPipeConnection *
> -spice_named_pipe_listener_accept_finish (SpiceNamedPipeListener *listener,
> - GAsyncResult *result,
> - GObject **source_object,
> - GError **error)
> -{
> - GSimpleAsyncResult *simple;
> - ConnectData *c;
> - SpiceNamedPipeConnection *connection;
> -
> - g_return_val_if_fail (SPICE_IS_NAMED_PIPE_LISTENER (listener), NULL);
> - g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), NULL);
> - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (listener),
> - spice_named_pipe_listener_accept_async),
> - NULL);
> -
> - simple = G_SIMPLE_ASYNC_RESULT (result);
> - if (g_simple_async_result_propagate_error (simple, error))
> - return NULL;
> -
> - c = g_simple_async_result_get_op_res_gpointer (simple);
> -
> - connection = g_object_new (SPICE_TYPE_NAMED_PIPE_CONNECTION,
> - "namedpipe", c->np,
> - NULL);
> - return connection;
> -}
> -
> -SpiceNamedPipeListener *
> -spice_named_pipe_listener_new (void)
> -{
> - return g_object_new (SPICE_TYPE_NAMED_PIPE_LISTENER, NULL);
> -}
> -
> -/* Windows HANDLE GSource - from gio/gwin32resolver.c */
> -
> -typedef struct {
> - GSource source;
> - GPollFD pollfd;
> -} GWin32HandleSource;
> -
> -static gboolean
> -g_win32_handle_source_prepare (GSource *source,
> - gint *timeout)
> -{
> - *timeout = -1;
> - return FALSE;
> -}
> -
> -static gboolean
> -g_win32_handle_source_check (GSource *source)
> -{
> - GWin32HandleSource *hsource = (GWin32HandleSource *)source;
> -
> - return hsource->pollfd.revents;
> -}
> -
> -static gboolean
> -g_win32_handle_source_dispatch (GSource *source,
> - GSourceFunc callback,
> - gpointer user_data)
> -{
> - return (*callback) (user_data);
> -}
> -
> -static void
> -g_win32_handle_source_finalize (GSource *source)
> -{
> - ;
> -}
> -
> -GSourceFuncs g_win32_handle_source_funcs = {
> - g_win32_handle_source_prepare,
> - g_win32_handle_source_check,
> - g_win32_handle_source_dispatch,
> - g_win32_handle_source_finalize
> -};
> -
> -static GSource *
> -g_win32_handle_source_add (HANDLE handle,
> - GSourceFunc callback,
> - gpointer user_data)
> -{
> - GWin32HandleSource *hsource;
> - GSource *source;
> -
> - source = g_source_new (&g_win32_handle_source_funcs, sizeof (GWin32HandleSource));
> - hsource = (GWin32HandleSource *)source;
> - hsource->pollfd.fd = (gint)handle;
> - hsource->pollfd.events = G_IO_IN;
> - hsource->pollfd.revents = 0;
> - g_source_add_poll (source, &hsource->pollfd);
> -
> - g_source_set_callback (source, callback, user_data, NULL);
> - g_source_attach (source, g_main_context_get_thread_default ());
> - return source;
> -}
> diff --git a/src/controller/namedpipelistener.h b/src/controller/namedpipelistener.h
> deleted file mode 100644
> index c2dbd0a..0000000
> --- a/src/controller/namedpipelistener.h
> +++ /dev/null
> @@ -1,70 +0,0 @@
> -/*
> - Copyright (C) 2011 Red Hat, Inc.
> -
> - 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/>.
> -*/
> -#ifndef __NAMED_PIPE_LISTENER_H__
> -#define __NAMED_PIPE_LISTENER_H__
> -
> -#include <gio/gio.h>
> -
> -#include "namedpipe.h"
> -#include "namedpipeconnection.h"
> -
> -G_BEGIN_DECLS
> -
> -#define SPICE_TYPE_NAMED_PIPE_LISTENER (spice_named_pipe_listener_get_type ())
> -#define SPICE_NAMED_PIPE_LISTENER(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
> - SPICE_TYPE_NAMED_PIPE_LISTENER, SpiceNamedPipeListener))
> -#define SPICE_NAMED_PIPE_LISTENER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \
> - SPICE_TYPE_NAMED_PIPE_LISTENER, SpiceNamedPipeListenerClass))
> -#define SPICE_IS_NAMED_PIPE_LISTENER(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \
> - SPICE_TYPE_NAMED_PIPE_LISTENER))
> -#define SPICE_IS_NAMED_PIPE_LISTENER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \
> - SPICE_TYPE_NAMED_PIPE_LISTENER))
> -#define SPICE_NAMED_PIPE_LISTENER_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \
> - SPICE_TYPE_NAMED_PIPE_LISTENER, SpiceNamedPipeListenerClass))
> -
> -typedef struct _SpiceNamedPipeListener SpiceNamedPipeListener;
> -typedef struct _SpiceNamedPipeListenerPrivate SpiceNamedPipeListenerPrivate;
> -typedef struct _SpiceNamedPipeListenerClass SpiceNamedPipeListenerClass;
> -
> -struct _SpiceNamedPipeListenerClass
> -{
> - GObjectClass parent_class;
> -};
> -
> -struct _SpiceNamedPipeListener
> -{
> - GObject parent_instance;
> - SpiceNamedPipeListenerPrivate *priv;
> -};
> -
> -GType spice_named_pipe_listener_get_type (void) G_GNUC_CONST;
> -
> -SpiceNamedPipeListener * spice_named_pipe_listener_new (void);
> -void spice_named_pipe_listener_add_named_pipe (SpiceNamedPipeListener *listener,
> - SpiceNamedPipe *namedpipe);
> -void spice_named_pipe_listener_accept_async (SpiceNamedPipeListener *listener,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data);
> -SpiceNamedPipeConnection * spice_named_pipe_listener_accept_finish (SpiceNamedPipeListener *listener,
> - GAsyncResult *result,
> - GObject **source_object,
> - GError **error);
> -
> -G_END_DECLS
> -
> -#endif /* __NAMED_PIPE_LISTENER_H__ */
> diff --git a/src/controller/spice-controller-listener.c b/src/controller/spice-controller-listener.c
> deleted file mode 100644
> index 98baf33..0000000
> --- a/src/controller/spice-controller-listener.c
> +++ /dev/null
> @@ -1,159 +0,0 @@
> -/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> -/*
> - Copyright (C) 2012 Red Hat, Inc.
> -
> - 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 <glib.h>
> -#include <glib/gstdio.h>
> -
> -#include "spice-controller-listener.h"
> -
> -#ifdef G_OS_WIN32
> -#include <windows.h>
> -#include "namedpipe.h"
> -#include "namedpipelistener.h"
> -#include "win32-util.h"
> -#endif
> -
> -#ifdef G_OS_UNIX
> -#include <gio/gunixsocketaddress.h>
> -#endif
> -
> -/**
> - * SpiceControllerListenerError:
> - * @SPICE_CONTROLLER_LISTENER_ERROR_VALUE: invalid value.
> - *
> - * Possible errors of controller listener related functions.
> - **/
> -
> -/**
> - * SPICE_CONTROLLER_LISTENER_ERROR:
> - *
> - * The error domain of the controller listener subsystem.
> - **/
> -GQuark
> -spice_controller_listener_error_quark (void)
> -{
> - return g_quark_from_static_string ("spice-controller-listener-error");
> -}
> -
> -GObject*
> -spice_controller_listener_new (const gchar *address, GError **error)
> -{
> - GObject *listener = NULL;
> - gchar *addr = NULL;
> -
> - g_return_val_if_fail (error == NULL || *error == NULL, NULL);
> -
> - addr = g_strdup (address);
> -
> -#ifdef G_OS_WIN32
> - if (addr == NULL)
> - addr = g_strdup (g_getenv ("SPICE_XPI_NAMEDPIPE"));
> - if (addr == NULL)
> - addr = g_strdup_printf ("\\\\.\\pipe\\SpiceController-%" G_GUINT64_FORMAT, (guint64)GetCurrentProcessId ());
> -#else
> - if (addr == NULL)
> - addr = g_strdup (g_getenv ("SPICE_XPI_SOCKET"));
> -#endif
> - if (addr == NULL) {
> - g_set_error (error,
> - SPICE_CONTROLLER_LISTENER_ERROR,
> - SPICE_CONTROLLER_LISTENER_ERROR_VALUE,
> -#ifdef G_OS_WIN32
> - "Missing namedpipe address"
> -#else
> - "Missing socket address"
> -#endif
> - );
> - goto end;
> - }
> -
> - g_unlink (addr);
> -
> -#ifdef G_OS_WIN32
> - {
> - SpiceNamedPipe *np;
> -
> - listener = G_OBJECT (spice_named_pipe_listener_new ());
> -
> - np = spice_win32_user_pipe_new (addr, error);
> - if (!np) {
> - g_object_unref (listener);
> - listener = NULL;
> - goto end;
> - }
> -
> - spice_named_pipe_listener_add_named_pipe (SPICE_NAMED_PIPE_LISTENER (listener), np);
> - }
> -#else
> - {
> - listener = G_OBJECT (g_socket_listener_new ());
> -
> - if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener),
> - G_SOCKET_ADDRESS (g_unix_socket_address_new (addr)),
> - G_SOCKET_TYPE_STREAM,
> - G_SOCKET_PROTOCOL_DEFAULT,
> - NULL,
> - NULL,
> - error))
> - g_warning ("failed to add address");
> - }
> -#endif
> -
> -end:
> - g_free (addr);
> - return listener;
> -}
> -
> -void
> -spice_controller_listener_accept_async (GObject *listener,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data)
> -{
> - g_return_if_fail(G_IS_OBJECT(listener));
> -
> -#ifdef G_OS_WIN32
> - spice_named_pipe_listener_accept_async (SPICE_NAMED_PIPE_LISTENER (listener), cancellable, callback, user_data);
> -#else
> - g_socket_listener_accept_async (G_SOCKET_LISTENER (listener), cancellable, callback, user_data);
> -#endif
> -}
> -
> -GIOStream*
> -spice_controller_listener_accept_finish (GObject *listener,
> - GAsyncResult *result,
> - GObject **source_object,
> - GError **error)
> -{
> - g_return_val_if_fail(G_IS_OBJECT(listener), NULL);
> -
> -#ifdef G_OS_WIN32
> - SpiceNamedPipeConnection *np;
> - np = spice_named_pipe_listener_accept_finish (SPICE_NAMED_PIPE_LISTENER (listener), result, source_object, error);
> - if (np)
> - return G_IO_STREAM (np);
> -#else
> - GSocketConnection *socket;
> - socket = g_socket_listener_accept_finish (G_SOCKET_LISTENER (listener), result, source_object, error);
> - if (socket)
> - return G_IO_STREAM (socket);
> -#endif
> -
> - return NULL;
> -}
> diff --git a/src/controller/spice-controller-listener.h b/src/controller/spice-controller-listener.h
> deleted file mode 100644
> index a50bdea..0000000
> --- a/src/controller/spice-controller-listener.h
> +++ /dev/null
> @@ -1,47 +0,0 @@
> -/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> -/*
> - Copyright (C) 2012 Red Hat, Inc.
> -
> - 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/>.
> -*/
> -#ifndef __SPICE_CONTROLLER_LISTENER_H__
> -#define __SPICE_CONTROLLER_LISTENER_H__
> -
> -#include <gio/gio.h>
> -
> -G_BEGIN_DECLS
> -
> -#define SPICE_CONTROLLER_LISTENER_ERROR spice_controller_listener_error_quark ()
> -GQuark spice_controller_listener_error_quark (void);
> -
> -typedef enum
> -{
> - SPICE_CONTROLLER_LISTENER_ERROR_VALUE /* incorrect value */
> -} SpiceControllerListenerError;
> -
> -
> -GObject* spice_controller_listener_new (const gchar *address, GError **error);
> -
> -void spice_controller_listener_accept_async (GObject *listener,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data);
> -
> -GIOStream* spice_controller_listener_accept_finish (GObject *listener,
> - GAsyncResult *result,
> - GObject **source_object,
> - GError **error);
> -G_END_DECLS
> -
> -#endif /* __SPICE_CONTROLLER_LISTENER_H__ */
> diff --git a/src/controller/spice-foreign-menu-listener.c b/src/controller/spice-foreign-menu-listener.c
> deleted file mode 100644
> index 5e62606..0000000
> --- a/src/controller/spice-foreign-menu-listener.c
> +++ /dev/null
> @@ -1,161 +0,0 @@
> -/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> -/*
> - Copyright (C) 2012 Red Hat, Inc.
> -
> - 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 <glib.h>
> -#include <glib/gstdio.h>
> -
> -#include "spice-foreign-menu-listener.h"
> -
> -#ifdef G_OS_WIN32
> -#include <windows.h>
> -#include "namedpipe.h"
> -#include "namedpipelistener.h"
> -#include "win32-util.h"
> -#endif
> -
> -#ifdef G_OS_UNIX
> -#include <gio/gunixsocketaddress.h>
> -#endif
> -
> -/**
> - * SpiceForeignMenuListenerError:
> - * @SPICE_FOREIGN_MENU_LISTENER_ERROR_VALUE: invalid value.
> - *
> - * Possible errors of foreign menu listener related functions.
> - **/
> -
> -/**
> - * SPICE_FOREIGN_MENU_LISTENER_ERROR:
> - *
> - * The error domain of the foreign menu listener subsystem.
> - **/
> -GQuark
> -spice_foreign_menu_listener_error_quark (void)
> -{
> - return g_quark_from_static_string ("spice-foreign-menu-listener-error");
> -}
> -
> -GObject*
> -spice_foreign_menu_listener_new (const gchar *address, GError **error)
> -{
> - GObject *listener = NULL;
> - gchar *addr = NULL;
> -
> - g_return_val_if_fail (error == NULL || *error == NULL, NULL);
> -
> - addr = g_strdup (address);
> -
> -#ifdef G_OS_WIN32
> - if (addr == NULL)
> - addr = g_strdup (g_getenv ("SPICE_FOREIGN_MENU_NAMEDPIPE"));
> - if (addr == NULL)
> - addr = g_strdup_printf ("\\\\.\\pipe\\SpiceForeignMenu-%" G_GUINT64_FORMAT, (guint64)GetCurrentProcessId ());
> -#else
> - if (addr == NULL)
> - addr = g_strdup (g_getenv ("SPICE_FOREIGN_MENU_SOCKET"));
> - if (addr == NULL)
> - addr = g_strdup_printf ("/tmp/SpiceForeignMenu-%" G_GUINT64_FORMAT ".uds", (guint64)getpid ());
> -#endif
> - if (addr == NULL) {
> - g_set_error (error,
> - SPICE_FOREIGN_MENU_LISTENER_ERROR,
> - SPICE_FOREIGN_MENU_LISTENER_ERROR_VALUE,
> -#ifdef G_OS_WIN32
> - "Missing namedpipe address"
> -#else
> - "Missing socket address"
> -#endif
> - );
> - goto end;
> - }
> -
> - g_unlink (addr);
> -
> -#ifdef G_OS_WIN32
> - {
> - SpiceNamedPipe *np;
> -
> - listener = G_OBJECT (spice_named_pipe_listener_new ());
> -
> - np = spice_win32_user_pipe_new (addr, error);
> - if (!np) {
> - g_object_unref (listener);
> - listener = NULL;
> - goto end;
> - }
> -
> - spice_named_pipe_listener_add_named_pipe (SPICE_NAMED_PIPE_LISTENER (listener), np);
> - }
> -#else
> - {
> - listener = G_OBJECT (g_socket_listener_new ());
> -
> - if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener),
> - G_SOCKET_ADDRESS (g_unix_socket_address_new (addr)),
> - G_SOCKET_TYPE_STREAM,
> - G_SOCKET_PROTOCOL_DEFAULT,
> - NULL,
> - NULL,
> - error))
> - g_warning ("failed to add address");
> - }
> -#endif
> -
> -end:
> - g_free (addr);
> - return listener;
> -}
> -
> -void
> -spice_foreign_menu_listener_accept_async (GObject *listener,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data)
> -{
> - g_return_if_fail(G_IS_OBJECT(listener));
> -
> -#ifdef G_OS_WIN32
> - spice_named_pipe_listener_accept_async (SPICE_NAMED_PIPE_LISTENER (listener), cancellable, callback, user_data);
> -#else
> - g_socket_listener_accept_async (G_SOCKET_LISTENER (listener), cancellable, callback, user_data);
> -#endif
> -}
> -
> -GIOStream*
> -spice_foreign_menu_listener_accept_finish (GObject *listener,
> - GAsyncResult *result,
> - GObject **source_object,
> - GError **error)
> -{
> - g_return_val_if_fail(G_IS_OBJECT(listener), NULL);
> -
> -#ifdef G_OS_WIN32
> - SpiceNamedPipeConnection *np;
> - np = spice_named_pipe_listener_accept_finish (SPICE_NAMED_PIPE_LISTENER (listener), result, source_object, error);
> - if (np)
> - return G_IO_STREAM (np);
> -#else
> - GSocketConnection *socket;
> - socket = g_socket_listener_accept_finish (G_SOCKET_LISTENER (listener), result, source_object, error);
> - if (socket)
> - return G_IO_STREAM (socket);
> -#endif
> -
> - return NULL;
> -}
> diff --git a/src/controller/spice-foreign-menu-listener.h b/src/controller/spice-foreign-menu-listener.h
> deleted file mode 100644
> index 1071528..0000000
> --- a/src/controller/spice-foreign-menu-listener.h
> +++ /dev/null
> @@ -1,47 +0,0 @@
> -/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> -/*
> - Copyright (C) 2012 Red Hat, Inc.
> -
> - 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/>.
> -*/
> -#ifndef __SPICE_FOREIGN_MENU_LISTENER_H__
> -#define __SPICE_FOREIGN_MENU_LISTENER_H__
> -
> -#include <gio/gio.h>
> -
> -G_BEGIN_DECLS
> -
> -#define SPICE_FOREIGN_MENU_LISTENER_ERROR spice_foreign_menu_listener_error_quark ()
> -GQuark spice_foreign_menu_listener_error_quark (void);
> -
> -typedef enum
> -{
> - SPICE_FOREIGN_MENU_LISTENER_ERROR_VALUE /* incorrect value */
> -} SpiceForeignMenuListenerError;
> -
> -
> -GObject* spice_foreign_menu_listener_new (const gchar *address, GError **error);
> -
> -void spice_foreign_menu_listener_accept_async (GObject *listener,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data);
> -
> -GIOStream* spice_foreign_menu_listener_accept_finish (GObject *listener,
> - GAsyncResult *result,
> - GObject **source_object,
> - GError **error);
> -G_END_DECLS
> -
> -#endif /* __SPICE_FOREIGN_MENU_LISTENER_H__ */
> diff --git a/src/controller/test.c b/src/controller/test.c
> deleted file mode 100644
> index 783499c..0000000
> --- a/src/controller/test.c
> +++ /dev/null
> @@ -1,289 +0,0 @@
> -/* Copyright (C) 2011 Red Hat, Inc. */
> -
> -/* 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 <stdio.h>
> -#include <stdint.h>
> -#include <spice/controller_prot.h>
> -
> -#include "spice-controller.h"
> -
> -#ifdef WIN32
> -#include <windows.h>
> -#define PIPE_NAME TEXT("\\\\.\\pipe\\SpiceController-%lu")
> -static HANDLE pipe = INVALID_HANDLE_VALUE;
> -#else
> -
> -#include <sys/socket.h>
> -#ifdef HAVE_SYS_TYPES_H
> -#include <sys/types.h>
> -#endif
> -#include <sys/un.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <string.h>
> -#include <errno.h>
> -
> -#define PIPE_NAME "/tmp/test"
> -static int sock = -1;
> -
> -#endif
> -
> -#define PIPE_NAME_MAX_LEN 256
> -
> -void write_to_pipe (const void* data, size_t len)
> -{
> -#ifdef WIN32
> - DWORD written;
> - if (!WriteFile (pipe, data, len, &written, NULL) || written != len) {
> - printf("Write to pipe failed %lu\n", GetLastError());
> - }
> -#else
> - if (send (sock, data, len, 0) != len) {
> - printf ("send failed, (%d) %s\n", errno, strerror(errno));
> - }
> -#endif
> -}
> -
> -gboolean send_init (void)
> -{
> - ControllerInit msg = {
> - { CONTROLLER_MAGIC, CONTROLLER_VERSION, sizeof (msg) },
> - 0,
> - CONTROLLER_FLAG_EXCLUSIVE
> - };
> -
> - write_to_pipe(&msg, sizeof (msg));
> - return FALSE;
> -}
> -
> -void send_msg (uint32_t id)
> -{
> - ControllerMsg msg = {
> - id, sizeof (msg)
> - };
> -
> - write_to_pipe (&msg, sizeof (msg));
> -}
> -
> -void send_value (uint32_t id, uint32_t value)
> -{
> - ControllerValue msg = {
> - { id, sizeof(msg) },
> - value
> - };
> -
> - write_to_pipe (&msg, sizeof (msg));
> -}
> -
> -void send_data (uint32_t id, uint8_t* data, size_t data_size)
> -{
> - size_t size = sizeof (ControllerData) + data_size;
> - ControllerData* msg = (ControllerData*)g_malloc0 (size);
> -
> - msg->base.id = id;
> - msg->base.size = (uint32_t)size;
> - memcpy (msg->data, data, data_size);
> - write_to_pipe (msg, size);
> - g_free (msg);
> -}
> -
> -ssize_t read_from_pipe (void* data, size_t size)
> -{
> - ssize_t read;
> -#ifdef WIN32
> - DWORD bytes;
> - if (!ReadFile (pipe, data, size, &bytes, NULL)) {
> - printf ("Read from pipe failed %lu\n", GetLastError());
> - }
> - read = bytes;
> -#else
> - read = recv (sock, data, size, 0);
> - if ((read == -1 || read == 0)) {
> - printf ("recv failed, (%d) %s\n", errno, strerror (errno));
> - }
> -#endif
> - return read;
> -}
> -
> -#define HOST "localhost"
> -#define PORT 5931
> -#define SPORT 0
> -#define PWD "P at s5w0rd"
> -#define SECURE_CHANNELS "main,inputs,playback"
> -#define DISABLED_CHANNELS "playback,record"
> -#define TITLE "Hello from controller"
> -#define HOTKEYS "toggle-fullscreen=shift+f1,release-cursor=shift+f2"
> -#define MENU "0\r4864\rS&end Ctrl+Alt+Del\tCtrl+Alt+End\r0\r\n" \
> - "0\r5120\r&Toggle full screen\tShift+F11\r0\r\n" \
> - "0\r1\r&Special keys\r4\r\n" \
> - "1\r5376\r&Send Shift+F11\r0\r\n" \
> - "1\r5632\r&Send Shift+F12\r0\r\n" \
> - "1\r5888\r&Send Ctrl+Alt+End\r0\r\n" \
> - "0\r1\r-\r1\r\n" \
> - "0\r2\rChange CD\r4\r\n" \
> - "2\r3\rNo CDs\r0\r\n" \
> - "2\r4\r[Eject]\r0\r\n" \
> - "0\r5\r-\r1\r\n" \
> - "0\r6\rPlay\r0\r\n" \
> - "0\r7\rSuspend\r0\r\n" \
> - "0\r8\rStop\r0\r\n"
> -
> -#define TLS_CIPHERS "TLS_C1PHERS"
> -#define CA_FILE "C at _FILE"
> -#define HOST_SUBJECT "Host_SUBJ3CT"
> -
> -SpiceCtrlController *ctrl;
> -GMainLoop *loop;
> -
> -void signaled (GObject *gobject, const gchar *signal_name)
> -{
> - g_message ("signaled: %s", signal_name);
> - if (g_str_equal (signal_name, "hide")) {
> - spice_ctrl_controller_menu_item_click_msg (ctrl, 42);
> - g_timeout_add (1000, (GSourceFunc)g_main_loop_quit, loop);
> - }
> -}
> -
> -void notified (GObject *gobject, GParamSpec *pspec,
> - gpointer user_data)
> -{
> - GValue value = { 0, };
> - GValue strvalue = { 0, };
> -
> - g_return_if_fail (gobject != NULL);
> - g_return_if_fail (pspec != NULL);
> -
> - g_value_init (&value, pspec->value_type);
> - g_value_init (&strvalue, G_TYPE_STRING);
> - g_object_get_property (gobject, pspec->name, &value);
> -
> - if (pspec->value_type == G_TYPE_STRV) {
> - gchar** p = (gchar **)g_value_get_boxed (&value);
> - g_message ("notify::%s == ", pspec->name);
> - while (*p)
> - g_message ("%s", *p++);
> - } else if (G_TYPE_IS_OBJECT(pspec->value_type)) {
> - GObject *o = g_value_get_object (&value);
> - g_message ("notify::%s == %s", pspec->name, o ? G_OBJECT_TYPE_NAME (o) : "null");
> - } else {
> - g_value_transform (&value, &strvalue);
> - g_message ("notify::%s = %s", pspec->name, g_value_get_string (&strvalue));
> - }
> -
> - g_value_unset (&value);
> - g_value_unset (&strvalue);
> -}
> -
> -void connect_signals (gpointer obj)
> -{
> - guint i, n_ids = 0;
> - guint *ids = NULL;
> - GType type = G_OBJECT_TYPE (obj);
> -
> - ids = g_signal_list_ids (type, &n_ids);
> - for (i = 0; i < n_ids; i++) {
> - const gchar *name = g_signal_name (ids[i]);
> - g_signal_connect (obj, name, G_CALLBACK (signaled), (gpointer)name);
> - }
> -}
> -
> -int main (int argc, char *argv[])
> -{
> -#ifdef WIN32
> - int spicec_pid = (argc > 1 ? atoi (argv[1]) : 0);
> -#endif
> - char* host = (argc > 2 ? argv[2] : (char*)HOST);
> - int port = (argc > 3 ? atoi (argv[3]) : PORT);
> - char pipe_name[PIPE_NAME_MAX_LEN];
> - ControllerValue msg;
> - ssize_t read;
> -
> - ctrl = spice_ctrl_controller_new ();
> - loop = g_main_loop_new (NULL, FALSE);
> - g_signal_connect (ctrl, "notify", G_CALLBACK (notified), NULL);
> - connect_signals (ctrl);
> -
> -#ifdef WIN32
> - snprintf (pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME, spicec_pid);
> - spice_ctrl_controller_listen (ctrl, pipe_name, NULL, NULL);
> -
> - printf ("Creating Spice controller connection %s\n", pipe_name);
> - pipe = CreateFile (pipe_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
> - if (pipe == INVALID_HANDLE_VALUE) {
> - printf ("Could not open pipe %lu\n", GetLastError());
> - return -1;
> - }
> -#else
> - spice_ctrl_controller_listen (ctrl, PIPE_NAME, NULL, NULL);
> -
> - snprintf (pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME);
> - printf ("Creating a controller connection %s\n", pipe_name);
> - struct sockaddr_un remote;
> - if ((sock = socket (AF_UNIX, SOCK_STREAM, 0)) == -1) {
> - printf ("Could not open socket, (%d) %s\n", errno, strerror(errno));
> - return -1;
> - }
> - remote.sun_family = AF_UNIX;
> - strcpy (remote.sun_path, pipe_name);
> - if (connect (sock, (struct sockaddr *)&remote,
> - strlen (remote.sun_path) + sizeof(remote.sun_family)) == -1) {
> - printf ("Socket connect failed, (%d) %s\n", errno, strerror(errno));
> - close (sock);
> - return -1;
> - }
> -#endif
> -
> - /* TODO: we rely on socket / pipe buffer... which is lame :) */
> - send_init ();
> -
> - send_data (CONTROLLER_HOST, (uint8_t*)host, strlen(host) + 1);
> - send_value (CONTROLLER_PORT, port);
> - send_value (CONTROLLER_SPORT, SPORT);
> - send_data (CONTROLLER_PASSWORD, (uint8_t*)PWD, strlen(PWD) + 1);
> - send_data (CONTROLLER_SECURE_CHANNELS, (uint8_t*)SECURE_CHANNELS, strlen(SECURE_CHANNELS) + 1);
> - send_data (CONTROLLER_DISABLE_CHANNELS, (uint8_t*)DISABLED_CHANNELS, strlen(DISABLED_CHANNELS) + 1);
> - send_data (CONTROLLER_TLS_CIPHERS, (uint8_t*)TLS_CIPHERS, strlen(TLS_CIPHERS) + 1);
> - send_data (CONTROLLER_CA_FILE, (uint8_t*)CA_FILE, strlen(CA_FILE) + 1);
> - send_data (CONTROLLER_HOST_SUBJECT, (uint8_t*)HOST_SUBJECT, strlen(HOST_SUBJECT) + 1);
> - send_data (CONTROLLER_SET_TITLE, (uint8_t*)TITLE, strlen(TITLE) + 1);
> - send_data (CONTROLLER_HOTKEYS, (uint8_t*)HOTKEYS, strlen(HOTKEYS) + 1);
> - send_data (CONTROLLER_CREATE_MENU, (uint8_t*)MENU, strlen(MENU));
> -
> - send_value (CONTROLLER_FULL_SCREEN, /*CONTROLLER_SET_FULL_SCREEN |*/ CONTROLLER_AUTO_DISPLAY_RES);
> -
> - send_msg (CONTROLLER_SHOW);
> - send_msg (CONTROLLER_CONNECT);
> - send_msg (CONTROLLER_SHOW);
> - send_msg (CONTROLLER_DELETE_MENU);
> - send_msg (CONTROLLER_HIDE);
> -
> - g_main_loop_run (loop);
> -
> - while ((read = read_from_pipe (&msg, sizeof(msg))) == sizeof(msg)) {
> - printf ("Received id %u, size %u, value %u\n", msg.base.id, msg.base.size, msg.value);
> - if (msg.value == 42)
> - break;
> - }
> -
> -#ifdef WIN32
> - CloseHandle (pipe);
> -#else
> - close (sock);
> -#endif
> - g_object_unref (ctrl);
> - return 0;
> -}
> diff --git a/src/controller/util.vala b/src/controller/util.vala
> deleted file mode 100644
> index acd677e..0000000
> --- a/src/controller/util.vala
> +++ /dev/null
> @@ -1,42 +0,0 @@
> -// Copyright (C) 2012 Red Hat, Inc.
> -
> -// 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/>.
> -
> -namespace SpiceCtrl {
> -
> - public async void input_stream_read (InputStream stream, uint8[] buffer) throws GLib.IOError {
> - var length = buffer.length;
> - ssize_t i = 0;
> -
> - while (i < length) {
> - var n = yield stream.read_async (buffer[i:length]);
> - if (n == 0)
> - throw new GLib.IOError.CLOSED ("closed stream") ;
> - i += n;
> - }
> - }
> -
> - public async void output_stream_write (OutputStream stream, owned uint8[] buffer) throws GLib.IOError {
> - var length = buffer.length;
> - ssize_t i = 0;
> -
> - while (i < length) {
> - var n = yield stream.write_async (buffer[i:length]);
> - if (n == 0)
> - throw new GLib.IOError.CLOSED ("closed stream") ;
> - i += n;
> - }
> - }
> -
> -}
> diff --git a/src/controller/win32-util.c b/src/controller/win32-util.c
> deleted file mode 100644
> index c3e0400..0000000
> --- a/src/controller/win32-util.c
> +++ /dev/null
> @@ -1,161 +0,0 @@
> -/*
> - Copyright (C) 2012 Red Hat, Inc.
> -
> - 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 "win32-util.h"
> -#include <windows.h>
> -#include <sddl.h>
> -#include <aclapi.h>
> -
> -gboolean
> -spice_win32_set_low_integrity (void* handle, GError **error)
> -{
> - g_return_val_if_fail (handle != NULL, FALSE);
> - g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
> -
> - /* see also http://msdn.microsoft.com/en-us/library/bb625960.aspx */
> - PSECURITY_DESCRIPTOR psd = NULL;
> - PACL psacl = NULL;
> - BOOL sacl_present = FALSE;
> - BOOL sacl_defaulted = FALSE;
> - char *emsg;
> - int errsv;
> - gboolean success = FALSE;
> -
> - if (!ConvertStringSecurityDescriptorToSecurityDescriptor ("S:(ML;;NW;;;LW)",
> - SDDL_REVISION_1, &psd, NULL))
> - goto failed;
> -
> - if (!GetSecurityDescriptorSacl (psd, &sacl_present, &psacl, &sacl_defaulted))
> - goto failed;
> -
> - if (SetSecurityInfo (handle, SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION,
> - NULL, NULL, NULL, psacl) != ERROR_SUCCESS)
> - goto failed;
> -
> - success = TRUE;
> - goto end;
> -
> -failed:
> - errsv = GetLastError ();
> - emsg = g_win32_error_message (errsv);
> - g_set_error (error, G_IO_ERROR,
> - g_io_error_from_win32_error (errsv),
> - "Error setting integrity: %s",
> - emsg);
> - g_free (emsg);
> -
> -end:
> - if (psd != NULL)
> - LocalFree (psd);
> -
> - return success;
> -}
> -
> -static gboolean
> -get_user_security_attributes (SECURITY_ATTRIBUTES* psa, SECURITY_DESCRIPTOR* psd, PACL* ppdacl)
> -{
> - EXPLICIT_ACCESS ea;
> - TRUSTEE trst;
> - DWORD ret = 0;
> -
> - ZeroMemory (psa, sizeof (*psa));
> - ZeroMemory (psd, sizeof (*psd));
> - psa->nLength = sizeof (*psa);
> - psa->bInheritHandle = FALSE;
> - psa->lpSecurityDescriptor = psd;
> -
> - ZeroMemory (&trst, sizeof (trst));
> - trst.pMultipleTrustee = NULL;
> - trst.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
> - trst.TrusteeForm = TRUSTEE_IS_NAME;
> - trst.TrusteeType = TRUSTEE_IS_USER;
> - trst.ptstrName = "CURRENT_USER";
> -
> - ZeroMemory (&ea, sizeof (ea));
> - ea.grfAccessPermissions = GENERIC_WRITE | GENERIC_READ;
> - ea.grfAccessMode = SET_ACCESS;
> - ea.grfInheritance = NO_INHERITANCE;
> - ea.Trustee = trst;
> -
> - ret = SetEntriesInAcl (1, &ea, NULL, ppdacl);
> - if (ret != ERROR_SUCCESS)
> - return FALSE;
> -
> - if (!InitializeSecurityDescriptor (psd, SECURITY_DESCRIPTOR_REVISION))
> - return FALSE;
> -
> - if (!SetSecurityDescriptorDacl (psd, TRUE, *ppdacl, FALSE))
> - return FALSE;
> -
> - return TRUE;
> -}
> -
> -#define DEFAULT_PIPE_BUF_SIZE 4096
> -
> -SpiceNamedPipe*
> -spice_win32_user_pipe_new (gchar *name, GError **error)
> -{
> - SECURITY_ATTRIBUTES sa;
> - SECURITY_DESCRIPTOR sd;
> - PACL dacl = NULL;
> - HANDLE pipe;
> - SpiceNamedPipe *np = NULL;
> -
> - g_return_val_if_fail (name != NULL, NULL);
> - g_return_val_if_fail (error != NULL, NULL);
> -
> - if (!get_user_security_attributes (&sa, &sd, &dacl))
> - return NULL;
> -
> - pipe = CreateNamedPipe (name,
> - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
> - /* FIXME: why is FILE_FLAG_FIRST_PIPE_INSTANCE needed for WRITE_DAC
> - * (apparently needed by SetSecurityInfo). This will prevent
> - * multiple pipe listener....?! */
> - FILE_FLAG_FIRST_PIPE_INSTANCE | WRITE_DAC,
> - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
> - PIPE_UNLIMITED_INSTANCES,
> - DEFAULT_PIPE_BUF_SIZE, DEFAULT_PIPE_BUF_SIZE,
> - 0, &sa);
> -
> - if (pipe == INVALID_HANDLE_VALUE) {
> - int errsv = GetLastError ();
> - gchar *emsg = g_win32_error_message (errsv);
> -
> - g_set_error (error,
> - G_IO_ERROR,
> - g_io_error_from_win32_error (errsv),
> - "Error CreateNamedPipe(): %s",
> - emsg);
> -
> - g_free (emsg);
> - goto end;
> - }
> -
> - /* lower integrity on Vista/Win7+ */
> - if ((LOBYTE (g_win32_get_windows_version()) > 0x05) &&
> - !spice_win32_set_low_integrity (pipe, error))
> - goto end;
> -
> - np = SPICE_NAMED_PIPE (g_initable_new (SPICE_TYPE_NAMED_PIPE,
> - NULL, error, "handle", pipe, NULL));
> -
> -end:
> - LocalFree (dacl);
> -
> - return np;
> -}
> diff --git a/src/controller/win32-util.h b/src/controller/win32-util.h
> deleted file mode 100644
> index b24ac77..0000000
> --- a/src/controller/win32-util.h
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/*
> - Copyright (C) 2012 Red Hat, Inc.
> -
> - 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/>.
> -*/
> -#ifndef __WIN32_UTIL_H__
> -#define __WIN32_UTIL_H__
> -
> -#include <gio/gio.h>
> -#include "namedpipe.h"
> -
> -G_BEGIN_DECLS
> -
> -gboolean spice_win32_set_low_integrity (void* handle, GError **error);
> -SpiceNamedPipe* spice_win32_user_pipe_new (gchar *name, GError **error);
> -
> -G_END_DECLS
> -
> -#endif /* __WIN32_UTIL_H__ */
> --
> 2.14.0.rc0.1.g40ca67566
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170801/6b319790/attachment-0001.sig>
More information about the Spice-devel
mailing list