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