You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1480 lines
51 KiB
1480 lines
51 KiB
#ifndef RFBPROTO_H |
|
#define RFBPROTO_H |
|
|
|
/** |
|
@mainpage |
|
@li @ref libvncserver_api |
|
@li @ref libvncserver_doc |
|
|
|
|
|
@li @ref libvncclient_api |
|
@li @ref libvncclient_doc |
|
|
|
*/ |
|
|
|
/* |
|
* Copyright (C) 2009-2010 D. R. Commander. All Rights Reserved. |
|
* Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin |
|
* Copyright (C) 2004-2008 Sun Microsystems, Inc. All Rights Reserved. |
|
* Copyright (C) 2000-2002 Constantin Kaplinsky. All Rights Reserved. |
|
* Copyright (C) 2000 Tridia Corporation. All Rights Reserved. |
|
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. |
|
* |
|
* This is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This software 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 General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this software; if not, write to the Free Software |
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
|
* USA. |
|
*/ |
|
|
|
/* |
|
* rfbproto.h - header file for the RFB protocol version 3.3 |
|
* |
|
* Uses types CARD<n> for an n-bit unsigned integer, INT<n> for an n-bit signed |
|
* integer (for n = 8, 16 and 32). |
|
* |
|
* All multiple byte integers are in big endian (network) order (most |
|
* significant byte first). Unless noted otherwise there is no special |
|
* alignment of protocol structures. |
|
* |
|
* |
|
* Once the initial handshaking is done, all messages start with a type byte, |
|
* (usually) followed by message-specific data. The order of definitions in |
|
* this file is as follows: |
|
* |
|
* (1) Structures used in several types of message. |
|
* (2) Structures used in the initial handshaking. |
|
* (3) Message types. |
|
* (4) Encoding types. |
|
* (5) For each message type, the form of the data following the type byte. |
|
* Sometimes this is defined by a single structure but the more complex |
|
* messages have to be explained by comments. |
|
*/ |
|
|
|
|
|
#if defined(WIN32) && !defined(__MINGW32__) |
|
#define LIBVNCSERVER_WORDS_BIGENDIAN |
|
#define rfbBool int |
|
#include <sys/timeb.h> |
|
#include <winsock2.h> |
|
#undef SOCKET |
|
#define SOCKET int |
|
#else |
|
#include <rfb/rfbconfig.h> |
|
#include <rfb/rfbint.h> |
|
#endif |
|
|
|
#ifdef LIBVNCSERVER_HAVE_LIBZ |
|
#include <zlib.h> |
|
#ifdef __CHECKER__ |
|
#undef Z_NULL |
|
#define Z_NULL NULL |
|
#endif |
|
#endif |
|
|
|
/* some autotool versions do not properly prefix |
|
WORDS_BIGENDIAN, so do that manually */ |
|
#ifdef WORDS_BIGENDIAN |
|
#define LIBVNCSERVER_WORDS_BIGENDIAN |
|
#endif |
|
|
|
/* MS compilers don't have strncasecmp */ |
|
#ifdef _MSC_VER |
|
#define strncasecmp _strnicmp |
|
#endif |
|
|
|
#if !defined(WIN32) || defined(__MINGW32__) |
|
#define max(a,b) (((a)>(b))?(a):(b)) |
|
#ifdef LIBVNCSERVER_HAVE_SYS_TIME_H |
|
#include <sys/time.h> |
|
#endif |
|
#ifdef LIBVNCSERVER_HAVE_NETINET_IN_H |
|
#include <netinet/in.h> |
|
#endif |
|
#define SOCKET int |
|
typedef int8_t rfbBool; |
|
#undef FALSE |
|
#define FALSE 0 |
|
#undef TRUE |
|
#define TRUE -1 |
|
#endif |
|
|
|
#ifdef _MSC_VER |
|
#include <stdint.h> |
|
#endif |
|
|
|
typedef uint32_t rfbKeySym; |
|
typedef uint32_t rfbPixel; |
|
|
|
#ifdef LIBVNCSERVER_NEED_INADDR_T |
|
typedef uint32_t in_addr_t; |
|
#endif |
|
|
|
#ifndef INADDR_NONE |
|
#define INADDR_NONE ((in_addr_t) 0xffffffff) |
|
#endif |
|
|
|
#define MAX_ENCODINGS 21 |
|
|
|
/***************************************************************************** |
|
* |
|
* Structures used in several messages |
|
* |
|
*****************************************************************************/ |
|
|
|
/*----------------------------------------------------------------------------- |
|
* Structure used to specify a rectangle. This structure is a multiple of 4 |
|
* bytes so that it can be interspersed with 32-bit pixel data without |
|
* affecting alignment. |
|
*/ |
|
|
|
typedef struct { |
|
uint16_t x; |
|
uint16_t y; |
|
uint16_t w; |
|
uint16_t h; |
|
} rfbRectangle; |
|
|
|
#define sz_rfbRectangle 8 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Structure used to specify pixel format. |
|
*/ |
|
|
|
typedef struct { |
|
|
|
uint8_t bitsPerPixel; /* 8,16,32 only */ |
|
|
|
uint8_t depth; /* 8 to 32 */ |
|
|
|
uint8_t bigEndian; /* True if multi-byte pixels are interpreted |
|
as big endian, or if single-bit-per-pixel |
|
has most significant bit of the byte |
|
corresponding to first (leftmost) pixel. Of |
|
course this is meaningless for 8 bits/pix */ |
|
|
|
uint8_t trueColour; /* If false then we need a "colour map" to |
|
convert pixels to RGB. If true, xxxMax and |
|
xxxShift specify bits used for red, green |
|
and blue */ |
|
|
|
/* the following fields are only meaningful if trueColour is true */ |
|
|
|
uint16_t redMax; /* maximum red value (= 2^n - 1 where n is the |
|
number of bits used for red). Note this |
|
value is always in big endian order. */ |
|
|
|
uint16_t greenMax; /* similar for green */ |
|
|
|
uint16_t blueMax; /* and blue */ |
|
|
|
uint8_t redShift; /* number of shifts needed to get the red |
|
value in a pixel to the least significant |
|
bit. To find the red value from a given |
|
pixel, do the following: |
|
1) Swap pixel value according to bigEndian |
|
(e.g. if bigEndian is false and host byte |
|
order is big endian, then swap). |
|
2) Shift right by redShift. |
|
3) AND with redMax (in host byte order). |
|
4) You now have the red value between 0 and |
|
redMax. */ |
|
|
|
uint8_t greenShift; /* similar for green */ |
|
|
|
uint8_t blueShift; /* and blue */ |
|
|
|
uint8_t pad1; |
|
uint16_t pad2; |
|
|
|
} rfbPixelFormat; |
|
|
|
#define sz_rfbPixelFormat 16 |
|
|
|
/* UltraVNC: Color settings values */ |
|
#define rfbPFFullColors 0 |
|
#define rfbPF256Colors 1 |
|
#define rfbPF64Colors 2 |
|
#define rfbPF8Colors 3 |
|
#define rfbPF8GreyColors 4 |
|
#define rfbPF4GreyColors 5 |
|
#define rfbPF2GreyColors 6 |
|
|
|
|
|
/***************************************************************************** |
|
* |
|
* Initial handshaking messages |
|
* |
|
*****************************************************************************/ |
|
|
|
/*----------------------------------------------------------------------------- |
|
* Protocol Version |
|
* |
|
* The server always sends 12 bytes to start which identifies the latest RFB |
|
* protocol version number which it supports. These bytes are interpreted |
|
* as a string of 12 ASCII characters in the format "RFB xxx.yyy\n" where |
|
* xxx and yyy are the major and minor version numbers (for version 3.3 |
|
* this is "RFB 003.003\n"). |
|
* |
|
* The client then replies with a similar 12-byte message giving the version |
|
* number of the protocol which should actually be used (which may be different |
|
* to that quoted by the server). |
|
* |
|
* It is intended that both clients and servers may provide some level of |
|
* backwards compatibility by this mechanism. Servers in particular should |
|
* attempt to provide backwards compatibility, and even forwards compatibility |
|
* to some extent. For example if a client demands version 3.1 of the |
|
* protocol, a 3.0 server can probably assume that by ignoring requests for |
|
* encoding types it doesn't understand, everything will still work OK. This |
|
* will probably not be the case for changes in the major version number. |
|
* |
|
* The format string below can be used in sprintf or sscanf to generate or |
|
* decode the version string respectively. |
|
*/ |
|
|
|
#define rfbProtocolVersionFormat "RFB %03d.%03d\n" |
|
#define rfbProtocolMajorVersion 3 |
|
#define rfbProtocolMinorVersion 8 |
|
/* UltraVNC Viewer examines rfbProtocolMinorVersion number (4, and 6) |
|
* to identify if the server supports File Transfer |
|
*/ |
|
|
|
typedef char rfbProtocolVersionMsg[13]; /* allow extra byte for null */ |
|
|
|
#define sz_rfbProtocolVersionMsg 12 |
|
|
|
/* |
|
* Negotiation of the security type (protocol version 3.7) |
|
* |
|
* Once the protocol version has been decided, the server either sends a list |
|
* of supported security types, or informs the client about an error (when the |
|
* number of security types is 0). Security type rfbSecTypeTight is used to |
|
* enable TightVNC-specific protocol extensions. The value rfbSecTypeVncAuth |
|
* stands for classic VNC authentication. |
|
* |
|
* The client selects a particular security type from the list provided by the |
|
* server. |
|
*/ |
|
|
|
#define rfbSecTypeInvalid 0 |
|
#define rfbSecTypeNone 1 |
|
#define rfbSecTypeVncAuth 2 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Authentication |
|
* |
|
* Once the protocol version has been decided, the server then sends a 32-bit |
|
* word indicating whether any authentication is needed on the connection. |
|
* The value of this word determines the authentication scheme in use. For |
|
* version 3.0 of the protocol this may have one of the following values: |
|
*/ |
|
|
|
#define rfbConnFailed 0 |
|
#define rfbNoAuth 1 |
|
#define rfbVncAuth 2 |
|
|
|
#define rfbRA2 5 |
|
#define rfbRA2ne 6 |
|
#define rfbSSPI 7 |
|
#define rfbSSPIne 8 |
|
#define rfbTight 16 |
|
#define rfbUltra 17 |
|
#define rfbTLS 18 |
|
#define rfbVeNCrypt 19 |
|
#define rfbARD 30 |
|
#define rfbMSLogon 0xfffffffa |
|
|
|
#define rfbVeNCryptPlain 256 |
|
#define rfbVeNCryptTLSNone 257 |
|
#define rfbVeNCryptTLSVNC 258 |
|
#define rfbVeNCryptTLSPlain 259 |
|
#define rfbVeNCryptX509None 260 |
|
#define rfbVeNCryptX509VNC 261 |
|
#define rfbVeNCryptX509Plain 262 |
|
#define rfbVeNCryptX509SASL 263 |
|
#define rfbVeNCryptTLSSASL 264 |
|
|
|
/* |
|
* rfbConnFailed: For some reason the connection failed (e.g. the server |
|
* cannot support the desired protocol version). This is |
|
* followed by a string describing the reason (where a |
|
* string is specified as a 32-bit length followed by that |
|
* many ASCII characters). |
|
* |
|
* rfbNoAuth: No authentication is needed. |
|
* |
|
* rfbVncAuth: The VNC authentication scheme is to be used. A 16-byte |
|
* challenge follows, which the client encrypts as |
|
* appropriate using the password and sends the resulting |
|
* 16-byte response. If the response is correct, the |
|
* server sends the 32-bit word rfbVncAuthOK. If a simple |
|
* failure happens, the server sends rfbVncAuthFailed and |
|
* closes the connection. If the server decides that too |
|
* many failures have occurred, it sends rfbVncAuthTooMany |
|
* and closes the connection. In the latter case, the |
|
* server should not allow an immediate reconnection by |
|
* the client. |
|
*/ |
|
|
|
#define rfbVncAuthOK 0 |
|
#define rfbVncAuthFailed 1 |
|
#define rfbVncAuthTooMany 2 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Client Initialisation Message |
|
* |
|
* Once the client and server are sure that they're happy to talk to one |
|
* another, the client sends an initialisation message. At present this |
|
* message only consists of a boolean indicating whether the server should try |
|
* to share the desktop by leaving other clients connected, or give exclusive |
|
* access to this client by disconnecting all other clients. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t shared; |
|
} rfbClientInitMsg; |
|
|
|
#define sz_rfbClientInitMsg 1 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Server Initialisation Message |
|
* |
|
* After the client initialisation message, the server sends one of its own. |
|
* This tells the client the width and height of the server's framebuffer, |
|
* its pixel format and the name associated with the desktop. |
|
*/ |
|
|
|
typedef struct { |
|
uint16_t framebufferWidth; |
|
uint16_t framebufferHeight; |
|
rfbPixelFormat format; /* the server's preferred pixel format */ |
|
uint32_t nameLength; |
|
/* followed by char name[nameLength] */ |
|
} rfbServerInitMsg; |
|
|
|
#define sz_rfbServerInitMsg (8 + sz_rfbPixelFormat) |
|
|
|
|
|
/* |
|
* Following the server initialisation message it's up to the client to send |
|
* whichever protocol messages it wants. Typically it will send a |
|
* SetPixelFormat message and a SetEncodings message, followed by a |
|
* FramebufferUpdateRequest. From then on the server will send |
|
* FramebufferUpdate messages in response to the client's |
|
* FramebufferUpdateRequest messages. The client should send |
|
* FramebufferUpdateRequest messages with incremental set to true when it has |
|
* finished processing one FramebufferUpdate and is ready to process another. |
|
* With a fast client, the rate at which FramebufferUpdateRequests are sent |
|
* should be regulated to avoid hogging the network. |
|
*/ |
|
|
|
|
|
|
|
/***************************************************************************** |
|
* |
|
* Message types |
|
* |
|
*****************************************************************************/ |
|
|
|
/* server -> client */ |
|
|
|
#define rfbFramebufferUpdate 0 |
|
#define rfbSetColourMapEntries 1 |
|
#define rfbBell 2 |
|
#define rfbServerCutText 3 |
|
/* Modif sf@2002 */ |
|
#define rfbResizeFrameBuffer 4 |
|
#define rfbPalmVNCReSizeFrameBuffer 0xF |
|
|
|
/* client -> server */ |
|
|
|
#define rfbSetPixelFormat 0 |
|
#define rfbFixColourMapEntries 1 /* not currently supported */ |
|
#define rfbSetEncodings 2 |
|
#define rfbFramebufferUpdateRequest 3 |
|
#define rfbKeyEvent 4 |
|
#define rfbPointerEvent 5 |
|
#define rfbClientCutText 6 |
|
/* Modif sf@2002 - actually bidirectionnal */ |
|
#define rfbFileTransfer 7 |
|
/* Modif sf@2002 */ |
|
#define rfbSetScale 8 |
|
/* Modif rdv@2002 */ |
|
#define rfbSetServerInput 9 |
|
/* Modif rdv@2002 */ |
|
#define rfbSetSW 10 |
|
/* Modif sf@2002 - TextChat - Bidirectionnal */ |
|
#define rfbTextChat 11 |
|
/* Modif cs@2005 */ |
|
/* PalmVNC 1.4 & 2.0 SetScale Factor message */ |
|
#define rfbPalmVNCSetScaleFactor 0xF |
|
/* Xvp message - bidirectional */ |
|
#define rfbXvp 250 |
|
|
|
|
|
|
|
|
|
/***************************************************************************** |
|
* |
|
* Encoding types |
|
* |
|
*****************************************************************************/ |
|
|
|
#define rfbEncodingRaw 0 |
|
#define rfbEncodingCopyRect 1 |
|
#define rfbEncodingRRE 2 |
|
#define rfbEncodingCoRRE 4 |
|
#define rfbEncodingHextile 5 |
|
#define rfbEncodingZlib 6 |
|
#define rfbEncodingTight 7 |
|
#define rfbEncodingTightPng 0xFFFFFEFC /* -260 */ |
|
#define rfbEncodingZlibHex 8 |
|
#define rfbEncodingUltra 9 |
|
#define rfbEncodingZRLE 16 |
|
#define rfbEncodingZYWRLE 17 |
|
|
|
#define rfbEncodingH264 0x48323634 |
|
|
|
/* Cache & XOR-Zlib - rdv@2002 */ |
|
#define rfbEncodingCache 0xFFFF0000 |
|
#define rfbEncodingCacheEnable 0xFFFF0001 |
|
#define rfbEncodingXOR_Zlib 0xFFFF0002 |
|
#define rfbEncodingXORMonoColor_Zlib 0xFFFF0003 |
|
#define rfbEncodingXORMultiColor_Zlib 0xFFFF0004 |
|
#define rfbEncodingSolidColor 0xFFFF0005 |
|
#define rfbEncodingXOREnable 0xFFFF0006 |
|
#define rfbEncodingCacheZip 0xFFFF0007 |
|
#define rfbEncodingSolMonoZip 0xFFFF0008 |
|
#define rfbEncodingUltraZip 0xFFFF0009 |
|
|
|
/* Xvp pseudo-encoding */ |
|
#define rfbEncodingXvp 0xFFFFFECB |
|
|
|
/* |
|
* Special encoding numbers: |
|
* 0xFFFFFD00 .. 0xFFFFFD05 -- subsampling level |
|
* 0xFFFFFE00 .. 0xFFFFFE64 -- fine-grained quality level (0-100 scale) |
|
* 0xFFFFFF00 .. 0xFFFFFF0F -- encoding-specific compression levels; |
|
* 0xFFFFFF10 .. 0xFFFFFF1F -- mouse cursor shape data; |
|
* 0xFFFFFF20 .. 0xFFFFFF2F -- various protocol extensions; |
|
* 0xFFFFFF30 .. 0xFFFFFFDF -- not allocated yet; |
|
* 0xFFFFFFE0 .. 0xFFFFFFEF -- quality level for JPEG compressor; |
|
* 0xFFFFFFF0 .. 0xFFFFFFFF -- cross-encoding compression levels. |
|
*/ |
|
|
|
#define rfbEncodingFineQualityLevel0 0xFFFFFE00 |
|
#define rfbEncodingFineQualityLevel100 0xFFFFFE64 |
|
#define rfbEncodingSubsamp1X 0xFFFFFD00 |
|
#define rfbEncodingSubsamp4X 0xFFFFFD01 |
|
#define rfbEncodingSubsamp2X 0xFFFFFD02 |
|
#define rfbEncodingSubsampGray 0xFFFFFD03 |
|
#define rfbEncodingSubsamp8X 0xFFFFFD04 |
|
#define rfbEncodingSubsamp16X 0xFFFFFD05 |
|
|
|
#define rfbEncodingCompressLevel0 0xFFFFFF00 |
|
#define rfbEncodingCompressLevel1 0xFFFFFF01 |
|
#define rfbEncodingCompressLevel2 0xFFFFFF02 |
|
#define rfbEncodingCompressLevel3 0xFFFFFF03 |
|
#define rfbEncodingCompressLevel4 0xFFFFFF04 |
|
#define rfbEncodingCompressLevel5 0xFFFFFF05 |
|
#define rfbEncodingCompressLevel6 0xFFFFFF06 |
|
#define rfbEncodingCompressLevel7 0xFFFFFF07 |
|
#define rfbEncodingCompressLevel8 0xFFFFFF08 |
|
#define rfbEncodingCompressLevel9 0xFFFFFF09 |
|
|
|
#define rfbEncodingXCursor 0xFFFFFF10 |
|
#define rfbEncodingRichCursor 0xFFFFFF11 |
|
#define rfbEncodingPointerPos 0xFFFFFF18 |
|
|
|
#define rfbEncodingLastRect 0xFFFFFF20 |
|
#define rfbEncodingNewFBSize 0xFFFFFF21 |
|
|
|
#define rfbEncodingQualityLevel0 0xFFFFFFE0 |
|
#define rfbEncodingQualityLevel1 0xFFFFFFE1 |
|
#define rfbEncodingQualityLevel2 0xFFFFFFE2 |
|
#define rfbEncodingQualityLevel3 0xFFFFFFE3 |
|
#define rfbEncodingQualityLevel4 0xFFFFFFE4 |
|
#define rfbEncodingQualityLevel5 0xFFFFFFE5 |
|
#define rfbEncodingQualityLevel6 0xFFFFFFE6 |
|
#define rfbEncodingQualityLevel7 0xFFFFFFE7 |
|
#define rfbEncodingQualityLevel8 0xFFFFFFE8 |
|
#define rfbEncodingQualityLevel9 0xFFFFFFE9 |
|
|
|
|
|
/* LibVNCServer additions. We claim 0xFFFE0000 - 0xFFFE00FF */ |
|
#define rfbEncodingKeyboardLedState 0xFFFE0000 |
|
#define rfbEncodingSupportedMessages 0xFFFE0001 |
|
#define rfbEncodingSupportedEncodings 0xFFFE0002 |
|
#define rfbEncodingServerIdentity 0xFFFE0003 |
|
|
|
|
|
/***************************************************************************** |
|
* |
|
* Server -> client message definitions |
|
* |
|
*****************************************************************************/ |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* FramebufferUpdate - a block of rectangles to be copied to the framebuffer. |
|
* |
|
* This message consists of a header giving the number of rectangles of pixel |
|
* data followed by the rectangles themselves. The header is padded so that |
|
* together with the type byte it is an exact multiple of 4 bytes (to help |
|
* with alignment of 32-bit pixels): |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbFramebufferUpdate */ |
|
uint8_t pad; |
|
uint16_t nRects; |
|
/* followed by nRects rectangles */ |
|
} rfbFramebufferUpdateMsg; |
|
|
|
#define sz_rfbFramebufferUpdateMsg 4 |
|
|
|
/* |
|
* Each rectangle of pixel data consists of a header describing the position |
|
* and size of the rectangle and a type word describing the encoding of the |
|
* pixel data, followed finally by the pixel data. Note that if the client has |
|
* not sent a SetEncodings message then it will only receive raw pixel data. |
|
* Also note again that this structure is a multiple of 4 bytes. |
|
*/ |
|
|
|
typedef struct { |
|
rfbRectangle r; |
|
uint32_t encoding; /* one of the encoding types rfbEncoding... */ |
|
} rfbFramebufferUpdateRectHeader; |
|
|
|
#define sz_rfbFramebufferUpdateRectHeader (sz_rfbRectangle + 4) |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* Supported Messages Encoding. This encoding does not contain any pixel data. |
|
* Instead, it contains 2 sets of bitflags. These bitflags indicate what messages |
|
* are supported by the server. |
|
* rect->w contains byte count |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t client2server[32]; /* maximum of 256 message types (256/8)=32 */ |
|
uint8_t server2client[32]; /* maximum of 256 message types (256/8)=32 */ |
|
} rfbSupportedMessages; |
|
|
|
#define sz_rfbSupportedMessages 64 |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* Supported Encodings Encoding. This encoding does not contain any pixel data. |
|
* Instead, it contains a list of (uint32_t) Encodings supported by this server. |
|
* rect->w contains byte count |
|
* rect->h contains encoding count |
|
*/ |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* Server Identity Encoding. This encoding does not contain any pixel data. |
|
* Instead, it contains a text string containing information about the server. |
|
* ie: "x11vnc: 0.8.1 lastmod: 2006-04-25 (libvncserver 0.9pre)\0" |
|
* rect->w contains byte count |
|
*/ |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* Raw Encoding. Pixels are sent in top-to-bottom scanline order, |
|
* left-to-right within a scanline with no padding in between. |
|
*/ |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* KeyboardLedState Encoding. The X coordinate contains the Locked Modifiers |
|
* so that a remote troubleshooter can identify that the users 'Caps Lock' |
|
* is set... (It helps a *lot* when the users are untrained) |
|
*/ |
|
#define rfbKeyboardMaskShift 1 |
|
#define rfbKeyboardMaskCapsLock 2 |
|
#define rfbKeyboardMaskControl 4 |
|
#define rfbKeyboardMaskAlt 8 |
|
#define rfbKeyboardMaskMeta 16 |
|
#define rfbKeyboardMaskSuper 32 |
|
#define rfbKeyboardMaskHyper 64 |
|
#define rfbKeyboardMaskNumLock 128 |
|
#define rfbKeyboardMaskScrollLock 256 |
|
#define rfbKeyboardMaskAltGraph 512 |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* CopyRect Encoding. The pixels are specified simply by the x and y position |
|
* of the source rectangle. |
|
*/ |
|
|
|
typedef struct { |
|
uint16_t srcX; |
|
uint16_t srcY; |
|
} rfbCopyRect; |
|
|
|
#define sz_rfbCopyRect 4 |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* RRE - Rise-and-Run-length Encoding. We have an rfbRREHeader structure |
|
* giving the number of subrectangles following. Finally the data follows in |
|
* the form [<bgpixel><subrect><subrect>...] where each <subrect> is |
|
* [<pixel><rfbRectangle>]. |
|
*/ |
|
|
|
typedef struct { |
|
uint32_t nSubrects; |
|
} rfbRREHeader; |
|
|
|
#define sz_rfbRREHeader 4 |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* CoRRE - Compact RRE Encoding. We have an rfbRREHeader structure giving |
|
* the number of subrectangles following. Finally the data follows in the form |
|
* [<bgpixel><subrect><subrect>...] where each <subrect> is |
|
* [<pixel><rfbCoRRERectangle>]. This means that |
|
* the whole rectangle must be at most 255x255 pixels. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t x; |
|
uint8_t y; |
|
uint8_t w; |
|
uint8_t h; |
|
} rfbCoRRERectangle; |
|
|
|
#define sz_rfbCoRRERectangle 4 |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* Hextile Encoding. The rectangle is divided up into "tiles" of 16x16 pixels, |
|
* starting at the top left going in left-to-right, top-to-bottom order. If |
|
* the width of the rectangle is not an exact multiple of 16 then the width of |
|
* the last tile in each row will be correspondingly smaller. Similarly if the |
|
* height is not an exact multiple of 16 then the height of each tile in the |
|
* final row will also be smaller. Each tile begins with a "subencoding" type |
|
* byte, which is a mask made up of a number of bits. If the Raw bit is set |
|
* then the other bits are irrelevant; w*h pixel values follow (where w and h |
|
* are the width and height of the tile). Otherwise the tile is encoded in a |
|
* similar way to RRE, except that the position and size of each subrectangle |
|
* can be specified in just two bytes. The other bits in the mask are as |
|
* follows: |
|
* |
|
* BackgroundSpecified - if set, a pixel value follows which specifies |
|
* the background colour for this tile. The first non-raw tile in a |
|
* rectangle must have this bit set. If this bit isn't set then the |
|
* background is the same as the last tile. |
|
* |
|
* ForegroundSpecified - if set, a pixel value follows which specifies |
|
* the foreground colour to be used for all subrectangles in this tile. |
|
* If this bit is set then the SubrectsColoured bit must be zero. |
|
* |
|
* AnySubrects - if set, a single byte follows giving the number of |
|
* subrectangles following. If not set, there are no subrectangles (i.e. |
|
* the whole tile is just solid background colour). |
|
* |
|
* SubrectsColoured - if set then each subrectangle is preceded by a pixel |
|
* value giving the colour of that subrectangle. If not set, all |
|
* subrectangles are the same colour, the foreground colour; if the |
|
* ForegroundSpecified bit wasn't set then the foreground is the same as |
|
* the last tile. |
|
* |
|
* The position and size of each subrectangle is specified in two bytes. The |
|
* Pack macros below can be used to generate the two bytes from x, y, w, h, |
|
* and the Extract macros can be used to extract the x, y, w, h values from |
|
* the two bytes. |
|
*/ |
|
|
|
#define rfbHextileRaw (1 << 0) |
|
#define rfbHextileBackgroundSpecified (1 << 1) |
|
#define rfbHextileForegroundSpecified (1 << 2) |
|
#define rfbHextileAnySubrects (1 << 3) |
|
#define rfbHextileSubrectsColoured (1 << 4) |
|
|
|
#define rfbHextilePackXY(x,y) (((x) << 4) | (y)) |
|
#define rfbHextilePackWH(w,h) ((((w)-1) << 4) | ((h)-1)) |
|
#define rfbHextileExtractX(byte) ((byte) >> 4) |
|
#define rfbHextileExtractY(byte) ((byte) & 0xf) |
|
#define rfbHextileExtractW(byte) (((byte) >> 4) + 1) |
|
#define rfbHextileExtractH(byte) (((byte) & 0xf) + 1) |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* zlib - zlib compressed Encoding. We have an rfbZlibHeader structure |
|
* giving the number of bytes following. Finally the data follows is |
|
* zlib compressed version of the raw pixel data as negotiated. |
|
* (NOTE: also used by Ultra Encoding) |
|
*/ |
|
|
|
typedef struct { |
|
uint32_t nBytes; |
|
} rfbZlibHeader; |
|
|
|
#define sz_rfbZlibHeader 4 |
|
|
|
#ifdef LIBVNCSERVER_HAVE_LIBZ |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* Tight and TightPng Encoding. |
|
* |
|
*-- TightPng is like Tight but basic compression is not used, instead PNG |
|
* data is sent. |
|
* |
|
*-- The first byte of each Tight-encoded rectangle is a "compression control |
|
* byte". Its format is as follows (bit 0 is the least significant one): |
|
* |
|
* bit 0: if 1, then compression stream 0 should be reset; |
|
* bit 1: if 1, then compression stream 1 should be reset; |
|
* bit 2: if 1, then compression stream 2 should be reset; |
|
* bit 3: if 1, then compression stream 3 should be reset; |
|
* bits 7-4: if 1000 (0x08), then the compression type is "fill", |
|
* if 1001 (0x09), then the compression type is "jpeg", |
|
* (Tight only) if 1010 (0x0A), then the compression type is |
|
* "basic" and no Zlib compression was used, |
|
* (Tight only) if 1110 (0x0E), then the compression type is |
|
* "basic", no Zlib compression was used, and a "filter id" byte |
|
* follows this byte, |
|
* (TightPng only) if 1010 (0x0A), then the compression type is |
|
* "png", |
|
* if 0xxx, then the compression type is "basic" and Zlib |
|
* compression was used, |
|
* values greater than 1010 are not valid. |
|
* |
|
* If the compression type is "basic" and Zlib compression was used, then bits |
|
* 6..4 of the compression control byte (those xxx in 0xxx) specify the |
|
* following: |
|
* |
|
* bits 5-4: decimal representation is the index of a particular zlib |
|
* stream which should be used for decompressing the data; |
|
* bit 6: if 1, then a "filter id" byte is following this byte. |
|
* |
|
*-- The data that follows after the compression control byte described |
|
* above depends on the compression type ("fill", "jpeg", "png" or "basic"). |
|
* |
|
*-- If the compression type is "fill", then the only pixel value follows, in |
|
* client pixel format (see NOTE 1). This value applies to all pixels of the |
|
* rectangle. |
|
* |
|
*-- If the compression type is "jpeg" or "png", the following data stream |
|
* looks like this: |
|
* |
|
* 1..3 bytes: data size (N) in compact representation; |
|
* N bytes: JPEG or PNG image. |
|
* |
|
* Data size is compactly represented in one, two or three bytes, according |
|
* to the following scheme: |
|
* |
|
* 0xxxxxxx (for values 0..127) |
|
* 1xxxxxxx 0yyyyyyy (for values 128..16383) |
|
* 1xxxxxxx 1yyyyyyy zzzzzzzz (for values 16384..4194303) |
|
* |
|
* Here each character denotes one bit, xxxxxxx are the least significant 7 |
|
* bits of the value (bits 0-6), yyyyyyy are bits 7-13, and zzzzzzzz are the |
|
* most significant 8 bits (bits 14-21). For example, decimal value 10000 |
|
* should be represented as two bytes: binary 10010000 01001110, or |
|
* hexadecimal 90 4E. |
|
* |
|
*-- If the compression type is "basic" and bit 6 of the compression control |
|
* byte was set to 1, then the next (second) byte specifies "filter id" which |
|
* tells the decoder what filter type was used by the encoder to pre-process |
|
* pixel data before the compression. The "filter id" byte can be one of the |
|
* following: |
|
* |
|
* 0: no filter ("copy" filter); |
|
* 1: "palette" filter; |
|
* 2: "gradient" filter. |
|
* |
|
*-- If bit 6 of the compression control byte is set to 0 (no "filter id" |
|
* byte), or if the filter id is 0, then raw pixel values in the client |
|
* format (see NOTE 1) will be compressed. See below details on the |
|
* compression. |
|
* |
|
*-- The "gradient" filter pre-processes pixel data with a simple algorithm |
|
* which converts each color component to a difference between a "predicted" |
|
* intensity and the actual intensity. Such a technique does not affect |
|
* uncompressed data size, but helps to compress photo-like images better. |
|
* Pseudo-code for converting intensities to differences is the following: |
|
* |
|
* P[i,j] := V[i-1,j] + V[i,j-1] - V[i-1,j-1]; |
|
* if (P[i,j] < 0) then P[i,j] := 0; |
|
* if (P[i,j] > MAX) then P[i,j] := MAX; |
|
* D[i,j] := V[i,j] - P[i,j]; |
|
* |
|
* Here V[i,j] is the intensity of a color component for a pixel at |
|
* coordinates (i,j). MAX is the maximum value of intensity for a color |
|
* component. |
|
* |
|
*-- The "palette" filter converts true-color pixel data to indexed colors |
|
* and a palette which can consist of 2..256 colors. If the number of colors |
|
* is 2, then each pixel is encoded in 1 bit, otherwise 8 bits is used to |
|
* encode one pixel. 1-bit encoding is performed such way that the most |
|
* significant bits correspond to the leftmost pixels, and each raw of pixels |
|
* is aligned to the byte boundary. When "palette" filter is used, the |
|
* palette is sent before the pixel data. The palette begins with an unsigned |
|
* byte which value is the number of colors in the palette minus 1 (i.e. 1 |
|
* means 2 colors, 255 means 256 colors in the palette). Then follows the |
|
* palette itself which consist of pixel values in client pixel format (see |
|
* NOTE 1). |
|
* |
|
*-- The pixel data is compressed using the zlib library. But if the data |
|
* size after applying the filter but before the compression is less then 12, |
|
* then the data is sent as is, uncompressed. Four separate zlib streams |
|
* (0..3) can be used and the decoder should read the actual stream id from |
|
* the compression control byte (see NOTE 2). |
|
* |
|
* If the compression is not used, then the pixel data is sent as is, |
|
* otherwise the data stream looks like this: |
|
* |
|
* 1..3 bytes: data size (N) in compact representation; |
|
* N bytes: zlib-compressed data. |
|
* |
|
* Data size is compactly represented in one, two or three bytes, just like |
|
* in the "jpeg" compression method (see above). |
|
* |
|
*-- NOTE 1. If the color depth is 24, and all three color components are |
|
* 8-bit wide, then one pixel in Tight encoding is always represented by |
|
* three bytes, where the first byte is red component, the second byte is |
|
* green component, and the third byte is blue component of the pixel color |
|
* value. This applies to colors in palettes as well. |
|
* |
|
*-- NOTE 2. The decoder must reset compression streams' states before |
|
* decoding the rectangle, if some of bits 0,1,2,3 in the compression control |
|
* byte are set to 1. Note that the decoder must reset zlib streams even if |
|
* the compression type is "fill", "jpeg" or "png". |
|
* |
|
*-- NOTE 3. The "gradient" filter and "jpeg" compression may be used only |
|
* when bits-per-pixel value is either 16 or 32, not 8. |
|
* |
|
*-- NOTE 4. The width of any Tight-encoded rectangle cannot exceed 2048 |
|
* pixels. If a rectangle is wider, it must be split into several rectangles |
|
* and each one should be encoded separately. |
|
* |
|
*/ |
|
|
|
#define rfbTightExplicitFilter 0x04 |
|
#define rfbTightFill 0x08 |
|
#define rfbTightJpeg 0x09 |
|
#define rfbTightNoZlib 0x0A |
|
#define rfbTightPng 0x0A |
|
#define rfbTightMaxSubencoding 0x0A |
|
|
|
/* Filters to improve compression efficiency */ |
|
#define rfbTightFilterCopy 0x00 |
|
#define rfbTightFilterPalette 0x01 |
|
#define rfbTightFilterGradient 0x02 |
|
|
|
#endif |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* h264 - h264 encoding. We have an rfbH264Header structure |
|
* giving the number of bytes following. Finally the data follows is |
|
* h264 encoded frame. |
|
*/ |
|
|
|
typedef struct { |
|
uint32_t nBytes; |
|
uint32_t slice_type; |
|
uint32_t width; |
|
uint32_t height; |
|
} rfbH264Header; |
|
|
|
#define sz_rfbH264Header 16 |
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* XCursor encoding. This is a special encoding used to transmit X-style |
|
* cursor shapes from server to clients. Note that for this encoding, |
|
* coordinates in rfbFramebufferUpdateRectHeader structure hold hotspot |
|
* position (r.x, r.y) and cursor size (r.w, r.h). If (w * h != 0), two RGB |
|
* samples are sent after header in the rfbXCursorColors structure. They |
|
* denote foreground and background colors of the cursor. If a client |
|
* supports only black-and-white cursors, it should ignore these colors and |
|
* assume that foreground is black and background is white. Next, two bitmaps |
|
* (1 bits per pixel) follow: first one with actual data (value 0 denotes |
|
* background color, value 1 denotes foreground color), second one with |
|
* transparency data (bits with zero value mean that these pixels are |
|
* transparent). Both bitmaps represent cursor data in a byte stream, from |
|
* left to right, from top to bottom, and each row is byte-aligned. Most |
|
* significant bits correspond to leftmost pixels. The number of bytes in |
|
* each row can be calculated as ((w + 7) / 8). If (w * h == 0), cursor |
|
* should be hidden (or default local cursor should be set by the client). |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t foreRed; |
|
uint8_t foreGreen; |
|
uint8_t foreBlue; |
|
uint8_t backRed; |
|
uint8_t backGreen; |
|
uint8_t backBlue; |
|
} rfbXCursorColors; |
|
|
|
#define sz_rfbXCursorColors 6 |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* RichCursor encoding. This is a special encoding used to transmit cursor |
|
* shapes from server to clients. It is similar to the XCursor encoding but |
|
* uses client pixel format instead of two RGB colors to represent cursor |
|
* image. For this encoding, coordinates in rfbFramebufferUpdateRectHeader |
|
* structure hold hotspot position (r.x, r.y) and cursor size (r.w, r.h). |
|
* After header, two pixmaps follow: first one with cursor image in current |
|
* client pixel format (like in raw encoding), second with transparency data |
|
* (1 bit per pixel, exactly the same format as used for transparency bitmap |
|
* in the XCursor encoding). If (w * h == 0), cursor should be hidden (or |
|
* default local cursor should be set by the client). |
|
*/ |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* ZRLE - encoding combining Zlib compression, tiling, palettisation and |
|
* run-length encoding. |
|
*/ |
|
|
|
typedef struct { |
|
uint32_t length; |
|
} rfbZRLEHeader; |
|
|
|
#define sz_rfbZRLEHeader 4 |
|
|
|
#define rfbZRLETileWidth 64 |
|
#define rfbZRLETileHeight 64 |
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* ZLIBHEX - zlib compressed Hextile Encoding. Essentially, this is the |
|
* hextile encoding with zlib compression on the tiles that can not be |
|
* efficiently encoded with one of the other hextile subencodings. The |
|
* new zlib subencoding uses two bytes to specify the length of the |
|
* compressed tile and then the compressed data follows. As with the |
|
* raw sub-encoding, the zlib subencoding invalidates the other |
|
* values, if they are also set. |
|
*/ |
|
|
|
#define rfbHextileZlibRaw (1 << 5) |
|
#define rfbHextileZlibHex (1 << 6) |
|
#define rfbHextileZlibMono (1 << 7) |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* SetColourMapEntries - these messages are only sent if the pixel |
|
* format uses a "colour map" (i.e. trueColour false) and the client has not |
|
* fixed the entire colour map using FixColourMapEntries. In addition they |
|
* will only start being sent after the client has sent its first |
|
* FramebufferUpdateRequest. So if the client always tells the server to use |
|
* trueColour then it never needs to process this type of message. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbSetColourMapEntries */ |
|
uint8_t pad; |
|
uint16_t firstColour; |
|
uint16_t nColours; |
|
|
|
/* Followed by nColours * 3 * uint16_t |
|
r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */ |
|
|
|
} rfbSetColourMapEntriesMsg; |
|
|
|
#define sz_rfbSetColourMapEntriesMsg 6 |
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Bell - ring a bell on the client if it has one. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbBell */ |
|
} rfbBellMsg; |
|
|
|
#define sz_rfbBellMsg 1 |
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* ServerCutText - the server has new text in its cut buffer. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbServerCutText */ |
|
uint8_t pad1; |
|
uint16_t pad2; |
|
uint32_t length; |
|
/* followed by char text[length] */ |
|
} rfbServerCutTextMsg; |
|
|
|
#define sz_rfbServerCutTextMsg 8 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* // Modif sf@2002 |
|
* FileTransferMsg - The client sends FileTransfer message. |
|
* Bidirectional message - Files can be sent from client to server & vice versa |
|
*/ |
|
|
|
typedef struct _rfbFileTransferMsg { |
|
uint8_t type; /* always rfbFileTransfer */ |
|
uint8_t contentType; /* See defines below */ |
|
uint8_t contentParam;/* Other possible content classification (Dir or File name, etc..) */ |
|
uint8_t pad; /* It appears that UltraVNC *forgot* to Swap16IfLE(contentParam) */ |
|
uint32_t size; /* FileSize or packet index or error or other */ |
|
/* uint32_t sizeH; Additional 32Bits params to handle big values. Only for V2 (we want backward compatibility between all V1 versions) */ |
|
uint32_t length; |
|
/* followed by data char text[length] */ |
|
} rfbFileTransferMsg; |
|
|
|
#define sz_rfbFileTransferMsg 12 |
|
|
|
#define rfbFileTransferVersion 2 /* v1 is the old FT version ( <= 1.0.0 RC18 versions) */ |
|
|
|
/* FileTransfer Content types and Params defines */ |
|
#define rfbDirContentRequest 1 /* Client asks for the content of a given Server directory */ |
|
#define rfbDirPacket 2 /* Full directory name or full file name. */ |
|
/* Null content means end of Directory */ |
|
#define rfbFileTransferRequest 3 /* Client asks the server for the transfer of a given file */ |
|
#define rfbFileHeader 4 /* First packet of a file transfer, containing file's features */ |
|
#define rfbFilePacket 5 /* One chunk of the file */ |
|
#define rfbEndOfFile 6 /* End of file transfer (the file has been received or error) */ |
|
#define rfbAbortFileTransfer 7 /* The file transfer must be aborted, whatever the state */ |
|
#define rfbFileTransferOffer 8 /* The client offers to send a file to the server */ |
|
#define rfbFileAcceptHeader 9 /* The server accepts or rejects the file */ |
|
#define rfbCommand 10 /* The Client sends a simple command (File Delete, Dir create etc...) */ |
|
#define rfbCommandReturn 11 /* The Client receives the server's answer about a simple command */ |
|
#define rfbFileChecksums 12 /* The zipped checksums of the destination file (Delta Transfer) */ |
|
#define rfbFileTransferAccess 14 /* Request FileTransfer authorization */ |
|
|
|
/* rfbDirContentRequest client Request - content params */ |
|
#define rfbRDirContent 1 /* Request a Server Directory contents */ |
|
#define rfbRDrivesList 2 /* Request the server's drives list */ |
|
#define rfbRDirRecursiveList 3 /* Request a server directory content recursive sorted list */ |
|
#define rfbRDirRecursiveSize 4 /* Request a server directory content recursive size */ |
|
|
|
/* rfbDirPacket & rfbCommandReturn server Answer - content params */ |
|
#define rfbADirectory 1 /* Reception of a directory name */ |
|
#define rfbAFile 2 /* Reception of a file name */ |
|
#define rfbADrivesList 3 /* Reception of a list of drives */ |
|
#define rfbADirCreate 4 /* Response to a create dir command */ |
|
#define rfbADirDelete 5 /* Response to a delete dir command */ |
|
#define rfbAFileCreate 6 /* Response to a create file command */ |
|
#define rfbAFileDelete 7 /* Response to a delete file command */ |
|
#define rfbAFileRename 8 /* Response to a rename file command */ |
|
#define rfbADirRename 9 /* Response to a rename dir command */ |
|
#define rfbADirRecursiveListItem 10 |
|
#define rfbADirRecursiveSize 11 |
|
|
|
/* rfbCommand Command - content params */ |
|
#define rfbCDirCreate 1 /* Request the server to create the given directory */ |
|
#define rfbCDirDelete 2 /* Request the server to delete the given directory */ |
|
#define rfbCFileCreate 3 /* Request the server to create the given file */ |
|
#define rfbCFileDelete 4 /* Request the server to delete the given file */ |
|
#define rfbCFileRename 5 /* Request the server to rename the given file */ |
|
#define rfbCDirRename 6 /* Request the server to rename the given directory */ |
|
|
|
/* Errors - content params or "size" field */ |
|
#define rfbRErrorUnknownCmd 1 /* Unknown FileTransfer command. */ |
|
#define rfbRErrorCmd 0xFFFFFFFF/* Error when a command fails on remote side (ret in "size" field) */ |
|
|
|
#define sz_rfbBlockSize 8192 /* Size of a File Transfer packet (before compression) */ |
|
#define rfbZipDirectoryPrefix "!UVNCDIR-\0" /* Transfered directory are zipped in a file with this prefix. Must end with "-" */ |
|
#define sz_rfbZipDirectoryPrefix 9 |
|
#define rfbDirPrefix "[ " |
|
#define rfbDirSuffix " ]" |
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Modif sf@2002 |
|
* TextChatMsg - Utilized to order the TextChat mode on server or client |
|
* Bidirectional message |
|
*/ |
|
|
|
typedef struct _rfbTextChatMsg { |
|
uint8_t type; /* always rfbTextChat */ |
|
uint8_t pad1; /* Could be used later as an additionnal param */ |
|
uint16_t pad2; /* Could be used later as text offset, for instance */ |
|
uint32_t length; /* Specific values for Open, close, finished (-1, -2, -3) */ |
|
/* followed by char text[length] */ |
|
} rfbTextChatMsg; |
|
|
|
#define sz_rfbTextChatMsg 8 |
|
|
|
#define rfbTextMaxSize 4096 |
|
#define rfbTextChatOpen 0xFFFFFFFF |
|
#define rfbTextChatClose 0xFFFFFFFE |
|
#define rfbTextChatFinished 0xFFFFFFFD |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Xvp Message |
|
* Bidirectional message |
|
* A server which supports the xvp extension declares this by sending a message |
|
* with an Xvp_INIT xvp-message-code when it receives a request from the client |
|
* to use the xvp Pseudo-encoding. The server must specify in this message the |
|
* highest xvp-extension-version it supports: the client may assume that the |
|
* server supports all versions from 1 up to this value. The client is then |
|
* free to use any supported version. Currently, only version 1 is defined. |
|
* |
|
* A server which subsequently receives an xvp Client Message requesting an |
|
* operation which it is unable to perform, informs the client of this by |
|
* sending a message with an Xvp_FAIL xvp-message-code, and the same |
|
* xvp-extension-version as included in the client's operation request. |
|
* |
|
* A client supporting the xvp extension sends this to request that the server |
|
* initiate a clean shutdown, clean reboot or abrupt reset of the system whose |
|
* framebuffer the client is displaying. |
|
*/ |
|
|
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbXvp */ |
|
uint8_t pad; |
|
uint8_t version; /* xvp extension version */ |
|
uint8_t code; /* xvp message code */ |
|
} rfbXvpMsg; |
|
|
|
#define sz_rfbXvpMsg (4) |
|
|
|
/* server message codes */ |
|
#define rfbXvp_Fail 0 |
|
#define rfbXvp_Init 1 |
|
/* client message codes */ |
|
#define rfbXvp_Shutdown 2 |
|
#define rfbXvp_Reboot 3 |
|
#define rfbXvp_Reset 4 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Modif sf@2002 |
|
* ResizeFrameBuffer - The Client must change the size of its framebuffer |
|
*/ |
|
|
|
typedef struct _rfbResizeFrameBufferMsg { |
|
uint8_t type; /* always rfbResizeFrameBuffer */ |
|
uint8_t pad1; |
|
uint16_t framebufferWidth; /* FrameBuffer width */ |
|
uint16_t framebufferHeigth; /* FrameBuffer height */ |
|
} rfbResizeFrameBufferMsg; |
|
|
|
#define sz_rfbResizeFrameBufferMsg 6 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Copyright (C) 2001 Harakan Software |
|
* PalmVNC 1.4 & 2.? ResizeFrameBuffer message |
|
* ReSizeFrameBuffer - tell the RFB client to alter its framebuffer, either |
|
* due to a resize of the server desktop or a client-requested scaling factor. |
|
* The pixel format remains unchanged. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbReSizeFrameBuffer */ |
|
uint8_t pad1; |
|
uint16_t desktop_w; /* Desktop width */ |
|
uint16_t desktop_h; /* Desktop height */ |
|
uint16_t buffer_w; /* FrameBuffer width */ |
|
uint16_t buffer_h; /* Framebuffer height */ |
|
uint16_t pad2; |
|
|
|
} rfbPalmVNCReSizeFrameBufferMsg; |
|
|
|
#define sz_rfbPalmVNCReSizeFrameBufferMsg (12) |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Union of all server->client messages. |
|
*/ |
|
|
|
typedef union { |
|
uint8_t type; |
|
rfbFramebufferUpdateMsg fu; |
|
rfbSetColourMapEntriesMsg scme; |
|
rfbBellMsg b; |
|
rfbServerCutTextMsg sct; |
|
rfbResizeFrameBufferMsg rsfb; |
|
rfbPalmVNCReSizeFrameBufferMsg prsfb; |
|
rfbFileTransferMsg ft; |
|
rfbTextChatMsg tc; |
|
rfbXvpMsg xvp; |
|
} rfbServerToClientMsg; |
|
|
|
|
|
|
|
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
* RDV Cache Encoding. |
|
* special is not used at this point, can be used to reset cache or other specials |
|
* just put it to make sure we don't have to change the encoding again. |
|
*/ |
|
|
|
typedef struct { |
|
uint16_t special; |
|
} rfbCacheRect; |
|
|
|
#define sz_rfbCacheRect 2 |
|
|
|
|
|
|
|
|
|
/***************************************************************************** |
|
* |
|
* Message definitions (client -> server) |
|
* |
|
*****************************************************************************/ |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* SetPixelFormat - tell the RFB server the format in which the client wants |
|
* pixels sent. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbSetPixelFormat */ |
|
uint8_t pad1; |
|
uint16_t pad2; |
|
rfbPixelFormat format; |
|
} rfbSetPixelFormatMsg; |
|
|
|
#define sz_rfbSetPixelFormatMsg (sz_rfbPixelFormat + 4) |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* FixColourMapEntries - when the pixel format uses a "colour map", fix |
|
* read-only colour map entries. |
|
* |
|
* ***************** NOT CURRENTLY SUPPORTED ***************** |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbFixColourMapEntries */ |
|
uint8_t pad; |
|
uint16_t firstColour; |
|
uint16_t nColours; |
|
|
|
/* Followed by nColours * 3 * uint16_t |
|
r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */ |
|
|
|
} rfbFixColourMapEntriesMsg; |
|
|
|
#define sz_rfbFixColourMapEntriesMsg 6 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* SetEncodings - tell the RFB server which encoding types we accept. Put them |
|
* in order of preference, if we have any. We may always receive raw |
|
* encoding, even if we don't specify it here. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbSetEncodings */ |
|
uint8_t pad; |
|
uint16_t nEncodings; |
|
/* followed by nEncodings * uint32_t encoding types */ |
|
} rfbSetEncodingsMsg; |
|
|
|
#define sz_rfbSetEncodingsMsg 4 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* FramebufferUpdateRequest - request for a framebuffer update. If incremental |
|
* is true then the client just wants the changes since the last update. If |
|
* false then it wants the whole of the specified rectangle. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbFramebufferUpdateRequest */ |
|
uint8_t incremental; |
|
uint16_t x; |
|
uint16_t y; |
|
uint16_t w; |
|
uint16_t h; |
|
} rfbFramebufferUpdateRequestMsg; |
|
|
|
#define sz_rfbFramebufferUpdateRequestMsg 10 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* KeyEvent - key press or release |
|
* |
|
* Keys are specified using the "keysym" values defined by the X Window System. |
|
* For most ordinary keys, the keysym is the same as the corresponding ASCII |
|
* value. Other common keys are: |
|
* |
|
* BackSpace 0xff08 |
|
* Tab 0xff09 |
|
* Return or Enter 0xff0d |
|
* Escape 0xff1b |
|
* Insert 0xff63 |
|
* Delete 0xffff |
|
* Home 0xff50 |
|
* End 0xff57 |
|
* Page Up 0xff55 |
|
* Page Down 0xff56 |
|
* Left 0xff51 |
|
* Up 0xff52 |
|
* Right 0xff53 |
|
* Down 0xff54 |
|
* F1 0xffbe |
|
* F2 0xffbf |
|
* ... ... |
|
* F12 0xffc9 |
|
* Shift 0xffe1 |
|
* Control 0xffe3 |
|
* Meta 0xffe7 |
|
* Alt 0xffe9 |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbKeyEvent */ |
|
uint8_t down; /* true if down (press), false if up */ |
|
uint16_t pad; |
|
uint32_t key; /* key is specified as an X keysym */ |
|
} rfbKeyEventMsg; |
|
|
|
#define sz_rfbKeyEventMsg 8 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* PointerEvent - mouse/pen move and/or button press. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbPointerEvent */ |
|
uint8_t buttonMask; /* bits 0-7 are buttons 1-8, 0=up, 1=down */ |
|
uint16_t x; |
|
uint16_t y; |
|
} rfbPointerEventMsg; |
|
|
|
#define rfbButton1Mask 1 |
|
#define rfbButton2Mask 2 |
|
#define rfbButton3Mask 4 |
|
#define rfbButton4Mask 8 |
|
#define rfbButton5Mask 16 |
|
/* RealVNC 335 method */ |
|
#define rfbWheelUpMask rfbButton4Mask |
|
#define rfbWheelDownMask rfbButton5Mask |
|
|
|
#define sz_rfbPointerEventMsg 6 |
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* ClientCutText - the client has new text in its cut buffer. |
|
*/ |
|
|
|
typedef struct { |
|
uint8_t type; /* always rfbClientCutText */ |
|
uint8_t pad1; |
|
uint16_t pad2; |
|
uint32_t length; |
|
/* followed by char text[length] */ |
|
} rfbClientCutTextMsg; |
|
|
|
#define sz_rfbClientCutTextMsg 8 |
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* sf@2002 - Set Server Scale |
|
* SetServerScale - Server must change the scale of the client buffer. |
|
*/ |
|
|
|
typedef struct _rfbSetScaleMsg { |
|
uint8_t type; /* always rfbSetScale */ |
|
uint8_t scale; /* Scale value 1<sv<n */ |
|
uint16_t pad; |
|
} rfbSetScaleMsg; |
|
|
|
#define sz_rfbSetScaleMsg 4 |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Copyright (C) 2001 Harakan Software |
|
* PalmVNC 1.4 & 2.? SetScale Factor message |
|
* SetScaleFactor - tell the RFB server to alter the scale factor for the |
|
* client buffer. |
|
*/ |
|
typedef struct { |
|
uint8_t type; /* always rfbPalmVNCSetScaleFactor */ |
|
|
|
uint8_t scale; /* Scale factor (positive non-zero integer) */ |
|
uint16_t pad2; |
|
} rfbPalmVNCSetScaleFactorMsg; |
|
|
|
#define sz_rfbPalmVNCSetScaleFactorMsg (4) |
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* rdv@2002 - Set input status |
|
* SetServerInput - Server input is dis/enabled |
|
*/ |
|
|
|
typedef struct _rfbSetServerInputMsg { |
|
uint8_t type; /* always rfbSetScale */ |
|
uint8_t status; /* Scale value 1<sv<n */ |
|
uint16_t pad; |
|
} rfbSetServerInputMsg; |
|
|
|
#define sz_rfbSetServerInputMsg 4 |
|
|
|
/*----------------------------------------------------------------------------- |
|
* rdv@2002 - Set SW |
|
* SetSW - Server SW/full desktop |
|
*/ |
|
|
|
typedef struct _rfbSetSWMsg { |
|
uint8_t type; /* always rfbSetSW */ |
|
uint8_t status; |
|
uint16_t x; |
|
uint16_t y; |
|
} rfbSetSWMsg; |
|
|
|
#define sz_rfbSetSWMsg 6 |
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------- |
|
* Union of all client->server messages. |
|
*/ |
|
|
|
typedef union { |
|
uint8_t type; |
|
rfbSetPixelFormatMsg spf; |
|
rfbFixColourMapEntriesMsg fcme; |
|
rfbSetEncodingsMsg se; |
|
rfbFramebufferUpdateRequestMsg fur; |
|
rfbKeyEventMsg ke; |
|
rfbPointerEventMsg pe; |
|
rfbClientCutTextMsg cct; |
|
rfbSetScaleMsg ssc; |
|
rfbPalmVNCSetScaleFactorMsg pssf; |
|
rfbSetServerInputMsg sim; |
|
rfbFileTransferMsg ft; |
|
rfbSetSWMsg sw; |
|
rfbTextChatMsg tc; |
|
rfbXvpMsg xvp; |
|
} rfbClientToServerMsg; |
|
|
|
/* |
|
* vncauth.h - describes the functions provided by the vncauth library. |
|
*/ |
|
|
|
#define MAXPWLEN 8 |
|
#define CHALLENGESIZE 16 |
|
|
|
extern int rfbEncryptAndStorePasswd(char *passwd, char *fname); |
|
extern char *rfbDecryptPasswdFromFile(char *fname); |
|
extern void rfbRandomBytes(unsigned char *bytes); |
|
extern void rfbEncryptBytes(unsigned char *bytes, char *passwd); |
|
|
|
|
|
#endif
|
|
|