59
#if GLIB_CHECK_VERSION(2, 31, 0)
60
#define g_mutex_new() g_new0(GMutex, 1)
61
#define g_mutex_free(m) g_free(m)
62
67
struct coroutine *context;
71
VNC_CONNECTION_SERVER_MESSAGE_FRAMEBUFFER_UPDATE = 0,
72
VNC_CONNECTION_SERVER_MESSAGE_SET_COLOR_MAP_ENTRIES = 1,
73
VNC_CONNECTION_SERVER_MESSAGE_BELL = 2,
74
VNC_CONNECTION_SERVER_MESSAGE_SERVER_CUT_TEXT = 3,
75
VNC_CONNECTION_SERVER_MESSAGE_QEMU = 255,
76
} VncConnectionServerMessage;
79
VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO = 1,
80
} VncConnectionServerMessageQEMU;
83
VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO_STOP = 0,
84
VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO_START = 1,
85
VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO_DATA = 2,
86
} VncConnectionServerMessageQEMUAudio;
90
VNC_CONNECTION_CLIENT_MESSAGE_SET_PIXEL_FORMAT = 0,
91
VNC_CONNECTION_CLIENT_MESSAGE_SET_ENCODINGS = 2,
92
VNC_CONNECTION_CLIENT_MESSAGE_FRAMEBUFFER_UPDATE_REQUEST = 3,
93
VNC_CONNECTION_CLIENT_MESSAGE_KEY = 4,
94
VNC_CONNECTION_CLIENT_MESSAGE_POINTER = 5,
95
VNC_CONNECTION_CLIENT_MESSAGE_CUT_TEXT = 6,
96
VNC_CONNECTION_CLIENT_MESSAGE_QEMU = 255,
97
} VncConnectionClientMessage;
100
VNC_CONNECTION_CLIENT_MESSAGE_QEMU_KEY = 0,
101
VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO = 1,
102
} VncConnectionClientMessageQEMU;
105
VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO_ENABLE = 0,
106
VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO_DISABLE = 1,
107
VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO_SET_FORMAT = 2,
108
} VncConnectionClientMessageQEMUAudio;
66
111
typedef void vnc_connection_rich_cursor_blt_func(VncConnection *conn, guint8 *, guint8 *,
67
112
guint8 *, int, guint16, guint16);
685
734
//VNC_DEBUG("Read SASL %p size %d offset %d", priv->saslDecoded,
686
735
// priv->saslDecodedLength, priv->saslDecodedOffset);
687
736
if (priv->saslDecoded == NULL) {
689
int encodedLen = sizeof(encoded);
742
encoded = g_new0(char, encodedLen);
692
744
ret = vnc_connection_read_wire(conn, encoded, encodedLen);
697
750
err = sasl_decode(priv->saslconn, encoded, ret,
698
751
&priv->saslDecoded, &priv->saslDecodedLength);
699
753
if (err != SASL_OK) {
700
754
VNC_DEBUG("Failed to decode SASL data %s",
701
755
sasl_errstring(err, NULL, NULL));
1470
1524
VncConnectionPrivate *priv = conn->priv;
1471
1525
guint8 pad[3] = {0};
1473
vnc_connection_buffered_write_u8(conn, 0);
1527
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_SET_PIXEL_FORMAT);
1474
1528
vnc_connection_buffered_write(conn, pad, 3);
1476
1530
vnc_connection_buffered_write_u8(conn, fmt->bits_per_pixel);
1515
1569
VncConnectionPrivate *priv = conn->priv;
1517
vnc_connection_buffered_write_u8(conn, 255);
1518
vnc_connection_buffered_write_u8(conn, 1); /* VNC_CONNECTION_QEMU_AUDIO */
1519
vnc_connection_buffered_write_u16(conn, 2); /* VNC_CONNECTION_QEMU_AUDIO_SET_FORMAT */
1571
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU);
1572
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO);
1573
vnc_connection_buffered_write_u16(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO_SET_FORMAT);
1521
1575
vnc_connection_buffered_write_u8(conn, priv->audio_format.format);
1522
1576
vnc_connection_buffered_write_u8(conn, priv->audio_format.nchannels);
1554
1608
if (priv->has_audio)
1556
vnc_connection_buffered_write_u8(conn, 255); /* QEMU message */
1557
vnc_connection_buffered_write_u8(conn, 1); /* VNC_CONNECTION_QEMU_AUDIO */
1558
vnc_connection_buffered_write_u16(conn, 0); /* VNC_CONNECTION_QEMU_AUDIO_ENABLE */
1610
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU);
1611
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO);
1612
vnc_connection_buffered_write_u16(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO_ENABLE);
1559
1613
vnc_connection_buffered_flush(conn);
1560
1614
priv->audio_enable_pending=FALSE;
1572
1626
if (priv->has_audio)
1574
vnc_connection_buffered_write_u8(conn, 255); /* QEMU message */
1575
vnc_connection_buffered_write_u8(conn, 1); /* VNC_CONNECTION_QEMU_AUDIO */
1576
vnc_connection_buffered_write_u16(conn, 1); /* VNC_CONNECTION_QEMU_AUDIO_ENABLE */
1628
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU);
1629
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO);
1630
vnc_connection_buffered_write_u16(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_AUDIO_DISABLE);
1577
1631
vnc_connection_buffered_flush(conn);
1578
1632
priv->audio_disable_pending=FALSE;
1614
1668
priv->has_ext_key_event = FALSE;
1615
1669
priv->has_audio = FALSE;
1616
vnc_connection_buffered_write_u8(conn, 2);
1670
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_SET_ENCODINGS);
1617
1671
vnc_connection_buffered_write(conn, pad, 1);
1618
1672
vnc_connection_buffered_write_u16(conn, n_encoding - skip_zrle);
1619
1673
for (i = 0; i < n_encoding; i++) {
1642
1696
priv->lastUpdateRequest.width = width;
1643
1697
priv->lastUpdateRequest.height = height;
1645
vnc_connection_buffered_write_u8(conn, 3);
1699
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_FRAMEBUFFER_UPDATE_REQUEST);
1646
1700
vnc_connection_buffered_write_u8(conn, incremental ? 1 : 0);
1647
1701
vnc_connection_buffered_write_u16(conn, x);
1648
1702
vnc_connection_buffered_write_u16(conn, y);
1670
1724
priv->lastUpdateRequest.height,
1671
1725
(int)priv->lastUpdateRequest.incremental);
1673
vnc_connection_write_u8(conn, 3);
1727
vnc_connection_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_FRAMEBUFFER_UPDATE_REQUEST);
1674
1728
vnc_connection_write_u8(conn, priv->lastUpdateRequest.incremental ? 1 : 0);
1675
1729
vnc_connection_write_u16(conn, priv->lastUpdateRequest.x);
1676
1730
vnc_connection_write_u16(conn, priv->lastUpdateRequest.y);
1691
1745
VNC_DEBUG("Key event %d %d %d Extended: %d", key, scancode, down_flag, priv->has_ext_key_event);
1692
1746
if (priv->has_ext_key_event) {
1693
vnc_connection_buffered_write_u8(conn, 255);
1694
vnc_connection_buffered_write_u8(conn, 0);
1747
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU);
1748
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_QEMU_KEY);
1695
1749
vnc_connection_buffered_write_u16(conn, down_flag ? 1 : 0);
1696
1750
vnc_connection_buffered_write_u32(conn, key);
1697
1751
vnc_connection_buffered_write_u32(conn, scancode);
1699
vnc_connection_buffered_write_u8(conn, 4);
1753
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_KEY);
1700
1754
vnc_connection_buffered_write_u8(conn, down_flag ? 1 : 0);
1701
1755
vnc_connection_buffered_write(conn, pad, 2);
1702
1756
vnc_connection_buffered_write_u32(conn, key);
1709
1763
gboolean vnc_connection_pointer_event(VncConnection *conn, guint8 button_mask,
1710
1764
guint16 x, guint16 y)
1712
vnc_connection_buffered_write_u8(conn, 5);
1766
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_POINTER);
1713
1767
vnc_connection_buffered_write_u8(conn, button_mask);
1714
1768
vnc_connection_buffered_write_u16(conn, x);
1715
1769
vnc_connection_buffered_write_u16(conn, y);
1723
1777
guint8 pad[3] = {0};
1725
vnc_connection_buffered_write_u8(conn, 6);
1779
vnc_connection_buffered_write_u8(conn, VNC_CONNECTION_CLIENT_MESSAGE_CUT_TEXT);
1726
1780
vnc_connection_buffered_write(conn, pad, 3);
1727
1781
vnc_connection_buffered_write_u32(conn, length);
1728
1782
vnc_connection_buffered_write(conn, data, length);
2037
2091
guint16 width, guint16 height)
2039
2093
VncConnectionPrivate *priv = conn->priv;
2040
guint8 blit_data[4 * 64 * 64];
2097
blit_data = g_new0(guint8, 4*64*64);
2043
2099
bpp = vnc_connection_pixel_size(conn);
2045
2101
for (i = 0; i < width * height; i++)
2046
2102
vnc_connection_read_cpixel(conn, blit_data + (i * bpp));
2048
2104
vnc_framebuffer_blt(priv->fb, blit_data, width * bpp, x, y, width, height);
2051
2109
static guint8 vnc_connection_read_zrle_pi(VncConnection *conn, int palette_size)
2882
2944
VncConnection *conn;
2883
2945
struct coroutine *caller;
2947
VNC_AUDIO_PLAYBACK_STOP = 0,
2948
VNC_AUDIO_PLAYBACK_START = 1,
2949
VNC_AUDIO_PLAYBACK_DATA = 2,
2887
2953
static gboolean do_vnc_connection_audio_action(gpointer opaque)
2892
2958
VNC_DEBUG("Audio action main context %d", data->action);
2894
2960
switch (data->action) {
2961
case VNC_AUDIO_PLAYBACK_STOP:
2896
2962
vnc_audio_playback_stop(priv->audio);
2964
case VNC_AUDIO_PLAYBACK_START:
2899
2965
vnc_audio_playback_start(priv->audio, &priv->audio_format);
2967
case VNC_AUDIO_PLAYBACK_DATA:
2902
2968
vnc_audio_playback_data(priv->audio, priv->audio_sample);
2971
g_warn_if_reached();
2906
2974
coroutine_yieldto(data->caller, NULL);
3047
3115
switch (n_type) {
3048
case 1: { /* QEMU audio */
3116
case VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO: {
3049
3117
guint16 n_subtype;
3050
3118
guint32 n_length;
3052
3120
n_subtype = vnc_connection_read_u16(conn);
3053
3121
switch (n_subtype) {
3122
case VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO_DATA:
3055
3123
n_length = vnc_connection_read_u32(conn);
3056
3124
if (n_length > (1024*1024)) {
3057
3125
VNC_DEBUG("Received audio message that is too large %u", n_length);
3073
3141
priv->audio_sample->capacity,
3074
3142
priv->audio_sample->length,
3076
vnc_connection_audio_action(conn, 2);
3144
vnc_connection_audio_action(conn, VNC_AUDIO_PLAYBACK_DATA);
3077
3145
vnc_audio_sample_free(priv->audio_sample);
3078
3146
priv->audio_sample = NULL;
3090
3158
priv->audio_sample->length += n_length;
3160
case VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO_START:
3093
3161
if (priv->audio)
3094
vnc_connection_audio_action(conn, 1);
3162
vnc_connection_audio_action(conn, VNC_AUDIO_PLAYBACK_START);
3096
3164
priv->has_error = TRUE;
3166
case VNC_CONNECTION_SERVER_MESSAGE_QEMU_AUDIO_STOP:
3099
3167
if (priv->audio) {
3100
3168
if (priv->audio_sample) {
3101
3169
g_source_remove(priv->audio_timer);
3102
vnc_connection_audio_action(conn, 2);
3170
vnc_connection_audio_action(conn, VNC_AUDIO_PLAYBACK_DATA);
3103
3171
vnc_audio_sample_free(priv->audio_sample);
3104
3172
priv->audio_sample = NULL;
3106
vnc_connection_audio_action(conn, 0);
3174
vnc_connection_audio_action(conn, VNC_AUDIO_PLAYBACK_STOP);
3108
3176
priv->has_error = TRUE;
5025
static gboolean vnc_connection_open_addr_internal(VncConnection *conn)
5027
VncConnectionPrivate *priv = conn->priv;
5028
GError *conn_error = NULL;
5029
GSocket *sock = NULL;
5031
VNC_DEBUG("Connecting with addr %p", priv->addr);
5033
sock = vnc_connection_connect_socket(priv->addr, &conn_error);
5034
g_clear_error(&conn_error);
4949
5043
static gboolean vnc_connection_open_host_internal(VncConnection *conn)
4951
5045
VncConnectionPrivate *priv = conn->priv;
5063
5160
gboolean vnc_connection_open_fd(VncConnection *conn, int fd)
5162
return vnc_connection_open_fd_with_hostname(conn, fd, NULL);
5166
gboolean vnc_connection_open_fd_with_hostname(VncConnection *conn, int fd, const char *hostname)
5065
5168
VncConnectionPrivate *priv = conn->priv;
5067
5170
VNC_DEBUG("Open fd=%d", fd);
5207
gboolean vnc_connection_open_addr(VncConnection *conn, GSocketAddress *addr, const char *hostname)
5209
VncConnectionPrivate *priv = conn->priv;
5211
VNC_DEBUG("Open addr=%p", addr);
5213
if (vnc_connection_is_open(conn))
5217
priv->addr = g_object_ref(addr);
5219
priv->host = g_strdup(hostname ? hostname : "localhost");
5220
if (G_IS_INET_SOCKET_ADDRESS(addr)) {
5221
guint16 port = g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(addr));
5222
priv->port = g_strdup_printf("%d", (int)port);
5224
priv->port = g_strdup("");
5227
g_object_ref(G_OBJECT(conn)); /* Unref'd when co-routine exits */
5228
priv->open_id = g_idle_add(do_vnc_connection_open, conn);
5102
5234
gboolean vnc_connection_set_auth_type(VncConnection *conn, unsigned int type)