Annotation of qemu/ui/vnc.h, revision 1.1.1.3

1.1       root        1: /*
                      2:  * QEMU VNC display driver
                      3:  *
                      4:  * Copyright (C) 2006 Anthony Liguori <[email protected]>
                      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
                      9:  * of this software and associated documentation files (the "Software"), to deal
                     10:  * in the Software without restriction, including without limitation the rights
                     11:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
                     12:  * copies of the Software, and to permit persons to whom the Software is
                     13:  * furnished to do so, subject to the following conditions:
                     14:  *
                     15:  * The above copyright notice and this permission notice shall be included in
                     16:  * all copies or substantial portions of the Software.
                     17:  *
                     18:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                     19:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     20:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
                     21:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     22:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
                     23:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
                     24:  * THE SOFTWARE.
                     25:  */
                     26: 
                     27: #ifndef __QEMU_VNC_H
                     28: #define __QEMU_VNC_H
                     29: 
                     30: #include "qemu-common.h"
                     31: #include "qemu-queue.h"
                     32: #ifdef CONFIG_VNC_THREAD
                     33: #include "qemu-thread.h"
                     34: #endif
                     35: #include "console.h"
                     36: #include "monitor.h"
                     37: #include "audio/audio.h"
1.1.1.3 ! root       38: #include "bitmap.h"
1.1       root       39: #include <zlib.h>
                     40: #include <stdbool.h>
                     41: 
                     42: #include "keymaps.h"
1.1.1.3 ! root       43: #include "vnc-palette.h"
        !            44: #include "vnc-enc-zrle.h"
1.1       root       45: 
                     46: // #define _VNC_DEBUG 1
                     47: 
                     48: #ifdef _VNC_DEBUG
                     49: #define VNC_DEBUG(fmt, ...) do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
                     50: #else
                     51: #define VNC_DEBUG(fmt, ...) do { } while (0)
                     52: #endif
                     53: 
                     54: /*****************************************************************************
                     55:  *
                     56:  * Core data structures
                     57:  *
                     58:  *****************************************************************************/
                     59: 
                     60: typedef struct Buffer
                     61: {
                     62:     size_t capacity;
                     63:     size_t offset;
                     64:     uint8_t *buffer;
                     65: } Buffer;
                     66: 
                     67: typedef struct VncState VncState;
                     68: typedef struct VncJob VncJob;
                     69: typedef struct VncRect VncRect;
                     70: typedef struct VncRectEntry VncRectEntry;
                     71: 
                     72: typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
                     73: 
                     74: typedef void VncWritePixels(VncState *vs, struct PixelFormat *pf, void *data, int size);
                     75: 
                     76: typedef void VncSendHextileTile(VncState *vs,
                     77:                                 int x, int y, int w, int h,
                     78:                                 void *last_bg,
                     79:                                 void *last_fg,
                     80:                                 int *has_bg, int *has_fg);
                     81: 
1.1.1.3 ! root       82: /* VNC_MAX_WIDTH must be a multiple of 16. */
1.1       root       83: #define VNC_MAX_WIDTH 2560
                     84: #define VNC_MAX_HEIGHT 2048
1.1.1.3 ! root       85: 
        !            86: /* VNC_DIRTY_BITS is the number of bits in the dirty bitmap. */
        !            87: #define VNC_DIRTY_BITS (VNC_MAX_WIDTH / 16)
        !            88: 
        !            89: #define VNC_STAT_RECT  64
        !            90: #define VNC_STAT_COLS (VNC_MAX_WIDTH / VNC_STAT_RECT)
        !            91: #define VNC_STAT_ROWS (VNC_MAX_HEIGHT / VNC_STAT_RECT)
1.1       root       92: 
                     93: #define VNC_AUTH_CHALLENGE_SIZE 16
                     94: 
                     95: typedef struct VncDisplay VncDisplay;
                     96: 
                     97: #ifdef CONFIG_VNC_TLS
                     98: #include "vnc-tls.h"
                     99: #include "vnc-auth-vencrypt.h"
                    100: #endif
                    101: #ifdef CONFIG_VNC_SASL
                    102: #include "vnc-auth-sasl.h"
                    103: #endif
                    104: 
1.1.1.3 ! root      105: struct VncRectStat
        !           106: {
        !           107:     /* time of last 10 updates, to find update frequency */
        !           108:     struct timeval times[10];
        !           109:     int idx;
        !           110: 
        !           111:     double freq;        /* Update frequency (in Hz) */
        !           112:     bool updated;       /* Already updated during this refresh */
        !           113: };
        !           114: 
        !           115: typedef struct VncRectStat VncRectStat;
        !           116: 
1.1       root      117: struct VncSurface
                    118: {
1.1.1.3 ! root      119:     struct timeval last_freq_check;
        !           120:     DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_MAX_WIDTH / 16);
        !           121:     VncRectStat stats[VNC_STAT_ROWS][VNC_STAT_COLS];
1.1       root      122:     DisplaySurface *ds;
                    123: };
                    124: 
                    125: struct VncDisplay
                    126: {
                    127:     QTAILQ_HEAD(, VncState) clients;
                    128:     QEMUTimer *timer;
                    129:     int timer_interval;
                    130:     int lsock;
                    131:     DisplayState *ds;
                    132:     kbd_layout_t *kbd_layout;
                    133:     int lock_key_sync;
                    134: #ifdef CONFIG_VNC_THREAD
                    135:     QemuMutex mutex;
                    136: #endif
                    137: 
                    138:     QEMUCursor *cursor;
                    139:     int cursor_msize;
                    140:     uint8_t *cursor_mask;
                    141: 
                    142:     struct VncSurface guest;   /* guest visible surface (aka ds->surface) */
                    143:     DisplaySurface *server;  /* vnc server surface */
                    144: 
                    145:     char *display;
                    146:     char *password;
1.1.1.2   root      147:     time_t expires;
1.1       root      148:     int auth;
                    149:     bool lossy;
1.1.1.3 ! root      150:     bool non_adaptive;
1.1       root      151: #ifdef CONFIG_VNC_TLS
                    152:     int subauth; /* Used by VeNCrypt */
                    153:     VncDisplayTLS tls;
                    154: #endif
                    155: #ifdef CONFIG_VNC_SASL
                    156:     VncDisplaySASL sasl;
                    157: #endif
                    158: };
                    159: 
                    160: typedef struct VncTight {
                    161:     int type;
                    162:     uint8_t quality;
                    163:     uint8_t compression;
                    164:     uint8_t pixel24;
                    165:     Buffer tight;
                    166:     Buffer tmp;
                    167:     Buffer zlib;
                    168:     Buffer gradient;
                    169: #ifdef CONFIG_VNC_JPEG
                    170:     Buffer jpeg;
                    171: #endif
                    172: #ifdef CONFIG_VNC_PNG
                    173:     Buffer png;
                    174: #endif
                    175:     int levels[4];
                    176:     z_stream stream[4];
                    177: } VncTight;
                    178: 
                    179: typedef struct VncHextile {
                    180:     VncSendHextileTile *send_tile;
                    181: } VncHextile;
                    182: 
                    183: typedef struct VncZlib {
                    184:     Buffer zlib;
                    185:     Buffer tmp;
                    186:     z_stream stream;
                    187:     int level;
                    188: } VncZlib;
                    189: 
1.1.1.3 ! root      190: typedef struct VncZrle {
        !           191:     int type;
        !           192:     Buffer fb;
        !           193:     Buffer zrle;
        !           194:     Buffer tmp;
        !           195:     Buffer zlib;
        !           196:     z_stream stream;
        !           197:     VncPalette palette;
        !           198: } VncZrle;
        !           199: 
        !           200: typedef struct VncZywrle {
        !           201:     int buf[VNC_ZRLE_TILE_WIDTH * VNC_ZRLE_TILE_HEIGHT];
        !           202: } VncZywrle;
        !           203: 
1.1       root      204: #ifdef CONFIG_VNC_THREAD
                    205: struct VncRect
                    206: {
                    207:     int x;
                    208:     int y;
                    209:     int w;
                    210:     int h;
                    211: };
                    212: 
                    213: struct VncRectEntry
                    214: {
                    215:     struct VncRect rect;
                    216:     QLIST_ENTRY(VncRectEntry) next;
                    217: };
                    218: 
                    219: struct VncJob
                    220: {
                    221:     VncState *vs;
                    222: 
                    223:     QLIST_HEAD(, VncRectEntry) rectangles;
                    224:     QTAILQ_ENTRY(VncJob) next;
                    225: };
                    226: #else
                    227: struct VncJob
                    228: {
                    229:     VncState *vs;
                    230:     int rectangles;
                    231:     size_t saved_offset;
                    232: };
                    233: #endif
                    234: 
                    235: struct VncState
                    236: {
                    237:     int csock;
                    238: 
                    239:     DisplayState *ds;
1.1.1.3 ! root      240:     DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_DIRTY_BITS);
        !           241:     uint8_t **lossy_rect; /* Not an Array to avoid costly memcpy in
        !           242:                            * vnc-jobs-async.c */
1.1       root      243: 
                    244:     VncDisplay *vd;
                    245:     int need_update;
                    246:     int force_update;
                    247:     uint32_t features;
                    248:     int absolute;
                    249:     int last_x;
                    250:     int last_y;
                    251:     int client_width;
                    252:     int client_height;
                    253: 
                    254:     uint32_t vnc_encoding;
                    255: 
                    256:     int major;
                    257:     int minor;
                    258: 
1.1.1.3 ! root      259:     int auth;
1.1       root      260:     char challenge[VNC_AUTH_CHALLENGE_SIZE];
                    261: #ifdef CONFIG_VNC_TLS
1.1.1.3 ! root      262:     int subauth; /* Used by VeNCrypt */
1.1       root      263:     VncStateTLS tls;
                    264: #endif
                    265: #ifdef CONFIG_VNC_SASL
                    266:     VncStateSASL sasl;
                    267: #endif
                    268: 
                    269:     QObject *info;
                    270: 
                    271:     Buffer output;
                    272:     Buffer input;
                    273:     /* current output mode information */
                    274:     VncWritePixels *write_pixels;
                    275:     DisplaySurface clientds;
                    276: 
                    277:     CaptureVoiceOut *audio_cap;
                    278:     struct audsettings as;
                    279: 
                    280:     VncReadEvent *read_handler;
                    281:     size_t read_handler_expect;
                    282:     /* input */
                    283:     uint8_t modifiers_state[256];
                    284:     QEMUPutLEDEntry *led;
                    285: 
                    286:     bool abort;
                    287: #ifndef CONFIG_VNC_THREAD
                    288:     VncJob job;
                    289: #else
                    290:     QemuMutex output_mutex;
                    291: #endif
                    292: 
                    293:     /* Encoding specific, if you add something here, don't forget to
                    294:      *  update vnc_async_encoding_start()
                    295:      */
                    296:     VncTight tight;
                    297:     VncZlib zlib;
                    298:     VncHextile hextile;
1.1.1.3 ! root      299:     VncZrle zrle;
        !           300:     VncZywrle zywrle;
1.1       root      301: 
                    302:     Notifier mouse_mode_notifier;
                    303: 
                    304:     QTAILQ_ENTRY(VncState) next;
                    305: };
                    306: 
                    307: 
                    308: /*****************************************************************************
                    309:  *
                    310:  * Authentication modes
                    311:  *
                    312:  *****************************************************************************/
                    313: 
                    314: enum {
                    315:     VNC_AUTH_INVALID = 0,
                    316:     VNC_AUTH_NONE = 1,
                    317:     VNC_AUTH_VNC = 2,
                    318:     VNC_AUTH_RA2 = 5,
                    319:     VNC_AUTH_RA2NE = 6,
                    320:     VNC_AUTH_TIGHT = 16,
                    321:     VNC_AUTH_ULTRA = 17,
                    322:     VNC_AUTH_TLS = 18,      /* Supported in GTK-VNC & VINO */
                    323:     VNC_AUTH_VENCRYPT = 19, /* Supported in GTK-VNC & VeNCrypt */
                    324:     VNC_AUTH_SASL = 20,     /* Supported in GTK-VNC & VINO */
                    325: };
                    326: 
                    327: enum {
                    328:     VNC_AUTH_VENCRYPT_PLAIN = 256,
                    329:     VNC_AUTH_VENCRYPT_TLSNONE = 257,
                    330:     VNC_AUTH_VENCRYPT_TLSVNC = 258,
                    331:     VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
                    332:     VNC_AUTH_VENCRYPT_X509NONE = 260,
                    333:     VNC_AUTH_VENCRYPT_X509VNC = 261,
                    334:     VNC_AUTH_VENCRYPT_X509PLAIN = 262,
                    335:     VNC_AUTH_VENCRYPT_X509SASL = 263,
                    336:     VNC_AUTH_VENCRYPT_TLSSASL = 264,
                    337: };
                    338: 
                    339: 
                    340: /*****************************************************************************
                    341:  *
                    342:  * Encoding types
                    343:  *
                    344:  *****************************************************************************/
                    345: 
                    346: #define VNC_ENCODING_RAW                  0x00000000
                    347: #define VNC_ENCODING_COPYRECT             0x00000001
                    348: #define VNC_ENCODING_RRE                  0x00000002
                    349: #define VNC_ENCODING_CORRE                0x00000004
                    350: #define VNC_ENCODING_HEXTILE              0x00000005
                    351: #define VNC_ENCODING_ZLIB                 0x00000006
                    352: #define VNC_ENCODING_TIGHT                0x00000007
                    353: #define VNC_ENCODING_ZLIBHEX              0x00000008
                    354: #define VNC_ENCODING_TRLE                 0x0000000f
                    355: #define VNC_ENCODING_ZRLE                 0x00000010
                    356: #define VNC_ENCODING_ZYWRLE               0x00000011
                    357: #define VNC_ENCODING_COMPRESSLEVEL0       0xFFFFFF00 /* -256 */
                    358: #define VNC_ENCODING_QUALITYLEVEL0        0xFFFFFFE0 /* -32  */
                    359: #define VNC_ENCODING_XCURSOR              0xFFFFFF10 /* -240 */
                    360: #define VNC_ENCODING_RICH_CURSOR          0xFFFFFF11 /* -239 */
                    361: #define VNC_ENCODING_POINTER_POS          0xFFFFFF18 /* -232 */
                    362: #define VNC_ENCODING_LASTRECT             0xFFFFFF20 /* -224 */
                    363: #define VNC_ENCODING_DESKTOPRESIZE        0xFFFFFF21 /* -223 */
                    364: #define VNC_ENCODING_POINTER_TYPE_CHANGE  0XFFFFFEFF /* -257 */
                    365: #define VNC_ENCODING_EXT_KEY_EVENT        0XFFFFFEFE /* -258 */
                    366: #define VNC_ENCODING_AUDIO                0XFFFFFEFD /* -259 */
                    367: #define VNC_ENCODING_TIGHT_PNG            0xFFFFFEFC /* -260 */
                    368: #define VNC_ENCODING_WMVi                 0x574D5669
                    369: 
                    370: /*****************************************************************************
                    371:  *
                    372:  * Other tight constants
                    373:  *
                    374:  *****************************************************************************/
                    375: 
                    376: /*
                    377:  * Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
                    378:  */
                    379: 
                    380: #define VNC_TIGHT_CCB_RESET_MASK   (0x0f)
                    381: #define VNC_TIGHT_CCB_TYPE_MASK    (0x0f << 4)
                    382: #define VNC_TIGHT_CCB_TYPE_FILL    (0x08 << 4)
                    383: #define VNC_TIGHT_CCB_TYPE_JPEG    (0x09 << 4)
                    384: #define VNC_TIGHT_CCB_TYPE_PNG     (0x0A << 4)
                    385: #define VNC_TIGHT_CCB_BASIC_MAX    (0x07 << 4)
                    386: #define VNC_TIGHT_CCB_BASIC_ZLIB   (0x03 << 4)
                    387: #define VNC_TIGHT_CCB_BASIC_FILTER (0x04 << 4)
                    388: 
                    389: /*****************************************************************************
                    390:  *
                    391:  * Features
                    392:  *
                    393:  *****************************************************************************/
                    394: 
                    395: #define VNC_FEATURE_RESIZE                   0
                    396: #define VNC_FEATURE_HEXTILE                  1
                    397: #define VNC_FEATURE_POINTER_TYPE_CHANGE      2
                    398: #define VNC_FEATURE_WMVI                     3
                    399: #define VNC_FEATURE_TIGHT                    4
                    400: #define VNC_FEATURE_ZLIB                     5
                    401: #define VNC_FEATURE_COPYRECT                 6
                    402: #define VNC_FEATURE_RICH_CURSOR              7
                    403: #define VNC_FEATURE_TIGHT_PNG                8
1.1.1.3 ! root      404: #define VNC_FEATURE_ZRLE                     9
        !           405: #define VNC_FEATURE_ZYWRLE                  10
1.1       root      406: 
                    407: #define VNC_FEATURE_RESIZE_MASK              (1 << VNC_FEATURE_RESIZE)
                    408: #define VNC_FEATURE_HEXTILE_MASK             (1 << VNC_FEATURE_HEXTILE)
                    409: #define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
                    410: #define VNC_FEATURE_WMVI_MASK                (1 << VNC_FEATURE_WMVI)
                    411: #define VNC_FEATURE_TIGHT_MASK               (1 << VNC_FEATURE_TIGHT)
                    412: #define VNC_FEATURE_ZLIB_MASK                (1 << VNC_FEATURE_ZLIB)
                    413: #define VNC_FEATURE_COPYRECT_MASK            (1 << VNC_FEATURE_COPYRECT)
                    414: #define VNC_FEATURE_RICH_CURSOR_MASK         (1 << VNC_FEATURE_RICH_CURSOR)
                    415: #define VNC_FEATURE_TIGHT_PNG_MASK           (1 << VNC_FEATURE_TIGHT_PNG)
1.1.1.3 ! root      416: #define VNC_FEATURE_ZRLE_MASK                (1 << VNC_FEATURE_ZRLE)
        !           417: #define VNC_FEATURE_ZYWRLE_MASK              (1 << VNC_FEATURE_ZYWRLE)
1.1       root      418: 
                    419: 
                    420: /* Client -> Server message IDs */
                    421: #define VNC_MSG_CLIENT_SET_PIXEL_FORMAT           0
                    422: #define VNC_MSG_CLIENT_SET_ENCODINGS              2
                    423: #define VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST 3
                    424: #define VNC_MSG_CLIENT_KEY_EVENT                  4
                    425: #define VNC_MSG_CLIENT_POINTER_EVENT              5
                    426: #define VNC_MSG_CLIENT_CUT_TEXT                   6
                    427: #define VNC_MSG_CLIENT_VMWARE_0                   127
                    428: #define VNC_MSG_CLIENT_CALL_CONTROL               249
                    429: #define VNC_MSG_CLIENT_XVP                        250
                    430: #define VNC_MSG_CLIENT_SET_DESKTOP_SIZE           251
                    431: #define VNC_MSG_CLIENT_TIGHT                      252
                    432: #define VNC_MSG_CLIENT_GII                        253
                    433: #define VNC_MSG_CLIENT_VMWARE_1                   254
                    434: #define VNC_MSG_CLIENT_QEMU                       255
                    435: 
                    436: /* Server -> Client message IDs */
                    437: #define VNC_MSG_SERVER_FRAMEBUFFER_UPDATE         0
                    438: #define VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES     1
                    439: #define VNC_MSG_SERVER_BELL                       2
                    440: #define VNC_MSG_SERVER_CUT_TEXT                   3
                    441: #define VNC_MSG_SERVER_VMWARE_0                   127
                    442: #define VNC_MSG_SERVER_CALL_CONTROL               249
                    443: #define VNC_MSG_SERVER_XVP                        250
                    444: #define VNC_MSG_SERVER_TIGHT                      252
                    445: #define VNC_MSG_SERVER_GII                        253
                    446: #define VNC_MSG_SERVER_VMWARE_1                   254
                    447: #define VNC_MSG_SERVER_QEMU                       255
                    448: 
                    449: 
                    450: 
                    451: /* QEMU client -> server message IDs */
                    452: #define VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT         0
                    453: #define VNC_MSG_CLIENT_QEMU_AUDIO                 1
                    454: 
                    455: /* QEMU server -> client message IDs */
                    456: #define VNC_MSG_SERVER_QEMU_AUDIO                 1
                    457: 
                    458: 
                    459: 
                    460: /* QEMU client -> server audio message IDs */
                    461: #define VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE          0
                    462: #define VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE         1
                    463: #define VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT      2
                    464: 
                    465: /* QEMU server -> client audio message IDs */
                    466: #define VNC_MSG_SERVER_QEMU_AUDIO_END             0
                    467: #define VNC_MSG_SERVER_QEMU_AUDIO_BEGIN           1
                    468: #define VNC_MSG_SERVER_QEMU_AUDIO_DATA            2
                    469: 
                    470: 
                    471: /*****************************************************************************
                    472:  *
                    473:  * Internal APIs
                    474:  *
                    475:  *****************************************************************************/
                    476: 
                    477: /* Event loop functions */
                    478: void vnc_client_read(void *opaque);
                    479: void vnc_client_write(void *opaque);
                    480: 
                    481: long vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen);
                    482: long vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen);
                    483: 
                    484: /* Protocol I/O functions */
                    485: void vnc_write(VncState *vs, const void *data, size_t len);
                    486: void vnc_write_u32(VncState *vs, uint32_t value);
                    487: void vnc_write_s32(VncState *vs, int32_t value);
                    488: void vnc_write_u16(VncState *vs, uint16_t value);
                    489: void vnc_write_u8(VncState *vs, uint8_t value);
                    490: void vnc_flush(VncState *vs);
                    491: void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
                    492: 
                    493: 
                    494: /* Buffer I/O functions */
                    495: uint8_t read_u8(uint8_t *data, size_t offset);
                    496: uint16_t read_u16(uint8_t *data, size_t offset);
                    497: int32_t read_s32(uint8_t *data, size_t offset);
                    498: uint32_t read_u32(uint8_t *data, size_t offset);
                    499: 
                    500: /* Protocol stage functions */
                    501: void vnc_client_error(VncState *vs);
                    502: int vnc_client_io_error(VncState *vs, int ret, int last_errno);
                    503: 
                    504: void start_client_init(VncState *vs);
                    505: void start_auth_vnc(VncState *vs);
                    506: 
                    507: /* Buffer management */
                    508: void buffer_reserve(Buffer *buffer, size_t len);
                    509: int buffer_empty(Buffer *buffer);
                    510: uint8_t *buffer_end(Buffer *buffer);
                    511: void buffer_reset(Buffer *buffer);
                    512: void buffer_free(Buffer *buffer);
                    513: void buffer_append(Buffer *buffer, const void *data, size_t len);
                    514: 
                    515: 
                    516: /* Misc helpers */
                    517: 
                    518: char *vnc_socket_local_addr(const char *format, int fd);
                    519: char *vnc_socket_remote_addr(const char *format, int fd);
                    520: 
                    521: static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
                    522:     return (vs->features & (1 << feature));
                    523: }
                    524: 
                    525: /* Framebuffer */
                    526: void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
                    527:                             int32_t encoding);
                    528: 
                    529: void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
1.1.1.3 ! root      530: double vnc_update_freq(VncState *vs, int x, int y, int w, int h);
        !           531: void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h);
1.1       root      532: 
                    533: /* Encodings */
                    534: int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
                    535: 
                    536: int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
                    537: 
                    538: int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
                    539:                                          int y, int w, int h);
                    540: void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
                    541: 
                    542: void *vnc_zlib_zalloc(void *x, unsigned items, unsigned size);
                    543: void vnc_zlib_zfree(void *x, void *addr);
                    544: int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
                    545: void vnc_zlib_clear(VncState *vs);
                    546: 
                    547: int vnc_tight_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
                    548: int vnc_tight_png_send_framebuffer_update(VncState *vs, int x, int y,
                    549:                                           int w, int h);
                    550: void vnc_tight_clear(VncState *vs);
                    551: 
1.1.1.3 ! root      552: int vnc_zrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
        !           553: int vnc_zywrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
        !           554: void vnc_zrle_clear(VncState *vs);
        !           555: 
1.1       root      556: #endif /* __QEMU_VNC_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.