vnc.c (176adafca72ecc35e7f1f011deb52ca1ae091df6) vnc.c (0337e4123e62721bd0bcb4d5645fee2a31e8906d)
1/*
2 * QEMU VNC display driver
3 *
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy

--- 1570 unchanged lines hidden (view full) ---

1579/*
1580 * First function called whenever there is more data to be read from
1581 * the client socket. Will delegate actual work according to whether
1582 * SASL SSF layers are enabled (thus requiring decryption calls)
1583 * Returns 0 on success, -1 if client disconnected
1584 */
1585static int vnc_client_read(VncState *vs)
1586{
1/*
2 * QEMU VNC display driver
3 *
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy

--- 1570 unchanged lines hidden (view full) ---

1579/*
1580 * First function called whenever there is more data to be read from
1581 * the client socket. Will delegate actual work according to whether
1582 * SASL SSF layers are enabled (thus requiring decryption calls)
1583 * Returns 0 on success, -1 if client disconnected
1584 */
1585static int vnc_client_read(VncState *vs)
1586{
1587 size_t ret;
1587 size_t sz;
1588
1589#ifdef CONFIG_VNC_SASL
1590 if (vs->sasl.conn && vs->sasl.runSSF)
1588
1589#ifdef CONFIG_VNC_SASL
1590 if (vs->sasl.conn && vs->sasl.runSSF)
1591 ret = vnc_client_read_sasl(vs);
1591 sz = vnc_client_read_sasl(vs);
1592 else
1593#endif /* CONFIG_VNC_SASL */
1592 else
1593#endif /* CONFIG_VNC_SASL */
1594 ret = vnc_client_read_plain(vs);
1595 if (!ret) {
1594 sz = vnc_client_read_plain(vs);
1595 if (!sz) {
1596 if (vs->disconnecting) {
1597 vnc_disconnect_finish(vs);
1598 return -1;
1599 }
1600 return 0;
1601 }
1602
1603 while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {

--- 162 unchanged lines hidden (view full) ---

1766{
1767 return ((data[offset] << 24) | (data[offset + 1] << 16) |
1768 (data[offset + 2] << 8) | data[offset + 3]);
1769}
1770
1771static void check_pointer_type_change(Notifier *notifier, void *data)
1772{
1773 VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1596 if (vs->disconnecting) {
1597 vnc_disconnect_finish(vs);
1598 return -1;
1599 }
1600 return 0;
1601 }
1602
1603 while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {

--- 162 unchanged lines hidden (view full) ---

1766{
1767 return ((data[offset] << 24) | (data[offset + 1] << 16) |
1768 (data[offset + 2] << 8) | data[offset + 3]);
1769}
1770
1771static void check_pointer_type_change(Notifier *notifier, void *data)
1772{
1773 VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1774 int absolute = qemu_input_is_absolute();
1774 int absolute = qemu_input_is_absolute(vs->vd->dcl.con);
1775
1776 if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1777 vnc_lock_output(vs);
1778 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1779 vnc_write_u8(vs, 0);
1780 vnc_write_u16(vs, 1);
1781 vnc_framebuffer_update(vs, absolute, 0,
1782 pixman_image_get_width(vs->vd->server),

--- 407 unchanged lines hidden (view full) ---

2190 break;
2191 case VNC_ENCODING_ALPHA_CURSOR:
2192 vs->features |= VNC_FEATURE_ALPHA_CURSOR_MASK;
2193 break;
2194 case VNC_ENCODING_EXT_KEY_EVENT:
2195 send_ext_key_event_ack(vs);
2196 break;
2197 case VNC_ENCODING_AUDIO:
1775
1776 if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1777 vnc_lock_output(vs);
1778 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1779 vnc_write_u8(vs, 0);
1780 vnc_write_u16(vs, 1);
1781 vnc_framebuffer_update(vs, absolute, 0,
1782 pixman_image_get_width(vs->vd->server),

--- 407 unchanged lines hidden (view full) ---

2190 break;
2191 case VNC_ENCODING_ALPHA_CURSOR:
2192 vs->features |= VNC_FEATURE_ALPHA_CURSOR_MASK;
2193 break;
2194 case VNC_ENCODING_EXT_KEY_EVENT:
2195 send_ext_key_event_ack(vs);
2196 break;
2197 case VNC_ENCODING_AUDIO:
2198 if (vs->vd->audio_state) {
2199 vs->features |= VNC_FEATURE_AUDIO_MASK;
2200 send_ext_audio_ack(vs);
2201 }
2198 send_ext_audio_ack(vs);
2202 break;
2203 case VNC_ENCODING_WMVi:
2204 vs->features |= VNC_FEATURE_WMVI_MASK;
2205 break;
2206 case VNC_ENCODING_LED_STATE:
2207 vs->features |= VNC_FEATURE_LED_STATE_MASK;
2208 break;
2209 case VNC_ENCODING_XVP:

--- 290 unchanged lines hidden (view full) ---

2500 case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
2501 if (len == 2)
2502 return 12;
2503
2504 ext_key_event(vs, read_u16(data, 2),
2505 read_u32(data, 4), read_u32(data, 8));
2506 break;
2507 case VNC_MSG_CLIENT_QEMU_AUDIO:
2199 break;
2200 case VNC_ENCODING_WMVi:
2201 vs->features |= VNC_FEATURE_WMVI_MASK;
2202 break;
2203 case VNC_ENCODING_LED_STATE:
2204 vs->features |= VNC_FEATURE_LED_STATE_MASK;
2205 break;
2206 case VNC_ENCODING_XVP:

--- 290 unchanged lines hidden (view full) ---

2497 case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
2498 if (len == 2)
2499 return 12;
2500
2501 ext_key_event(vs, read_u16(data, 2),
2502 read_u32(data, 4), read_u32(data, 8));
2503 break;
2504 case VNC_MSG_CLIENT_QEMU_AUDIO:
2508 if (!vnc_has_feature(vs, VNC_FEATURE_AUDIO)) {
2509 error_report("Audio message %d with audio disabled", read_u8(data, 2));
2510 vnc_client_error(vs);
2511 break;
2512 }
2513
2514 if (len == 2)
2515 return 4;
2516
2517 switch (read_u16 (data, 2)) {
2518 case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
2519 trace_vnc_msg_client_audio_enable(vs, vs->ioc);
2520 audio_add(vs);
2521 break;

--- 600 unchanged lines hidden (view full) ---

3122 * Update server dirty map.
3123 */
3124 server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
3125 server_stride = guest_stride = guest_ll =
3126 pixman_image_get_stride(vd->server);
3127 cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
3128 server_stride);
3129 if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
2505 if (len == 2)
2506 return 4;
2507
2508 switch (read_u16 (data, 2)) {
2509 case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
2510 trace_vnc_msg_client_audio_enable(vs, vs->ioc);
2511 audio_add(vs);
2512 break;

--- 600 unchanged lines hidden (view full) ---

3113 * Update server dirty map.
3114 */
3115 server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
3116 server_stride = guest_stride = guest_ll =
3117 pixman_image_get_stride(vd->server);
3118 cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
3119 server_stride);
3120 if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
3130 int width = pixman_image_get_width(vd->server);
3131 tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
3121 int w = pixman_image_get_width(vd->server);
3122 tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, w);
3132 } else {
3133 int guest_bpp =
3134 PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
3135 guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
3136 guest_stride = pixman_image_get_stride(vd->guest.fb);
3137 guest_ll = pixman_image_get_width(vd->guest.fb)
3138 * DIV_ROUND_UP(guest_bpp, 8);
3139 }

--- 1036 unchanged lines hidden (view full) ---

4176 vd->lock_key_sync = lock_key_sync;
4177 if (lock_key_sync) {
4178 vd->led = qemu_add_led_event_handler(kbd_leds, vd);
4179 }
4180 vd->ledstate = 0;
4181
4182 audiodev = qemu_opt_get(opts, "audiodev");
4183 if (audiodev) {
3123 } else {
3124 int guest_bpp =
3125 PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
3126 guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
3127 guest_stride = pixman_image_get_stride(vd->guest.fb);
3128 guest_ll = pixman_image_get_width(vd->guest.fb)
3129 * DIV_ROUND_UP(guest_bpp, 8);
3130 }

--- 1036 unchanged lines hidden (view full) ---

4167 vd->lock_key_sync = lock_key_sync;
4168 if (lock_key_sync) {
4169 vd->led = qemu_add_led_event_handler(kbd_leds, vd);
4170 }
4171 vd->ledstate = 0;
4172
4173 audiodev = qemu_opt_get(opts, "audiodev");
4174 if (audiodev) {
4184 vd->audio_state = audio_state_by_name(audiodev, errp);
4175 vd->audio_state = audio_state_by_name(audiodev);
4185 if (!vd->audio_state) {
4176 if (!vd->audio_state) {
4177 error_setg(errp, "Audiodev '%s' not found", audiodev);
4186 goto fail;
4187 }
4188 }
4189
4190 device_id = qemu_opt_get(opts, "display");
4191 if (device_id) {
4192 int head = qemu_opt_get_number(opts, "head", 0);
4193 Error *err = NULL;

--- 115 unchanged lines hidden ---
4178 goto fail;
4179 }
4180 }
4181
4182 device_id = qemu_opt_get(opts, "display");
4183 if (device_id) {
4184 int head = qemu_opt_get_number(opts, "head", 0);
4185 Error *err = NULL;

--- 115 unchanged lines hidden ---