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 --- |