[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