[Spice-devel] [PATCH spice 1/4] Split spice.h

Marc-André Lureau marcandre.lureau at gmail.com
Fri Oct 24 08:54:04 PDT 2014


Make it easier to read the Spice server API.
---
 server/Makefile.am       |  23 +-
 server/spice-audio.h     |  96 ++++++++
 server/spice-char.h      |  61 +++++
 server/spice-core.h      | 106 +++++++++
 server/spice-input.h     |  91 +++++++
 server/spice-migration.h |  64 +++++
 server/spice-qxl.h       | 191 +++++++++++++++
 server/spice-server.h    | 124 ++++++++++
 server/spice-version.h   |  27 +++
 server/spice.h           | 602 +++--------------------------------------------
 10 files changed, 808 insertions(+), 577 deletions(-)
 create mode 100644 server/spice-audio.h
 create mode 100644 server/spice-char.h
 create mode 100644 server/spice-core.h
 create mode 100644 server/spice-input.h
 create mode 100644 server/spice-migration.h
 create mode 100644 server/spice-qxl.h
 create mode 100644 server/spice-server.h
 create mode 100644 server/spice-version.h

diff --git a/server/Makefile.am b/server/Makefile.am
index 34219c8..f162a18 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -44,7 +44,22 @@ libspice_server_la_LIBADD =						\
 	$(SPICE_NONPKGCONFIG_LIBS)					\
 	$(NULL)
 
+libspice_serverincludedir = $(includedir)/spice-server
+libspice_serverinclude_HEADERS =		\
+	spice-audio.h				\
+	spice-char.h				\
+	spice-core.h				\
+	spice-experimental.h			\
+	spice-input.h				\
+	spice-migration.h			\
+	spice-qxl.h				\
+	spice-server.h				\
+	spice-version.h				\
+	spice.h					\
+	$(NULL)
+
 libspice_server_la_SOURCES =			\
+	$(libspice_serverinclude_HEADERS)	\
 	agent-msg-filter.c			\
 	agent-msg-filter.h			\
 	char_device.c				\
@@ -93,8 +108,6 @@ libspice_server_la_SOURCES =			\
 	reds_sw_canvas.h			\
 	snd_worker.c				\
 	snd_worker.h				\
-	spice-experimental.h			\
-	spice.h					\
 	stat.h					\
 	spicevmc.c				\
 	spice_timer_queue.c			\
@@ -122,12 +135,6 @@ libspice_server_la_SOURCES +=	\
 	$(NULL)
 endif
 
-libspice_serverincludedir = $(includedir)/spice-server
-libspice_serverinclude_HEADERS =		\
-	spice.h					\
-	spice-experimental.h			\
-	$(NULL)
-
 EXTRA_DIST =					\
 	glz_encode_match_tmpl.c			\
 	glz_encode_tmpl.c			\
diff --git a/server/spice-audio.h b/server/spice-audio.h
new file mode 100644
index 0000000..3de4a8d
--- /dev/null
+++ b/server/spice-audio.h
@@ -0,0 +1,96 @@
+/*
+ *  Copyright (C) 2009-2014 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_AUDIO_H_
+#define SPICE_AUDIO_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+/* sound interfaces */
+
+#define SPICE_INTERFACE_PLAYBACK "playback"
+#define SPICE_INTERFACE_PLAYBACK_MAJOR 1
+#define SPICE_INTERFACE_PLAYBACK_MINOR 3
+typedef struct SpicePlaybackInterface SpicePlaybackInterface;
+typedef struct SpicePlaybackInstance SpicePlaybackInstance;
+typedef struct SpicePlaybackState SpicePlaybackState;
+
+enum {
+    SPICE_INTERFACE_AUDIO_FMT_S16 = 1,
+};
+
+#define SPICE_INTERFACE_PLAYBACK_FREQ  44100
+#define SPICE_INTERFACE_PLAYBACK_CHAN  2
+#define SPICE_INTERFACE_PLAYBACK_FMT   SPICE_INTERFACE_AUDIO_FMT_S16
+
+struct SpicePlaybackInterface {
+    SpiceBaseInterface base;
+};
+
+struct SpicePlaybackInstance {
+    SpiceBaseInstance  base;
+    SpicePlaybackState *st;
+};
+
+void spice_server_playback_start(SpicePlaybackInstance *sin);
+void spice_server_playback_stop(SpicePlaybackInstance *sin);
+void spice_server_playback_get_buffer(SpicePlaybackInstance *sin,
+                                      uint32_t **samples, uint32_t *nsamples);
+void spice_server_playback_put_samples(SpicePlaybackInstance *sin,
+                                       uint32_t *samples);
+void spice_server_playback_set_volume(SpicePlaybackInstance *sin,
+                                      uint8_t nchannels, uint16_t *volume);
+void spice_server_playback_set_mute(SpicePlaybackInstance *sin, uint8_t mute);
+
+#define SPICE_INTERFACE_RECORD "record"
+#define SPICE_INTERFACE_RECORD_MAJOR 2
+#define SPICE_INTERFACE_RECORD_MINOR 3
+typedef struct SpiceRecordInterface SpiceRecordInterface;
+typedef struct SpiceRecordInstance SpiceRecordInstance;
+typedef struct SpiceRecordState SpiceRecordState;
+
+#define SPICE_INTERFACE_RECORD_FREQ  44100
+#define SPICE_INTERFACE_RECORD_CHAN  2
+#define SPICE_INTERFACE_RECORD_FMT   SPICE_INTERFACE_AUDIO_FMT_S16
+
+struct SpiceRecordInterface {
+    SpiceBaseInterface base;
+};
+
+struct SpiceRecordInstance {
+    SpiceBaseInstance base;
+    SpiceRecordState  *st;
+};
+
+void spice_server_record_start(SpiceRecordInstance *sin);
+void spice_server_record_stop(SpiceRecordInstance *sin);
+uint32_t spice_server_record_get_samples(SpiceRecordInstance *sin,
+                                         uint32_t *samples, uint32_t bufsize);
+void spice_server_record_set_volume(SpiceRecordInstance *sin,
+                                    uint8_t nchannels, uint16_t *volume);
+void spice_server_record_set_mute(SpiceRecordInstance *sin, uint8_t mute);
+
+uint32_t spice_server_get_best_playback_rate(SpicePlaybackInstance *sin);
+void     spice_server_set_playback_rate(SpicePlaybackInstance *sin, uint32_t frequency);
+uint32_t spice_server_get_best_record_rate(SpiceRecordInstance *sin);
+void     spice_server_set_record_rate(SpiceRecordInstance *sin, uint32_t frequency);
+
+#endif /* SPICE_AUDIO_H_ */
diff --git a/server/spice-char.h b/server/spice-char.h
new file mode 100644
index 0000000..efd685d
--- /dev/null
+++ b/server/spice-char.h
@@ -0,0 +1,61 @@
+/*
+ *  Copyright (C) 2009-2014 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_CHAR_H_
+#define SPICE_CHAR_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+/* char device interfaces */
+
+#define SPICE_INTERFACE_CHAR_DEVICE "char_device"
+#define SPICE_INTERFACE_CHAR_DEVICE_MAJOR 1
+#define SPICE_INTERFACE_CHAR_DEVICE_MINOR 3
+typedef struct SpiceCharDeviceInterface SpiceCharDeviceInterface;
+typedef struct SpiceCharDeviceInstance SpiceCharDeviceInstance;
+typedef struct SpiceCharDeviceState SpiceCharDeviceState;
+
+typedef enum {
+    SPICE_CHAR_DEVICE_NOTIFY_WRITABLE = 1 << 0,
+} spice_char_device_flags;
+
+struct SpiceCharDeviceInterface {
+    SpiceBaseInterface base;
+
+    void (*state)(SpiceCharDeviceInstance *sin, int connected);
+    int (*write)(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len);
+    int (*read)(SpiceCharDeviceInstance *sin, uint8_t *buf, int len);
+    void (*event)(SpiceCharDeviceInstance *sin, uint8_t event);
+    spice_char_device_flags flags;
+};
+
+struct SpiceCharDeviceInstance {
+    SpiceBaseInstance base;
+    const char* subtype;
+    SpiceCharDeviceState *st;
+    const char* portname;
+};
+
+void spice_server_char_device_wakeup(SpiceCharDeviceInstance *sin);
+void spice_server_port_event(SpiceCharDeviceInstance *char_device, uint8_t event);
+const char** spice_server_char_device_recognized_subtypes(void);
+
+#endif /* SPICE_CHAR_H_ */
diff --git a/server/spice-core.h b/server/spice-core.h
new file mode 100644
index 0000000..4d8f2ed
--- /dev/null
+++ b/server/spice-core.h
@@ -0,0 +1,106 @@
+/*
+ *  Copyright (C) 2009-2014 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_CORE_H_
+#define SPICE_CORE_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include <stdint.h>
+#include <sys/socket.h>
+#include <spice/qxl_dev.h>
+#include <spice/vd_agent.h>
+#include <spice/macros.h>
+
+#ifdef SPICE_SERVER_INTERNAL
+#undef SPICE_GNUC_DEPRECATED
+#define SPICE_GNUC_DEPRECATED
+#endif
+
+/* interface base type */
+
+typedef struct SpiceBaseInterface SpiceBaseInterface;
+typedef struct SpiceBaseInstance SpiceBaseInstance;
+
+struct SpiceBaseInterface {
+    const char *type;
+    const char *description;
+    uint32_t major_version;
+    uint32_t minor_version;
+};
+struct SpiceBaseInstance {
+    const SpiceBaseInterface *sif;
+};
+
+/* core interface */
+
+#define SPICE_INTERFACE_CORE "core"
+#define SPICE_INTERFACE_CORE_MAJOR 1
+#define SPICE_INTERFACE_CORE_MINOR 3
+typedef struct SpiceCoreInterface SpiceCoreInterface;
+
+#define SPICE_WATCH_EVENT_READ  (1 << 0)
+#define SPICE_WATCH_EVENT_WRITE (1 << 1)
+
+#define SPICE_CHANNEL_EVENT_CONNECTED     1
+#define SPICE_CHANNEL_EVENT_INITIALIZED   2
+#define SPICE_CHANNEL_EVENT_DISCONNECTED  3
+
+#define SPICE_CHANNEL_EVENT_FLAG_TLS      (1 << 0)
+#define SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT (1 << 1)
+
+typedef struct SpiceWatch SpiceWatch;
+typedef void (*SpiceWatchFunc)(int fd, int event, void *opaque);
+
+typedef struct SpiceTimer SpiceTimer;
+typedef void (*SpiceTimerFunc)(void *opaque);
+
+typedef struct SpiceChannelEventInfo {
+    int connection_id;
+    int type;
+    int id;
+    int flags;
+    /* deprecated, can't hold ipv6 addresses, kept for backward compatibility */
+    struct sockaddr laddr SPICE_GNUC_DEPRECATED;
+    struct sockaddr paddr SPICE_GNUC_DEPRECATED;
+    socklen_t llen SPICE_GNUC_DEPRECATED;
+    socklen_t plen SPICE_GNUC_DEPRECATED;
+    /* should be used if (flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) */
+    struct sockaddr_storage laddr_ext;
+    struct sockaddr_storage paddr_ext;
+    socklen_t llen_ext, plen_ext;
+} SpiceChannelEventInfo;
+
+struct SpiceCoreInterface {
+    SpiceBaseInterface base;
+
+    SpiceTimer *(*timer_add)(SpiceTimerFunc func, void *opaque);
+    void (*timer_start)(SpiceTimer *timer, uint32_t ms);
+    void (*timer_cancel)(SpiceTimer *timer);
+    void (*timer_remove)(SpiceTimer *timer);
+
+    SpiceWatch *(*watch_add)(int fd, int event_mask, SpiceWatchFunc func, void *opaque);
+    void (*watch_update_mask)(SpiceWatch *watch, int event_mask);
+    void (*watch_remove)(SpiceWatch *watch);
+
+    void (*channel_event)(int event, SpiceChannelEventInfo *info);
+};
+
+
+#endif /* SPICE_CORE_H_ */
diff --git a/server/spice-input.h b/server/spice-input.h
new file mode 100644
index 0000000..dc07c4f
--- /dev/null
+++ b/server/spice-input.h
@@ -0,0 +1,91 @@
+/*
+ *  Copyright (C) 2009-2014 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_INPUT_H_
+#define SPICE_INPUT_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+/* input interfaces */
+
+#define SPICE_INTERFACE_KEYBOARD "keyboard"
+#define SPICE_INTERFACE_KEYBOARD_MAJOR 1
+#define SPICE_INTERFACE_KEYBOARD_MINOR 1
+typedef struct SpiceKbdInterface SpiceKbdInterface;
+typedef struct SpiceKbdInstance SpiceKbdInstance;
+typedef struct SpiceKbdState SpiceKbdState;
+
+struct SpiceKbdInterface {
+    SpiceBaseInterface base;
+
+    void (*push_scan_freg)(SpiceKbdInstance *sin, uint8_t frag);
+    uint8_t (*get_leds)(SpiceKbdInstance *sin);
+};
+
+struct SpiceKbdInstance {
+    SpiceBaseInstance base;
+    SpiceKbdState     *st;
+};
+
+int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds);
+
+#define SPICE_INTERFACE_MOUSE "mouse"
+#define SPICE_INTERFACE_MOUSE_MAJOR 1
+#define SPICE_INTERFACE_MOUSE_MINOR 1
+typedef struct SpiceMouseInterface SpiceMouseInterface;
+typedef struct SpiceMouseInstance SpiceMouseInstance;
+typedef struct SpiceMouseState SpiceMouseState;
+
+struct SpiceMouseInterface {
+    SpiceBaseInterface base;
+
+    void (*motion)(SpiceMouseInstance *sin, int dx, int dy, int dz,
+                   uint32_t buttons_state);
+    void (*buttons)(SpiceMouseInstance *sin, uint32_t buttons_state);
+};
+
+struct SpiceMouseInstance {
+    SpiceBaseInstance base;
+    SpiceMouseState   *st;
+};
+
+#define SPICE_INTERFACE_TABLET "tablet"
+#define SPICE_INTERFACE_TABLET_MAJOR 1
+#define SPICE_INTERFACE_TABLET_MINOR 1
+typedef struct SpiceTabletInterface SpiceTabletInterface;
+typedef struct SpiceTabletInstance SpiceTabletInstance;
+typedef struct SpiceTabletState SpiceTabletState;
+
+struct SpiceTabletInterface {
+    SpiceBaseInterface base;
+
+    void (*set_logical_size)(SpiceTabletInstance* tablet, int width, int height);
+    void (*position)(SpiceTabletInstance* tablet, int x, int y, uint32_t buttons_state);
+    void (*wheel)(SpiceTabletInstance* tablet, int wheel_moution, uint32_t buttons_state);
+    void (*buttons)(SpiceTabletInstance* tablet, uint32_t buttons_state);
+};
+
+struct SpiceTabletInstance {
+    SpiceBaseInstance base;
+    SpiceTabletState  *st;
+};
+
+#endif /* SPICE_INPUT_H_ */
diff --git a/server/spice-migration.h b/server/spice-migration.h
new file mode 100644
index 0000000..e2fc92e
--- /dev/null
+++ b/server/spice-migration.h
@@ -0,0 +1,64 @@
+/*
+ *  Copyright (C) 2009-2014 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_MIGRATION_H_
+#define SPICE_MIGRATION_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+/* migration interface */
+#define SPICE_INTERFACE_MIGRATION "migration"
+#define SPICE_INTERFACE_MIGRATION_MAJOR 1
+#define SPICE_INTERFACE_MIGRATION_MINOR 1
+typedef struct SpiceMigrateInterface SpiceMigrateInterface;
+typedef struct SpiceMigrateInstance SpiceMigrateInstance;
+typedef struct SpiceMigrateState SpiceMigrateState;
+
+struct SpiceMigrateInterface {
+    SpiceBaseInterface base;
+    void (*migrate_connect_complete)(SpiceMigrateInstance *sin);
+    void (*migrate_end_complete)(SpiceMigrateInstance *sin);
+};
+
+struct SpiceMigrateInstance {
+    SpiceBaseInstance base;
+    SpiceMigrateState *st;
+};
+
+/* spice switch-host client migration */
+int spice_server_migrate_info(SpiceServer *s, const char* dest,
+                              int port, int secure_port,
+                              const char* cert_subject);
+int spice_server_migrate_switch(SpiceServer *s);
+
+/* server status */
+int spice_server_get_num_clients(SpiceServer *s);
+
+/* spice (semi-)seamless client migration */
+int spice_server_migrate_connect(SpiceServer *s, const char* dest,
+                                 int port, int secure_port,
+                                 const char* cert_subject);
+int spice_server_migrate_start(SpiceServer *s);
+int spice_server_migrate_end(SpiceServer *s, int completed);
+
+void spice_server_set_seamless_migration(SpiceServer *s, int enable);
+
+#endif /* SPICE_MIGRATION_H_ */
diff --git a/server/spice-qxl.h b/server/spice-qxl.h
new file mode 100644
index 0000000..9bfba95
--- /dev/null
+++ b/server/spice-qxl.h
@@ -0,0 +1,191 @@
+/*
+ *  Copyright (C) 2014 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_QXL_H_
+#define SPICE_QXL_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_COMPILATION)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+/* qxl interface */
+
+#define SPICE_INTERFACE_QXL "qxl"
+#define SPICE_INTERFACE_QXL_MAJOR 3
+#define SPICE_INTERFACE_QXL_MINOR 3
+typedef struct QXLInterface QXLInterface;
+typedef struct QXLInstance QXLInstance;
+typedef struct QXLState QXLState;
+typedef struct QXLWorker QXLWorker;
+typedef struct QXLDevMemSlot QXLDevMemSlot;
+typedef struct QXLDevSurfaceCreate QXLDevSurfaceCreate;
+struct QXLReleaseInfoExt;
+struct QXLCommand;
+struct QXLCommandExt;
+struct QXLRect;
+struct QXLWorker {
+    uint32_t minor_version;
+    uint32_t major_version;
+    /* These calls are deprecated. Please use the spice_qxl_* calls instead */
+    void (*wakeup)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*oom)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*start)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*stop)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*update_area)(QXLWorker *qxl_worker, uint32_t surface_id,
+                       struct QXLRect *area, struct QXLRect *dirty_rects,
+                       uint32_t num_dirty_rects, uint32_t clear_dirty_region) SPICE_GNUC_DEPRECATED;
+    void (*add_memslot)(QXLWorker *worker, QXLDevMemSlot *slot) SPICE_GNUC_DEPRECATED;
+    void (*del_memslot)(QXLWorker *worker, uint32_t slot_group_id, uint32_t slot_id) SPICE_GNUC_DEPRECATED;
+    void (*reset_memslots)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*destroy_surfaces)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*destroy_primary_surface)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
+    void (*create_primary_surface)(QXLWorker *worker, uint32_t surface_id,
+                                   QXLDevSurfaceCreate *surface) SPICE_GNUC_DEPRECATED;
+    void (*reset_image_cache)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*reset_cursor)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
+    void (*destroy_surface_wait)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
+    void (*loadvm_commands)(QXLWorker *worker, struct QXLCommandExt *ext, uint32_t count) SPICE_GNUC_DEPRECATED;
+};
+
+void spice_qxl_wakeup(QXLInstance *instance);
+void spice_qxl_oom(QXLInstance *instance);
+/* deprecated since 0.11.2, spice_server_vm_start replaces it */
+void spice_qxl_start(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
+/* deprecated since 0.11.2 spice_server_vm_stop replaces it */
+void spice_qxl_stop(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
+void spice_qxl_update_area(QXLInstance *instance, uint32_t surface_id,
+                   struct QXLRect *area, struct QXLRect *dirty_rects,
+                   uint32_t num_dirty_rects, uint32_t clear_dirty_region);
+void spice_qxl_add_memslot(QXLInstance *instance, QXLDevMemSlot *slot);
+void spice_qxl_del_memslot(QXLInstance *instance, uint32_t slot_group_id, uint32_t slot_id);
+void spice_qxl_reset_memslots(QXLInstance *instance);
+void spice_qxl_destroy_surfaces(QXLInstance *instance);
+void spice_qxl_destroy_primary_surface(QXLInstance *instance, uint32_t surface_id);
+void spice_qxl_create_primary_surface(QXLInstance *instance, uint32_t surface_id,
+                               QXLDevSurfaceCreate *surface);
+void spice_qxl_reset_image_cache(QXLInstance *instance);
+void spice_qxl_reset_cursor(QXLInstance *instance);
+void spice_qxl_destroy_surface_wait(QXLInstance *instance, uint32_t surface_id);
+void spice_qxl_loadvm_commands(QXLInstance *instance, struct QXLCommandExt *ext, uint32_t count);
+/* async versions of commands. when complete spice calls async_complete */
+void spice_qxl_update_area_async(QXLInstance *instance, uint32_t surface_id, QXLRect *qxl_area,
+                                 uint32_t clear_dirty_region, uint64_t cookie);
+void spice_qxl_add_memslot_async(QXLInstance *instance, QXLDevMemSlot *slot, uint64_t cookie);
+void spice_qxl_destroy_surfaces_async(QXLInstance *instance, uint64_t cookie);
+void spice_qxl_destroy_primary_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
+void spice_qxl_create_primary_surface_async(QXLInstance *instance, uint32_t surface_id,
+                                QXLDevSurfaceCreate *surface, uint64_t cookie);
+void spice_qxl_destroy_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
+/* suspend and resolution change on windows drivers */
+void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie);
+/* since spice 0.12.0 */
+void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
+                                     int group_id, uint64_t cookie);
+/* since spice 0.12.3 */
+void spice_qxl_driver_unload(QXLInstance *instance);
+
+typedef struct QXLDrawArea {
+    uint8_t *buf;
+    uint32_t size;
+    uint8_t *line_0;
+    uint32_t width;
+    uint32_t heigth;
+    int stride;
+} QXLDrawArea;
+
+typedef struct QXLDevInfo {
+    uint32_t x_res;
+    uint32_t y_res;
+    uint32_t bits;
+    uint32_t use_hardware_cursor;
+
+    QXLDrawArea draw_area;
+
+    uint32_t ram_size;
+} QXLDevInfo;
+
+typedef struct QXLDevInitInfo {
+    uint32_t num_memslots_groups;
+    uint32_t num_memslots;
+    uint8_t memslot_gen_bits;
+    uint8_t memslot_id_bits;
+    uint32_t qxl_ram_size;
+    uint8_t internal_groupslot_id;
+    uint32_t n_surfaces;
+} QXLDevInitInfo;
+
+struct QXLDevMemSlot {
+    uint32_t slot_group_id;
+    uint32_t slot_id;
+    uint32_t generation;
+    unsigned long virt_start;
+    unsigned long virt_end;
+    uint64_t addr_delta;
+    uint32_t qxl_ram_size;
+};
+
+struct QXLDevSurfaceCreate {
+    uint32_t width;
+    uint32_t height;
+    int32_t stride;
+    uint32_t format;
+    uint32_t position;
+    uint32_t mouse_mode;
+    uint32_t flags;
+    uint32_t type;
+    uint64_t mem;
+    uint32_t group_id;
+};
+
+struct QXLInterface {
+    SpiceBaseInterface base;
+
+    void (*attache_worker)(QXLInstance *qin, QXLWorker *qxl_worker);
+    void (*set_compression_level)(QXLInstance *qin, int level);
+    void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time);
+
+    void (*get_init_info)(QXLInstance *qin, QXLDevInitInfo *info);
+    int (*get_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
+    int (*req_cmd_notification)(QXLInstance *qin);
+    void (*release_resource)(QXLInstance *qin, struct QXLReleaseInfoExt release_info);
+    int (*get_cursor_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
+    int (*req_cursor_notification)(QXLInstance *qin);
+    void (*notify_update)(QXLInstance *qin, uint32_t update_id);
+    int (*flush_resources)(QXLInstance *qin);
+    void (*async_complete)(QXLInstance *qin, uint64_t cookie);
+    void (*update_area_complete)(QXLInstance *qin, uint32_t surface_id,
+                                 struct QXLRect *updated_rects,
+                                 uint32_t num_updated_rects);
+    void (*set_client_capabilities)(QXLInstance *qin,
+                                    uint8_t client_present,
+                                    uint8_t caps[58]);
+    /* returns 1 if the interface is supported, 0 otherwise.
+     * if monitors_config is NULL nothing is done except reporting the
+     * return code. */
+    int (*client_monitors_config)(QXLInstance *qin,
+                                  VDAgentMonitorsConfig *monitors_config);
+};
+
+struct QXLInstance {
+    SpiceBaseInstance  base;
+    int                id;
+    QXLState           *st;
+};
+
+#endif /* SPICE_QXL_H_ */
diff --git a/server/spice-server.h b/server/spice-server.h
new file mode 100644
index 0000000..ac63a94
--- /dev/null
+++ b/server/spice-server.h
@@ -0,0 +1,124 @@
+/*
+ *  Copyright (C) 2009-2014 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_SERVER_H_
+#define SPICE_SERVER_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+/* spice server setup */
+
+/* Don't use features incompatible with a specific spice
+   version, so that migration to/from that version works. */
+typedef enum {
+    SPICE_COMPAT_VERSION_0_4 = 0,
+    SPICE_COMPAT_VERSION_0_6 = 1,
+} spice_compat_version_t;
+
+#define SPICE_COMPAT_VERSION_CURRENT SPICE_COMPAT_VERSION_0_6
+
+spice_compat_version_t spice_get_current_compat_version(void);
+
+typedef struct RedsState SpiceServer;
+SpiceServer *spice_server_new(void);
+int spice_server_init(SpiceServer *s, SpiceCoreInterface *core);
+void spice_server_destroy(SpiceServer *s);
+
+#define SPICE_ADDR_FLAG_IPV4_ONLY (1 << 0)
+#define SPICE_ADDR_FLAG_IPV6_ONLY (1 << 1)
+
+int spice_server_set_compat_version(SpiceServer *s,
+                                    spice_compat_version_t version);
+int spice_server_set_port(SpiceServer *s, int port);
+void spice_server_set_addr(SpiceServer *s, const char *addr, int flags);
+int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd);
+int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag);
+int spice_server_set_noauth(SpiceServer *s);
+int spice_server_set_sasl(SpiceServer *s, int enabled);
+int spice_server_set_sasl_appname(SpiceServer *s, const char *appname);
+int spice_server_set_ticket(SpiceServer *s, const char *passwd, int lifetime,
+                            int fail_if_connected, int disconnect_if_connected);
+int spice_server_set_tls(SpiceServer *s, int port,
+                         const char *ca_cert_file, const char *certs_file,
+                         const char *private_key_file, const char *key_passwd,
+                         const char *dh_key_file, const char *ciphersuite);
+
+int spice_server_add_client(SpiceServer *s, int socket, int skip_auth);
+int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth);
+
+int spice_server_add_interface(SpiceServer *s,
+                               SpiceBaseInstance *sin);
+int spice_server_remove_interface(SpiceBaseInstance *sin);
+
+typedef enum {
+    SPICE_IMAGE_COMPRESS_INVALID  = 0,
+    SPICE_IMAGE_COMPRESS_OFF      = 1,
+    SPICE_IMAGE_COMPRESS_AUTO_GLZ = 2,
+    SPICE_IMAGE_COMPRESS_AUTO_LZ  = 3,
+    SPICE_IMAGE_COMPRESS_QUIC     = 4,
+    SPICE_IMAGE_COMPRESS_GLZ      = 5,
+    SPICE_IMAGE_COMPRESS_LZ       = 6,
+} spice_image_compression_t;
+
+int spice_server_set_image_compression(SpiceServer *s,
+                                       spice_image_compression_t comp);
+spice_image_compression_t spice_server_get_image_compression(SpiceServer *s);
+
+typedef enum {
+    SPICE_WAN_COMPRESSION_INVALID,
+    SPICE_WAN_COMPRESSION_AUTO,
+    SPICE_WAN_COMPRESSION_ALWAYS,
+    SPICE_WAN_COMPRESSION_NEVER,
+} spice_wan_compression_t;
+
+int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp);
+int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp);
+
+#define SPICE_CHANNEL_SECURITY_NONE (1 << 0)
+#define SPICE_CHANNEL_SECURITY_SSL (1 << 1)
+
+int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security);
+
+int spice_server_add_renderer(SpiceServer *s, const char *name);
+
+enum {
+    SPICE_STREAM_VIDEO_INVALID,
+    SPICE_STREAM_VIDEO_OFF,
+    SPICE_STREAM_VIDEO_ALL,
+    SPICE_STREAM_VIDEO_FILTER
+};
+
+int spice_server_set_streaming_video(SpiceServer *s, int value);
+int spice_server_set_playback_compression(SpiceServer *s, int enable);
+int spice_server_set_agent_mouse(SpiceServer *s, int enable);
+int spice_server_set_agent_copypaste(SpiceServer *s, int enable);
+int spice_server_set_agent_file_xfer(SpiceServer *s, int enable);
+
+int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
+int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
+
+int spice_server_is_server_mouse(SpiceServer *s);
+
+void spice_server_set_name(SpiceServer *s, const char *name);
+void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid[16]);
+
+void spice_server_vm_start(SpiceServer *s);
+void spice_server_vm_stop(SpiceServer *s);
+
+#endif /* SPICE_SERVER_H_ */
diff --git a/server/spice-version.h b/server/spice-version.h
new file mode 100644
index 0000000..b5c8eb0
--- /dev/null
+++ b/server/spice-version.h
@@ -0,0 +1,27 @@
+/*
+ *  Copyright (C) 2009-2014 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_VERSION_H_
+#define SPICE_VERSION_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#define SPICE_SERVER_VERSION 0x000c06 /* release 0.12.6 */
+
+#endif /* SPICE_VERSION_H_ */
diff --git a/server/spice.h b/server/spice.h
index 84f9696..bd533b3 100644
--- a/server/spice.h
+++ b/server/spice.h
@@ -1,570 +1,34 @@
 /*
-   Copyright (C) 2009 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 _H_SPICE
-#define _H_SPICE
-
-#include <stdint.h>
-#include <sys/socket.h>
-#include <spice/qxl_dev.h>
-#include <spice/vd_agent.h>
-#include <spice/macros.h>
-
-#define SPICE_SERVER_VERSION 0x000c06 /* release 0.12.6 */
-
-#ifdef SPICE_SERVER_INTERNAL
-#undef SPICE_GNUC_DEPRECATED
-#define SPICE_GNUC_DEPRECATED
-#endif
-
-/* interface base type */
-
-typedef struct SpiceBaseInterface SpiceBaseInterface;
-typedef struct SpiceBaseInstance SpiceBaseInstance;
-
-struct SpiceBaseInterface {
-    const char *type;
-    const char *description;
-    uint32_t major_version;
-    uint32_t minor_version;
-};
-struct SpiceBaseInstance {
-    const SpiceBaseInterface *sif;
-};
-
-/* core interface */
-
-#define SPICE_INTERFACE_CORE "core"
-#define SPICE_INTERFACE_CORE_MAJOR 1
-#define SPICE_INTERFACE_CORE_MINOR 3
-typedef struct SpiceCoreInterface SpiceCoreInterface;
-
-#define SPICE_WATCH_EVENT_READ  (1 << 0)
-#define SPICE_WATCH_EVENT_WRITE (1 << 1)
-
-#define SPICE_CHANNEL_EVENT_CONNECTED     1
-#define SPICE_CHANNEL_EVENT_INITIALIZED   2
-#define SPICE_CHANNEL_EVENT_DISCONNECTED  3
-
-#define SPICE_CHANNEL_EVENT_FLAG_TLS      (1 << 0)
-#define SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT (1 << 1)
-
-typedef struct SpiceWatch SpiceWatch;
-typedef void (*SpiceWatchFunc)(int fd, int event, void *opaque);
-
-typedef struct SpiceTimer SpiceTimer;
-typedef void (*SpiceTimerFunc)(void *opaque);
-
-typedef struct SpiceChannelEventInfo {
-    int connection_id;
-    int type;
-    int id;
-    int flags;
-    /* deprecated, can't hold ipv6 addresses, kept for backward compatibility */
-    struct sockaddr laddr SPICE_GNUC_DEPRECATED;
-    struct sockaddr paddr SPICE_GNUC_DEPRECATED;
-    socklen_t llen SPICE_GNUC_DEPRECATED;
-    socklen_t plen SPICE_GNUC_DEPRECATED;
-    /* should be used if (flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) */
-    struct sockaddr_storage laddr_ext;
-    struct sockaddr_storage paddr_ext;
-    socklen_t llen_ext, plen_ext;
-} SpiceChannelEventInfo;
-
-struct SpiceCoreInterface {
-    SpiceBaseInterface base;
-
-    SpiceTimer *(*timer_add)(SpiceTimerFunc func, void *opaque);
-    void (*timer_start)(SpiceTimer *timer, uint32_t ms);
-    void (*timer_cancel)(SpiceTimer *timer);
-    void (*timer_remove)(SpiceTimer *timer);
-
-    SpiceWatch *(*watch_add)(int fd, int event_mask, SpiceWatchFunc func, void *opaque);
-    void (*watch_update_mask)(SpiceWatch *watch, int event_mask);
-    void (*watch_remove)(SpiceWatch *watch);
-
-    void (*channel_event)(int event, SpiceChannelEventInfo *info);
-};
-
-/* qxl interface */
-
-#define SPICE_INTERFACE_QXL "qxl"
-#define SPICE_INTERFACE_QXL_MAJOR 3
-#define SPICE_INTERFACE_QXL_MINOR 3
-typedef struct QXLInterface QXLInterface;
-typedef struct QXLInstance QXLInstance;
-typedef struct QXLState QXLState;
-typedef struct QXLWorker QXLWorker;
-typedef struct QXLDevMemSlot QXLDevMemSlot;
-typedef struct QXLDevSurfaceCreate QXLDevSurfaceCreate;
-struct QXLReleaseInfoExt;
-struct QXLCommand;
-struct QXLCommandExt;
-struct QXLRect;
-struct QXLWorker {
-    uint32_t minor_version;
-    uint32_t major_version;
-    /* These calls are deprecated. Please use the spice_qxl_* calls instead */
-    void (*wakeup)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*oom)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*start)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*stop)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*update_area)(QXLWorker *qxl_worker, uint32_t surface_id,
-                       struct QXLRect *area, struct QXLRect *dirty_rects,
-                       uint32_t num_dirty_rects, uint32_t clear_dirty_region) SPICE_GNUC_DEPRECATED;
-    void (*add_memslot)(QXLWorker *worker, QXLDevMemSlot *slot) SPICE_GNUC_DEPRECATED;
-    void (*del_memslot)(QXLWorker *worker, uint32_t slot_group_id, uint32_t slot_id) SPICE_GNUC_DEPRECATED;
-    void (*reset_memslots)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*destroy_surfaces)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*destroy_primary_surface)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
-    void (*create_primary_surface)(QXLWorker *worker, uint32_t surface_id,
-                                   QXLDevSurfaceCreate *surface) SPICE_GNUC_DEPRECATED;
-    void (*reset_image_cache)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*reset_cursor)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
-    void (*destroy_surface_wait)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
-    void (*loadvm_commands)(QXLWorker *worker, struct QXLCommandExt *ext, uint32_t count) SPICE_GNUC_DEPRECATED;
-};
-
-void spice_qxl_wakeup(QXLInstance *instance);
-void spice_qxl_oom(QXLInstance *instance);
-/* deprecated since 0.11.2, spice_server_vm_start replaces it */
-void spice_qxl_start(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
-/* deprecated since 0.11.2 spice_server_vm_stop replaces it */
-void spice_qxl_stop(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
-void spice_qxl_update_area(QXLInstance *instance, uint32_t surface_id,
-                   struct QXLRect *area, struct QXLRect *dirty_rects,
-                   uint32_t num_dirty_rects, uint32_t clear_dirty_region);
-void spice_qxl_add_memslot(QXLInstance *instance, QXLDevMemSlot *slot);
-void spice_qxl_del_memslot(QXLInstance *instance, uint32_t slot_group_id, uint32_t slot_id);
-void spice_qxl_reset_memslots(QXLInstance *instance);
-void spice_qxl_destroy_surfaces(QXLInstance *instance);
-void spice_qxl_destroy_primary_surface(QXLInstance *instance, uint32_t surface_id);
-void spice_qxl_create_primary_surface(QXLInstance *instance, uint32_t surface_id,
-                               QXLDevSurfaceCreate *surface);
-void spice_qxl_reset_image_cache(QXLInstance *instance);
-void spice_qxl_reset_cursor(QXLInstance *instance);
-void spice_qxl_destroy_surface_wait(QXLInstance *instance, uint32_t surface_id);
-void spice_qxl_loadvm_commands(QXLInstance *instance, struct QXLCommandExt *ext, uint32_t count);
-/* async versions of commands. when complete spice calls async_complete */
-void spice_qxl_update_area_async(QXLInstance *instance, uint32_t surface_id, QXLRect *qxl_area,
-                                 uint32_t clear_dirty_region, uint64_t cookie);
-void spice_qxl_add_memslot_async(QXLInstance *instance, QXLDevMemSlot *slot, uint64_t cookie);
-void spice_qxl_destroy_surfaces_async(QXLInstance *instance, uint64_t cookie);
-void spice_qxl_destroy_primary_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
-void spice_qxl_create_primary_surface_async(QXLInstance *instance, uint32_t surface_id,
-                                QXLDevSurfaceCreate *surface, uint64_t cookie);
-void spice_qxl_destroy_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
-/* suspend and resolution change on windows drivers */
-void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie);
-/* since spice 0.12.0 */
-void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
-                                     int group_id, uint64_t cookie);
-/* since spice 0.12.3 */
-void spice_qxl_driver_unload(QXLInstance *instance);
-
-typedef struct QXLDrawArea {
-    uint8_t *buf;
-    uint32_t size;
-    uint8_t *line_0;
-    uint32_t width;
-    uint32_t heigth;
-    int stride;
-} QXLDrawArea;
-
-typedef struct QXLDevInfo {
-    uint32_t x_res;
-    uint32_t y_res;
-    uint32_t bits;
-    uint32_t use_hardware_cursor;
-
-    QXLDrawArea draw_area;
-
-    uint32_t ram_size;
-} QXLDevInfo;
-
-typedef struct QXLDevInitInfo {
-    uint32_t num_memslots_groups;
-    uint32_t num_memslots;
-    uint8_t memslot_gen_bits;
-    uint8_t memslot_id_bits;
-    uint32_t qxl_ram_size;
-    uint8_t internal_groupslot_id;
-    uint32_t n_surfaces;
-} QXLDevInitInfo;
-
-struct QXLDevMemSlot {
-    uint32_t slot_group_id;
-    uint32_t slot_id;
-    uint32_t generation;
-    unsigned long virt_start;
-    unsigned long virt_end;
-    uint64_t addr_delta;
-    uint32_t qxl_ram_size;
-};
-
-struct QXLDevSurfaceCreate {
-    uint32_t width;
-    uint32_t height;
-    int32_t stride;
-    uint32_t format;
-    uint32_t position;
-    uint32_t mouse_mode;
-    uint32_t flags;
-    uint32_t type;
-    uint64_t mem;
-    uint32_t group_id;
-};
-
-struct QXLInterface {
-    SpiceBaseInterface base;
-
-    void (*attache_worker)(QXLInstance *qin, QXLWorker *qxl_worker);
-    void (*set_compression_level)(QXLInstance *qin, int level);
-    void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time);
-
-    void (*get_init_info)(QXLInstance *qin, QXLDevInitInfo *info);
-    int (*get_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
-    int (*req_cmd_notification)(QXLInstance *qin);
-    void (*release_resource)(QXLInstance *qin, struct QXLReleaseInfoExt release_info);
-    int (*get_cursor_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
-    int (*req_cursor_notification)(QXLInstance *qin);
-    void (*notify_update)(QXLInstance *qin, uint32_t update_id);
-    int (*flush_resources)(QXLInstance *qin);
-    void (*async_complete)(QXLInstance *qin, uint64_t cookie);
-    void (*update_area_complete)(QXLInstance *qin, uint32_t surface_id,
-                                 struct QXLRect *updated_rects,
-                                 uint32_t num_updated_rects);
-    void (*set_client_capabilities)(QXLInstance *qin,
-                                    uint8_t client_present,
-                                    uint8_t caps[58]);
-    /* returns 1 if the interface is supported, 0 otherwise.
-     * if monitors_config is NULL nothing is done except reporting the
-     * return code. */
-    int (*client_monitors_config)(QXLInstance *qin,
-                                  VDAgentMonitorsConfig *monitors_config);
-};
-
-struct QXLInstance {
-    SpiceBaseInstance  base;
-    int                id;
-    QXLState           *st;
-};
-
-/* input interfaces */
-
-#define SPICE_INTERFACE_KEYBOARD "keyboard"
-#define SPICE_INTERFACE_KEYBOARD_MAJOR 1
-#define SPICE_INTERFACE_KEYBOARD_MINOR 1
-typedef struct SpiceKbdInterface SpiceKbdInterface;
-typedef struct SpiceKbdInstance SpiceKbdInstance;
-typedef struct SpiceKbdState SpiceKbdState;
-
-struct SpiceKbdInterface {
-    SpiceBaseInterface base;
-
-    void (*push_scan_freg)(SpiceKbdInstance *sin, uint8_t frag);
-    uint8_t (*get_leds)(SpiceKbdInstance *sin);
-};
-
-struct SpiceKbdInstance {
-    SpiceBaseInstance base;
-    SpiceKbdState     *st;
-};
-
-int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds);
-
-#define SPICE_INTERFACE_MOUSE "mouse"
-#define SPICE_INTERFACE_MOUSE_MAJOR 1
-#define SPICE_INTERFACE_MOUSE_MINOR 1
-typedef struct SpiceMouseInterface SpiceMouseInterface;
-typedef struct SpiceMouseInstance SpiceMouseInstance;
-typedef struct SpiceMouseState SpiceMouseState;
-
-struct SpiceMouseInterface {
-    SpiceBaseInterface base;
-
-    void (*motion)(SpiceMouseInstance *sin, int dx, int dy, int dz,
-                   uint32_t buttons_state);
-    void (*buttons)(SpiceMouseInstance *sin, uint32_t buttons_state);
-};
-
-struct SpiceMouseInstance {
-    SpiceBaseInstance base;
-    SpiceMouseState   *st;
-};
-
-#define SPICE_INTERFACE_TABLET "tablet"
-#define SPICE_INTERFACE_TABLET_MAJOR 1
-#define SPICE_INTERFACE_TABLET_MINOR 1
-typedef struct SpiceTabletInterface SpiceTabletInterface;
-typedef struct SpiceTabletInstance SpiceTabletInstance;
-typedef struct SpiceTabletState SpiceTabletState;
-
-struct SpiceTabletInterface {
-    SpiceBaseInterface base;
-
-    void (*set_logical_size)(SpiceTabletInstance* tablet, int width, int height);
-    void (*position)(SpiceTabletInstance* tablet, int x, int y, uint32_t buttons_state);
-    void (*wheel)(SpiceTabletInstance* tablet, int wheel_moution, uint32_t buttons_state);
-    void (*buttons)(SpiceTabletInstance* tablet, uint32_t buttons_state);
-};
-
-struct SpiceTabletInstance {
-    SpiceBaseInstance base;
-    SpiceTabletState  *st;
-};
-
-/* sound interfaces */
-
-#define SPICE_INTERFACE_PLAYBACK "playback"
-#define SPICE_INTERFACE_PLAYBACK_MAJOR 1
-#define SPICE_INTERFACE_PLAYBACK_MINOR 3
-typedef struct SpicePlaybackInterface SpicePlaybackInterface;
-typedef struct SpicePlaybackInstance SpicePlaybackInstance;
-typedef struct SpicePlaybackState SpicePlaybackState;
-
-enum {
-    SPICE_INTERFACE_AUDIO_FMT_S16 = 1,
-};
-
-#define SPICE_INTERFACE_PLAYBACK_FREQ  44100
-#define SPICE_INTERFACE_PLAYBACK_CHAN  2
-#define SPICE_INTERFACE_PLAYBACK_FMT   SPICE_INTERFACE_AUDIO_FMT_S16
-
-struct SpicePlaybackInterface {
-    SpiceBaseInterface base;
-};
-
-struct SpicePlaybackInstance {
-    SpiceBaseInstance  base;
-    SpicePlaybackState *st;
-};
-
-void spice_server_playback_start(SpicePlaybackInstance *sin);
-void spice_server_playback_stop(SpicePlaybackInstance *sin);
-void spice_server_playback_get_buffer(SpicePlaybackInstance *sin,
-                                      uint32_t **samples, uint32_t *nsamples);
-void spice_server_playback_put_samples(SpicePlaybackInstance *sin,
-                                       uint32_t *samples);
-void spice_server_playback_set_volume(SpicePlaybackInstance *sin,
-                                      uint8_t nchannels, uint16_t *volume);
-void spice_server_playback_set_mute(SpicePlaybackInstance *sin, uint8_t mute);
-
-#define SPICE_INTERFACE_RECORD "record"
-#define SPICE_INTERFACE_RECORD_MAJOR 2
-#define SPICE_INTERFACE_RECORD_MINOR 3
-typedef struct SpiceRecordInterface SpiceRecordInterface;
-typedef struct SpiceRecordInstance SpiceRecordInstance;
-typedef struct SpiceRecordState SpiceRecordState;
-
-#define SPICE_INTERFACE_RECORD_FREQ  44100
-#define SPICE_INTERFACE_RECORD_CHAN  2
-#define SPICE_INTERFACE_RECORD_FMT   SPICE_INTERFACE_AUDIO_FMT_S16
-
-struct SpiceRecordInterface {
-    SpiceBaseInterface base;
-};
-
-struct SpiceRecordInstance {
-    SpiceBaseInstance base;
-    SpiceRecordState  *st;
-};
-
-void spice_server_record_start(SpiceRecordInstance *sin);
-void spice_server_record_stop(SpiceRecordInstance *sin);
-uint32_t spice_server_record_get_samples(SpiceRecordInstance *sin,
-                                         uint32_t *samples, uint32_t bufsize);
-void spice_server_record_set_volume(SpiceRecordInstance *sin,
-                                    uint8_t nchannels, uint16_t *volume);
-void spice_server_record_set_mute(SpiceRecordInstance *sin, uint8_t mute);
-
-uint32_t spice_server_get_best_playback_rate(SpicePlaybackInstance *sin);
-void     spice_server_set_playback_rate(SpicePlaybackInstance *sin, uint32_t frequency);
-uint32_t spice_server_get_best_record_rate(SpiceRecordInstance *sin);
-void     spice_server_set_record_rate(SpiceRecordInstance *sin, uint32_t frequency);
-
-/* char device interfaces */
-
-#define SPICE_INTERFACE_CHAR_DEVICE "char_device"
-#define SPICE_INTERFACE_CHAR_DEVICE_MAJOR 1
-#define SPICE_INTERFACE_CHAR_DEVICE_MINOR 3
-typedef struct SpiceCharDeviceInterface SpiceCharDeviceInterface;
-typedef struct SpiceCharDeviceInstance SpiceCharDeviceInstance;
-typedef struct SpiceCharDeviceState SpiceCharDeviceState;
-
-typedef enum {
-    SPICE_CHAR_DEVICE_NOTIFY_WRITABLE = 1 << 0,
-} spice_char_device_flags;
-
-struct SpiceCharDeviceInterface {
-    SpiceBaseInterface base;
-
-    void (*state)(SpiceCharDeviceInstance *sin, int connected);
-    int (*write)(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len);
-    int (*read)(SpiceCharDeviceInstance *sin, uint8_t *buf, int len);
-    void (*event)(SpiceCharDeviceInstance *sin, uint8_t event);
-    spice_char_device_flags flags;
-};
-
-struct SpiceCharDeviceInstance {
-    SpiceBaseInstance base;
-    const char* subtype;
-    SpiceCharDeviceState *st;
-    const char* portname;
-};
-
-void spice_server_char_device_wakeup(SpiceCharDeviceInstance *sin);
-void spice_server_port_event(SpiceCharDeviceInstance *char_device, uint8_t event);
-const char** spice_server_char_device_recognized_subtypes(void);
-
-/* spice server setup */
-
-/* Don't use features incompatible with a specific spice
-   version, so that migration to/from that version works. */
-typedef enum {
-    SPICE_COMPAT_VERSION_0_4 = 0,
-    SPICE_COMPAT_VERSION_0_6 = 1,
-} spice_compat_version_t;
-
-#define SPICE_COMPAT_VERSION_CURRENT SPICE_COMPAT_VERSION_0_6
-
-spice_compat_version_t spice_get_current_compat_version(void);
-
-typedef struct RedsState SpiceServer;
-SpiceServer *spice_server_new(void);
-int spice_server_init(SpiceServer *s, SpiceCoreInterface *core);
-void spice_server_destroy(SpiceServer *s);
-
-#define SPICE_ADDR_FLAG_IPV4_ONLY (1 << 0)
-#define SPICE_ADDR_FLAG_IPV6_ONLY (1 << 1)
-
-int spice_server_set_compat_version(SpiceServer *s,
-                                    spice_compat_version_t version);
-int spice_server_set_port(SpiceServer *s, int port);
-void spice_server_set_addr(SpiceServer *s, const char *addr, int flags);
-int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd);
-int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag);
-int spice_server_set_noauth(SpiceServer *s);
-int spice_server_set_sasl(SpiceServer *s, int enabled);
-int spice_server_set_sasl_appname(SpiceServer *s, const char *appname);
-int spice_server_set_ticket(SpiceServer *s, const char *passwd, int lifetime,
-                            int fail_if_connected, int disconnect_if_connected);
-int spice_server_set_tls(SpiceServer *s, int port,
-                         const char *ca_cert_file, const char *certs_file,
-                         const char *private_key_file, const char *key_passwd,
-                         const char *dh_key_file, const char *ciphersuite);
-
-int spice_server_add_client(SpiceServer *s, int socket, int skip_auth);
-int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth);
-
-int spice_server_add_interface(SpiceServer *s,
-                               SpiceBaseInstance *sin);
-int spice_server_remove_interface(SpiceBaseInstance *sin);
-
-typedef enum {
-    SPICE_IMAGE_COMPRESS_INVALID  = 0,
-    SPICE_IMAGE_COMPRESS_OFF      = 1,
-    SPICE_IMAGE_COMPRESS_AUTO_GLZ = 2,
-    SPICE_IMAGE_COMPRESS_AUTO_LZ  = 3,
-    SPICE_IMAGE_COMPRESS_QUIC     = 4,
-    SPICE_IMAGE_COMPRESS_GLZ      = 5,
-    SPICE_IMAGE_COMPRESS_LZ       = 6,
-} spice_image_compression_t;
-
-int spice_server_set_image_compression(SpiceServer *s,
-                                       spice_image_compression_t comp);
-spice_image_compression_t spice_server_get_image_compression(SpiceServer *s);
-
-typedef enum {
-    SPICE_WAN_COMPRESSION_INVALID,
-    SPICE_WAN_COMPRESSION_AUTO,
-    SPICE_WAN_COMPRESSION_ALWAYS,
-    SPICE_WAN_COMPRESSION_NEVER,
-} spice_wan_compression_t;
-
-int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp);
-int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp);
-
-#define SPICE_CHANNEL_SECURITY_NONE (1 << 0)
-#define SPICE_CHANNEL_SECURITY_SSL (1 << 1)
-
-int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security);
-
-int spice_server_add_renderer(SpiceServer *s, const char *name);
-
-enum {
-    SPICE_STREAM_VIDEO_INVALID,
-    SPICE_STREAM_VIDEO_OFF,
-    SPICE_STREAM_VIDEO_ALL,
-    SPICE_STREAM_VIDEO_FILTER
-};
-
-int spice_server_set_streaming_video(SpiceServer *s, int value);
-int spice_server_set_playback_compression(SpiceServer *s, int enable);
-int spice_server_set_agent_mouse(SpiceServer *s, int enable);
-int spice_server_set_agent_copypaste(SpiceServer *s, int enable);
-int spice_server_set_agent_file_xfer(SpiceServer *s, int enable);
-
-int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
-int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
-
-int spice_server_is_server_mouse(SpiceServer *s);
-
-/* migration interface */
-#define SPICE_INTERFACE_MIGRATION "migration"
-#define SPICE_INTERFACE_MIGRATION_MAJOR 1
-#define SPICE_INTERFACE_MIGRATION_MINOR 1
-typedef struct SpiceMigrateInterface SpiceMigrateInterface;
-typedef struct SpiceMigrateInstance SpiceMigrateInstance;
-typedef struct SpiceMigrateState SpiceMigrateState;
-
-struct SpiceMigrateInterface {
-    SpiceBaseInterface base;
-    void (*migrate_connect_complete)(SpiceMigrateInstance *sin);
-    void (*migrate_end_complete)(SpiceMigrateInstance *sin);
-};
-
-struct SpiceMigrateInstance {
-    SpiceBaseInstance base;
-    SpiceMigrateState *st;
-};
-
-/* spice switch-host client migration */
-int spice_server_migrate_info(SpiceServer *s, const char* dest,
-                              int port, int secure_port,
-                              const char* cert_subject);
-int spice_server_migrate_switch(SpiceServer *s);
-
-/* server status */
-int spice_server_get_num_clients(SpiceServer *s);
-
-/* spice (semi-)seamless client migration */
-int spice_server_migrate_connect(SpiceServer *s, const char* dest,
-                                 int port, int secure_port,
-                                 const char* cert_subject);
-int spice_server_migrate_start(SpiceServer *s);
-int spice_server_migrate_end(SpiceServer *s, int completed);
-
-void spice_server_set_seamless_migration(SpiceServer *s, int enable);
-
-void spice_server_set_name(SpiceServer *s, const char *name);
-void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid[16]);
-
-void spice_server_vm_start(SpiceServer *s);
-void spice_server_vm_stop(SpiceServer *s);
-
-#endif
+ *  Copyright (C) 2009-2014 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_H_
+#define SPICE_H_
+
+#define SPICE_H_INSIDE
+
+#include "spice-version.h"
+#include "spice-core.h"
+#include "spice-server.h"
+#include "spice-qxl.h"
+#include "spice-input.h"
+#include "spice-audio.h"
+#include "spice-char.h"
+#include "spice-migration.h"
+
+#undef SPICE_H_INSIDE
+
+#endif /* SPICE_H_ */
-- 
1.9.3



More information about the Spice-devel mailing list