Home | History | Annotate | Download | only in rfb
      1 #ifndef RFBCLIENT_H
      2 #define RFBCLIENT_H
      3 
      4 /**
      5  * @defgroup libvncclient_api LibVNCClient API Reference
      6  * @{
      7  */
      8 
      9 /*
     10  *  Copyright (C) 2000, 2001 Const Kaplinsky.  All Rights Reserved.
     11  *  Copyright (C) 2000 Tridia Corporation.  All Rights Reserved.
     12  *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
     13  *
     14  *  This is free software; you can redistribute it and/or modify
     15  *  it under the terms of the GNU General Public License as published by
     16  *  the Free Software Foundation; either version 2 of the License, or
     17  *  (at your option) any later version.
     18  *
     19  *  This software is distributed in the hope that it will be useful,
     20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22  *  GNU General Public License for more details.
     23  *
     24  *  You should have received a copy of the GNU General Public License
     25  *  along with this software; if not, write to the Free Software
     26  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
     27  *  USA.
     28  */
     29 
     30 /**
     31  * @file rfbclient.h
     32  */
     33 
     34 #include <stdio.h>
     35 #include <stdlib.h>
     36 #include <string.h>
     37 #include <sys/time.h>
     38 #include <unistd.h>
     39 #include <rfb/rfbproto.h>
     40 #include <rfb/keysym.h>
     41 
     42 #define rfbClientSwap16IfLE(s) \
     43     (*(char *)&client->endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s))
     44 
     45 #define rfbClientSwap32IfLE(l) \
     46     (*(char *)&client->endianTest ? ((((l) & 0xff000000) >> 24) | \
     47 			     (((l) & 0x00ff0000) >> 8)  | \
     48 			     (((l) & 0x0000ff00) << 8)  | \
     49 			     (((l) & 0x000000ff) << 24))  : (l))
     50 
     51 #define rfbClientSwap64IfLE(l) \
     52     (*(char *)&client->endianTest ? ((((l) & 0xff00000000000000ULL) >> 56) | \
     53 			     (((l) & 0x00ff000000000000ULL) >> 40)  | \
     54 			     (((l) & 0x0000ff0000000000ULL) >> 24)  | \
     55 			     (((l) & 0x000000ff00000000ULL) >> 8)  | \
     56 			     (((l) & 0x00000000ff000000ULL) << 8)  | \
     57 			     (((l) & 0x0000000000ff0000ULL) << 24)  | \
     58 			     (((l) & 0x000000000000ff00ULL) << 40)  | \
     59 			     (((l) & 0x00000000000000ffULL) << 56))  : (l))
     60 
     61 #define FLASH_PORT_OFFSET 5400
     62 #define LISTEN_PORT_OFFSET 5500
     63 #define TUNNEL_PORT_OFFSET 5500
     64 #define SERVER_PORT_OFFSET 5900
     65 
     66 #define DEFAULT_SSH_CMD "/usr/bin/ssh"
     67 #define DEFAULT_TUNNEL_CMD  \
     68   (DEFAULT_SSH_CMD " -f -L %L:localhost:%R %H sleep 20")
     69 #define DEFAULT_VIA_CMD     \
     70   (DEFAULT_SSH_CMD " -f -L %L:%H:%R %G sleep 20")
     71 
     72 #if(defined __cplusplus)
     73 extern "C"
     74 {
     75 #endif
     76 
     77 /** vncrec */
     78 
     79 typedef struct {
     80   FILE* file;
     81   struct timeval tv;
     82   rfbBool readTimestamp;
     83   rfbBool doNotSleep;
     84 } rfbVNCRec;
     85 
     86 /** client data */
     87 
     88 typedef struct rfbClientData {
     89 	void* tag;
     90 	void* data;
     91 	struct rfbClientData* next;
     92 } rfbClientData;
     93 
     94 /** app data (belongs into rfbClient?) */
     95 
     96 typedef struct {
     97   rfbBool shareDesktop;
     98   rfbBool viewOnly;
     99 
    100   const char* encodingsString;
    101 
    102   rfbBool useBGR233;
    103   int nColours;
    104   rfbBool forceOwnCmap;
    105   rfbBool forceTrueColour;
    106   int requestedDepth;
    107 
    108   int compressLevel;
    109   int qualityLevel;
    110   rfbBool enableJPEG;
    111   rfbBool useRemoteCursor;
    112   rfbBool palmVNC;  /**< use palmvnc specific SetScale (vs ultravnc) */
    113   int scaleSetting; /**< 0 means no scale set, else 1/scaleSetting */
    114 } AppData;
    115 
    116 /** For GetCredentialProc callback function to return */
    117 typedef union _rfbCredential
    118 {
    119   /** X509 (VeNCrypt) */
    120   struct
    121   {
    122     char *x509CACertFile;
    123     char *x509CACrlFile;
    124     char *x509ClientCertFile;
    125     char *x509ClientKeyFile;
    126   } x509Credential;
    127   /** Plain (VeNCrypt), MSLogon (UltraVNC) */
    128   struct
    129   {
    130     char *username;
    131     char *password;
    132   } userCredential;
    133 } rfbCredential;
    134 
    135 #define rfbCredentialTypeX509 1
    136 #define rfbCredentialTypeUser 2
    137 
    138 struct _rfbClient;
    139 
    140 /**
    141  * Handles a text chat message. If your application should accept text messages
    142  * from the server, define a function with this prototype and set
    143  * client->HandleTextChat to a pointer to that function subsequent to your
    144  * rfbGetClient() call.
    145  * @param client The client which called the text chat handler
    146  * @param value  text length if text != NULL, or one of rfbTextChatOpen,
    147  * rfbTextChatClose, rfbTextChatFinished if text == NULL
    148  * @param text The text message from the server
    149  */
    150 typedef void (*HandleTextChatProc)(struct _rfbClient* client, int value, char *text);
    151 /**
    152  * Handles XVP server messages. If your application sends XVP messages to the
    153  * server, you'll want to handle the server's XVP_FAIL and XVP_INIT responses.
    154  * Define a function with this prototype and set client->HandleXvpMsg to a
    155  * pointer to that function subsequent to your rfbGetClient() call.
    156  * @param client The client which called the XVP message handler
    157  * @param version The highest XVP extension version that the server supports
    158  * @param opcode The opcode. 0 is XVP_FAIL, 1 is XVP_INIT
    159  */
    160 typedef void (*HandleXvpMsgProc)(struct _rfbClient* client, uint8_t version, uint8_t opcode);
    161 typedef void (*HandleKeyboardLedStateProc)(struct _rfbClient* client, int value, int pad);
    162 typedef rfbBool (*HandleCursorPosProc)(struct _rfbClient* client, int x, int y);
    163 typedef void (*SoftCursorLockAreaProc)(struct _rfbClient* client, int x, int y, int w, int h);
    164 typedef void (*SoftCursorUnlockScreenProc)(struct _rfbClient* client);
    165 typedef void (*GotFrameBufferUpdateProc)(struct _rfbClient* client, int x, int y, int w, int h);
    166 typedef void (*FinishedFrameBufferUpdateProc)(struct _rfbClient* client);
    167 typedef char* (*GetPasswordProc)(struct _rfbClient* client);
    168 typedef rfbCredential* (*GetCredentialProc)(struct _rfbClient* client, int credentialType);
    169 typedef rfbBool (*MallocFrameBufferProc)(struct _rfbClient* client);
    170 typedef void (*GotXCutTextProc)(struct _rfbClient* client, const char *text, int textlen);
    171 typedef void (*BellProc)(struct _rfbClient* client);
    172 
    173 typedef void (*GotCursorShapeProc)(struct _rfbClient* client, int xhot, int yhot, int width, int height, int bytesPerPixel);
    174 typedef void (*GotCopyRectProc)(struct _rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y);
    175 
    176 typedef struct _rfbClient {
    177 	uint8_t* frameBuffer;
    178 	int width, height;
    179 
    180 	int endianTest;
    181 
    182 	AppData appData;
    183 
    184 	const char* programName;
    185 	char* serverHost;
    186 	int serverPort; /**< if -1, then use file recorded by vncrec */
    187 	rfbBool listenSpecified;
    188 	int listenPort, flashPort;
    189 
    190 	struct {
    191 		int x, y, w, h;
    192 	} updateRect;
    193 
    194 	/** Note that the CoRRE encoding uses this buffer and assumes it is big enough
    195 	   to hold 255 * 255 * 32 bits -> 260100 bytes.  640*480 = 307200 bytes.
    196 	   Hextile also assumes it is big enough to hold 16 * 16 * 32 bits.
    197 	   Tight encoding assumes BUFFER_SIZE is at least 16384 bytes. */
    198 
    199 #define RFB_BUFFER_SIZE (640*480)
    200 	char buffer[RFB_BUFFER_SIZE];
    201 
    202 	/* rfbproto.c */
    203 
    204 	int sock;
    205 	rfbBool canUseCoRRE;
    206 	rfbBool canUseHextile;
    207 	char *desktopName;
    208 	rfbPixelFormat format;
    209 	rfbServerInitMsg si;
    210 
    211 	/* sockets.c */
    212 #define RFB_BUF_SIZE 8192
    213 	char buf[RFB_BUF_SIZE];
    214 	char *bufoutptr;
    215 	int buffered;
    216 
    217 	/* The zlib encoding requires expansion/decompression/deflation of the
    218 	   compressed data in the "buffer" above into another, result buffer.
    219 	   However, the size of the result buffer can be determined precisely
    220 	   based on the bitsPerPixel, height and width of the rectangle.  We
    221 	   allocate this buffer one time to be the full size of the buffer. */
    222 
    223 	/* Ultra Encoding uses this buffer too */
    224 
    225 	int ultra_buffer_size;
    226 	char *ultra_buffer;
    227 
    228 	int raw_buffer_size;
    229 	char *raw_buffer;
    230 
    231 #ifdef LIBVNCSERVER_HAVE_LIBZ
    232 	z_stream decompStream;
    233 	rfbBool decompStreamInited;
    234 #endif
    235 
    236 
    237 #ifdef LIBVNCSERVER_HAVE_LIBZ
    238 	/*
    239 	 * Variables for the ``tight'' encoding implementation.
    240 	 */
    241 
    242 	/** Separate buffer for compressed data. */
    243 #define ZLIB_BUFFER_SIZE 30000
    244 	char zlib_buffer[ZLIB_BUFFER_SIZE];
    245 
    246 	/* Four independent compression streams for zlib library. */
    247 	z_stream zlibStream[4];
    248 	rfbBool zlibStreamActive[4];
    249 
    250 	/* Filter stuff. Should be initialized by filter initialization code. */
    251 	rfbBool cutZeros;
    252 	int rectWidth, rectColors;
    253 	char tightPalette[256*4];
    254 	uint8_t tightPrevRow[2048*3*sizeof(uint16_t)];
    255 
    256 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
    257 	/** JPEG decoder state. */
    258 	rfbBool jpegError;
    259 
    260 	struct jpeg_source_mgr* jpegSrcManager;
    261 	void* jpegBufferPtr;
    262 	size_t jpegBufferLen;
    263 
    264 #endif
    265 #endif
    266 
    267 
    268 	/* cursor.c */
    269 	uint8_t *rcSource, *rcMask;
    270 
    271 	/** private data pointer */
    272 	rfbClientData* clientData;
    273 
    274 	rfbVNCRec* vncRec;
    275 
    276 	/* Keyboard State support (is 'Caps Lock' set on the remote display???) */
    277 	int KeyboardLedStateEnabled;
    278 	int CurrentKeyboardLedState;
    279 
    280 	int canHandleNewFBSize;
    281 
    282 	/* hooks */
    283 	HandleTextChatProc         HandleTextChat;
    284 	HandleKeyboardLedStateProc HandleKeyboardLedState;
    285 	HandleCursorPosProc HandleCursorPos;
    286 	SoftCursorLockAreaProc SoftCursorLockArea;
    287 	SoftCursorUnlockScreenProc SoftCursorUnlockScreen;
    288 	GotFrameBufferUpdateProc GotFrameBufferUpdate;
    289 	/** the pointer returned by GetPassword will be freed after use! */
    290 	GetPasswordProc GetPassword;
    291 	MallocFrameBufferProc MallocFrameBuffer;
    292 	GotXCutTextProc GotXCutText;
    293 	BellProc Bell;
    294 
    295 	GotCursorShapeProc GotCursorShape;
    296 	GotCopyRectProc GotCopyRect;
    297 
    298 	/** Which messages are supported by the server
    299 	 * This is a *guess* for most servers.
    300 	 * (If we can even detect the type of server)
    301 	 *
    302 	 * If the server supports the "rfbEncodingSupportedMessages"
    303 	 * then this will be updated when the encoding is received to
    304 	 * accurately reflect the servers capabilities.
    305 	 */
    306 	rfbSupportedMessages supportedMessages;
    307 
    308 	/** negotiated protocol version */
    309 	int major, minor;
    310 
    311 	/** The selected security types */
    312 	uint32_t authScheme, subAuthScheme;
    313 
    314 	/** The TLS session for Anonymous TLS and VeNCrypt */
    315 	void* tlsSession;
    316 
    317 	/** To support security types that requires user input (except VNC password
    318 	 * authentication), for example VeNCrypt and MSLogon, this callback function
    319 	 * must be set before the authentication. Otherwise, it implicates that the
    320 	 * caller application does not support it and related security types should
    321 	 * be bypassed.
    322 	 */
    323 	GetCredentialProc GetCredential;
    324 
    325 	/** The 0-terminated security types supported by the client.
    326 	 * Set by function SetClientAuthSchemes() */
    327 	uint32_t *clientAuthSchemes;
    328 
    329 	/** When the server is a repeater, this specifies the final destination */
    330 	char *destHost;
    331 	int destPort;
    332 
    333         /** the QoS IP DSCP for this client */
    334         int QoS_DSCP;
    335 
    336         /** hook to handle xvp server messages */
    337 	HandleXvpMsgProc           HandleXvpMsg;
    338 
    339 	/* listen.c */
    340         int listenSock;
    341 
    342 	FinishedFrameBufferUpdateProc FinishedFrameBufferUpdate;
    343 
    344 	char *listenAddress;
    345         /* IPv6 listen socket, address and port*/
    346         int listen6Sock;
    347         char* listen6Address;
    348         int listen6Port;
    349 } rfbClient;
    350 
    351 /* cursor.c */
    352 
    353 extern rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc);
    354 
    355 /* listen.c */
    356 
    357 extern void listenForIncomingConnections(rfbClient* viewer);
    358 extern int listenForIncomingConnectionsNoFork(rfbClient* viewer, int usec_timeout);
    359 
    360 /* rfbproto.c */
    361 
    362 extern rfbBool rfbEnableClientLogging;
    363 typedef void (*rfbClientLogProc)(const char *format, ...);
    364 extern rfbClientLogProc rfbClientLog,rfbClientErr;
    365 extern rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int port);
    366 extern rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort);
    367 extern void SetClientAuthSchemes(rfbClient* client,const uint32_t *authSchemes, int size);
    368 extern rfbBool InitialiseRFBConnection(rfbClient* client);
    369 /**
    370  * Sends format and encoding parameters to the server. Your application can
    371  * modify the 'client' data structure directly. However some changes to this
    372  * structure must be communicated back to the server. For instance, if you
    373  * change the encoding to hextile, the server needs to know that it should send
    374  * framebuffer updates in hextile format. Likewise if you change the pixel
    375  * format of the framebuffer, the server must be notified about this as well.
    376  * Call this function to propagate your changes of the local 'client' structure
    377  * over to the server.
    378  * @li Encoding type
    379  * @li RFB protocol extensions announced via pseudo-encodings
    380  * @li Framebuffer pixel format (like RGB vs ARGB)
    381  * @li Remote cursor support
    382  * @param client The client in which the format or encodings have been changed
    383  * @return true if the format or encodings were sent to the server successfully,
    384  * false otherwise
    385  */
    386 extern rfbBool SetFormatAndEncodings(rfbClient* client);
    387 extern rfbBool SendIncrementalFramebufferUpdateRequest(rfbClient* client);
    388 /**
    389  * Sends a framebuffer update request to the server. A VNC client may request an
    390  * update from the server at any time. You can also specify which portions of
    391  * the screen you want updated. This can be handy if a pointer is at certain
    392  * location and the user pressed a mouse button, for instance. Then you can
    393  * immediately request an update of the region around the pointer from the
    394  * server.
    395  * @note The coordinate system is a left-handed Cartesian coordinate system with
    396  * the Z axis (unused) pointing out of the screen. Alternately you can think of
    397  * it as a right-handed Cartesian coordinate system with the Z axis pointing
    398  * into the screen. The origin is at the upper left corner of the framebuffer.
    399  * @param client The client through which to send the request
    400  * @param x The horizontal position of the update request rectangle
    401  * @param y The vertical position of the update request rectangle
    402  * @param w The width of the update request rectangle
    403  * @param h The height of the update request rectangle
    404  * @param incremental false: server sends rectangle even if nothing changed.
    405  * true: server only sends changed parts of rectangle.
    406  * @return true if the update request was sent successfully, false otherwise
    407  */
    408 extern rfbBool SendFramebufferUpdateRequest(rfbClient* client,
    409 					 int x, int y, int w, int h,
    410 					 rfbBool incremental);
    411 extern rfbBool SendScaleSetting(rfbClient* client,int scaleSetting);
    412 /**
    413  * Sends a pointer event to the server. A pointer event includes a cursor
    414  * location and a button mask. The button mask indicates which buttons on the
    415  * pointing device are pressed. Each button is represented by a bit in the
    416  * button mask. A 1 indicates the button is pressed while a 0 indicates that it
    417  * is not pressed. You may use these pre-defined button masks by ORing them
    418  * together: rfbButton1Mask, rfbButton2Mask, rfbButton3Mask, rfbButton4Mask
    419  * rfbButton5Mask
    420  * @note  The cursor location is relative to the client's framebuffer, not the
    421  * client's screen itself.
    422  * @note The coordinate system is a left-handed Cartesian coordinate system with
    423  * the Z axis (unused) pointing out of the screen. Alternately you can think of
    424  * it as a right-handed Cartesian coordinate system with the Z axis pointing
    425  * into the screen. The origin is at the upper left corner of the screen.
    426  * @param client The client through which to send the pointer event
    427  * @param x the horizontal location of the cursor
    428  * @param y the vertical location of the cursor
    429  * @param buttonMask the button mask indicating which buttons are pressed
    430  * @return true if the pointer event was sent successfully, false otherwise
    431  */
    432 extern rfbBool SendPointerEvent(rfbClient* client,int x, int y, int buttonMask);
    433 /**
    434  * Sends a key event to the server. If your application is not merely a VNC
    435  * viewer (i.e. it controls the server), you'll want to send the keys that the
    436  * user presses to the server. Use this function to do that.
    437  * @param client The client through which to send the key event
    438  * @param key An rfbKeySym defined in rfb/keysym.h
    439  * @param down true if this was a key down event, false otherwise
    440  * @return true if the key event was send successfully, false otherwise
    441  */
    442 extern rfbBool SendKeyEvent(rfbClient* client,uint32_t key, rfbBool down);
    443 /**
    444  * Places a string on the server's clipboard. Use this function if you want to
    445  * be able to copy and paste between the server and your application. For
    446  * instance, when your application is notified that the user copied some text
    447  * onto the clipboard, you would call this function to synchronize the server's
    448  * clipboard with your local clipboard.
    449  * @param client The client structure through which to send the client cut text
    450  * message
    451  * @param str The string to send (doesn't need to be NULL terminated)
    452  * @param len The length of the string
    453  * @return true if the client cut message was sent successfully, false otherwise
    454  */
    455 extern rfbBool SendClientCutText(rfbClient* client,char *str, int len);
    456 /**
    457  * Handles messages from the RFB server. You must call this function
    458  * intermittently so LibVNCClient can parse messages from the server. For
    459  * example, if your app has a draw loop, you could place a call to this
    460  * function within that draw loop.
    461  * @note You must call WaitForMessage() before you call this function.
    462  * @param client The client which will handle the RFB server messages
    463  * @return true if the client was able to handle the RFB server messages, false
    464  * otherwise
    465  */
    466 extern rfbBool HandleRFBServerMessage(rfbClient* client);
    467 
    468 /**
    469  * Sends a text chat message to the server.
    470  * @param client The client through which to send the message
    471  * @param text The text to send
    472  * @return true if the text was sent successfully, false otherwise
    473  */
    474 extern rfbBool TextChatSend(rfbClient* client, char *text);
    475 /**
    476  * Opens a text chat window on the server.
    477  * @param client The client through which to send the message
    478  * @return true if the window was opened successfully, false otherwise
    479  */
    480 extern rfbBool TextChatOpen(rfbClient* client);
    481 /**
    482  * Closes the text chat window on the server.
    483  * @param client The client through which to send the message
    484  * @return true if the window was closed successfully, false otherwise
    485  */
    486 extern rfbBool TextChatClose(rfbClient* client);
    487 extern rfbBool TextChatFinish(rfbClient* client);
    488 extern rfbBool PermitServerInput(rfbClient* client, int enabled);
    489 extern rfbBool SendXvpMsg(rfbClient* client, uint8_t version, uint8_t code);
    490 
    491 extern void PrintPixelFormat(rfbPixelFormat *format);
    492 
    493 extern rfbBool SupportsClient2Server(rfbClient* client, int messageType);
    494 extern rfbBool SupportsServer2Client(rfbClient* client, int messageType);
    495 
    496 /* client data */
    497 
    498 /**
    499  * Associates a client data tag with the given pointer. LibVNCClient has
    500  * several events to which you can associate your own handlers. These handlers
    501  * have the client structure as one of their parameters. Sometimes, you may want
    502  * to make data from elsewhere in your application available to these handlers
    503  * without using a global variable. To do this, you call
    504  * rfbClientSetClientData() and associate the data with a tag. Then, your
    505  * handler can call rfbClientGetClientData() and get the a pointer to the data
    506  * associated with that tag.
    507  * @param client The client in which to set the client data
    508  * @param tag A unique tag which identifies the data
    509  * @param data A pointer to the data to associate with the tag
    510  */
    511 void rfbClientSetClientData(rfbClient* client, void* tag, void* data);
    512 /**
    513  * Returns a pointer to the client data associated with the given tag. See the
    514  * the documentation for rfbClientSetClientData() for a discussion of how you
    515  * can use client data.
    516  * @param client The client from which to get the client data
    517  * @param tag The tag which identifies the client data
    518  * @return a pointer to the client data
    519  */
    520 void* rfbClientGetClientData(rfbClient* client, void* tag);
    521 
    522 /* protocol extensions */
    523 
    524 typedef struct _rfbClientProtocolExtension {
    525 	int* encodings;
    526 	/** returns TRUE if the encoding was handled */
    527 	rfbBool (*handleEncoding)(rfbClient* cl,
    528 		rfbFramebufferUpdateRectHeader* rect);
    529 	/** returns TRUE if it handled the message */
    530 	rfbBool (*handleMessage)(rfbClient* cl,
    531 		 rfbServerToClientMsg* message);
    532 	struct _rfbClientProtocolExtension* next;
    533 } rfbClientProtocolExtension;
    534 
    535 void rfbClientRegisterExtension(rfbClientProtocolExtension* e);
    536 
    537 /* sockets.c */
    538 
    539 extern rfbBool errorMessageOnReadFailure;
    540 
    541 extern rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n);
    542 extern rfbBool WriteToRFBServer(rfbClient* client, char *buf, int n);
    543 extern int FindFreeTcpPort(void);
    544 extern int ListenAtTcpPort(int port);
    545 extern int ListenAtTcpPortAndAddress(int port, const char *address);
    546 extern int ConnectClientToTcpAddr(unsigned int host, int port);
    547 extern int ConnectClientToTcpAddr6(const char *hostname, int port);
    548 extern int ConnectClientToUnixSock(const char *sockFile);
    549 extern int AcceptTcpConnection(int listenSock);
    550 extern rfbBool SetNonBlocking(int sock);
    551 extern rfbBool SetDSCP(int sock, int dscp);
    552 
    553 extern rfbBool StringToIPAddr(const char *str, unsigned int *addr);
    554 extern rfbBool SameMachine(int sock);
    555 /**
    556  * Waits for an RFB message to arrive from the server. Before handling a message
    557  * with HandleRFBServerMessage(), you must wait for your client to receive one.
    558  * This function blocks until a message is received. You may specify a timeout
    559  * in microseconds. Once this number of microseconds have elapsed, the function
    560  * will return.
    561  * @param client The client to cause to wait until a message is received
    562  * @param usecs The timeout in microseconds
    563  * @return the return value of the underlying select() call
    564  */
    565 extern int WaitForMessage(rfbClient* client,unsigned int usecs);
    566 
    567 /* vncviewer.c */
    568 /**
    569  * Allocates and returns a pointer to an rfbClient structure. This will probably
    570  * be the first LibVNCClient function your client code calls. Most libVNCClient
    571  * functions operate on an rfbClient structure, and this function allocates
    572  * memory for that structure. When you're done with the rfbClient structure
    573  * pointer this function returns, you should free the memory rfbGetClient()
    574  * allocated by calling rfbClientCleanup().
    575  *
    576  * A pixel is one dot on the screen. The number of bytes in a pixel will depend
    577  * on the number of samples in that pixel and the number of bits in each sample.
    578  * A sample represents one of the primary colors in a color model. The RGB
    579  * color model uses red, green, and blue samples respectively. Suppose you
    580  * wanted to use 16-bit RGB color: You would have three samples per pixel (one
    581  * for each primary color), five bits per sample (the quotient of 16 RGB bits
    582  * divided by three samples), and two bytes per pixel (the smallest multiple of
    583  * eight bits in which the 16-bit pixel will fit). If you wanted 32-bit RGB
    584  * color, you would have three samples per pixel again, eight bits per sample
    585  * (since that's how 32-bit color is defined), and four bytes per pixel (the
    586  * smallest multiple of eight bits in which the 32-bit pixel will fit.
    587  * @param bitsPerSample The number of bits in a sample
    588  * @param samplesPerPixel The number of samples in a pixel
    589  * @param bytesPerPixel The number of bytes in a pixel
    590  * @return a pointer to the allocated rfbClient structure
    591  */
    592 rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,int bytesPerPixel);
    593 /**
    594  * Initializes the client. The format is {PROGRAM_NAME, [OPTIONS]..., HOST}. This
    595  * function does not initialize the program name if the rfbClient's program
    596  * name is set already. The options are as follows:
    597  * <table>
    598  * <tr><th>Option</th><th>Description</th></tr>
    599  * <tr><td>-listen</td><td>Listen for incoming connections.</td></tr>
    600  * <tr><td>-listennofork</td><td>Listen for incoming connections without forking.
    601  * </td></tr>
    602  * <tr><td>-play</td><td>Set this client to replay a previously recorded session.</td></tr>
    603  * <tr><td>-encodings</td><td>Set the encodings to use. The next item in the
    604  * argv array is the encodings string, consisting of comma separated encodings like 'tight,ultra,raw'.</td></tr>
    605  * <tr><td>-compress</td><td>Set the compression level. The next item in the
    606  * argv array is the compression level as an integer. Ranges from 0 (lowest) to 9 (highest).
    607  * </td></tr>
    608  * <tr><td>-scale</td><td>Set the scaling level. The next item in the
    609  * argv array is the scaling level as an integer. The screen will be scaled down by this factor.</td></tr>
    610  * <tr><td>-qosdscp</td><td>Set the Quality of Service Differentiated Services
    611  * Code Point (QoS DSCP). The next item in the argv array is the code point as
    612  * an integer.</td></tr>
    613  * <tr><td>-repeaterdest</td><td>Set a VNC repeater address. The next item in the argv array is
    614  * the repeater's address as a string.</td></tr>
    615  * </table>
    616  *
    617  * The host may include a port number (delimited by a ':').
    618  * @param client The client to initialize
    619  * @param argc The number of arguments to the initializer
    620  * @param argv The arguments to the initializer as an array of NULL terminated
    621  * strings
    622  * @return true if the client was initialized successfully, false otherwise.
    623  */
    624 rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv);
    625 /**
    626  * Cleans up the client structure and releases the memory allocated for it. You
    627  * should call this when you're done with the rfbClient structure that you
    628  * allocated with rfbGetClient().
    629  * @note rfbClientCleanup() does not touch client->frameBuffer.
    630  * @param client The client to clean up
    631  */
    632 void rfbClientCleanup(rfbClient* client);
    633 
    634 #if(defined __cplusplus)
    635 }
    636 #endif
    637 
    638 /**
    639  * @}
    640  */
    641 
    642 /**
    643  @page libvncclient_doc LibVNCClient Documentation
    644  @section example_code Example Code
    645  See SDLvncviewer.c for a rather complete client example.
    646 */
    647 
    648 #endif
    649