blob: 0ecc5e4603f48370661d9ef277ad6fb82c7d525f [file] [log] [blame]
San Mehata430b2b2014-09-23 08:30:51 -07001#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)
73extern "C"
74{
75#endif
76
77/** vncrec */
78
79typedef struct {
80 FILE* file;
81 struct timeval tv;
82 rfbBool readTimestamp;
83 rfbBool doNotSleep;
84} rfbVNCRec;
85
86/** client data */
87
88typedef struct rfbClientData {
89 void* tag;
90 void* data;
91 struct rfbClientData* next;
92} rfbClientData;
93
94/** app data (belongs into rfbClient?) */
95
96typedef 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 */
117typedef 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
138struct _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 */
150typedef 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 */
160typedef void (*HandleXvpMsgProc)(struct _rfbClient* client, uint8_t version, uint8_t opcode);
161typedef void (*HandleKeyboardLedStateProc)(struct _rfbClient* client, int value, int pad);
162typedef rfbBool (*HandleCursorPosProc)(struct _rfbClient* client, int x, int y);
163typedef void (*SoftCursorLockAreaProc)(struct _rfbClient* client, int x, int y, int w, int h);
164typedef void (*SoftCursorUnlockScreenProc)(struct _rfbClient* client);
165typedef void (*GotFrameBufferUpdateProc)(struct _rfbClient* client, int x, int y, int w, int h);
166typedef void (*FinishedFrameBufferUpdateProc)(struct _rfbClient* client);
167typedef char* (*GetPasswordProc)(struct _rfbClient* client);
168typedef rfbCredential* (*GetCredentialProc)(struct _rfbClient* client, int credentialType);
169typedef rfbBool (*MallocFrameBufferProc)(struct _rfbClient* client);
170typedef void (*GotXCutTextProc)(struct _rfbClient* client, const char *text, int textlen);
171typedef void (*BellProc)(struct _rfbClient* client);
172
173typedef void (*GotCursorShapeProc)(struct _rfbClient* client, int xhot, int yhot, int width, int height, int bytesPerPixel);
174typedef void (*GotCopyRectProc)(struct _rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y);
175
176typedef 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
353extern rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc);
354
355/* listen.c */
356
357extern void listenForIncomingConnections(rfbClient* viewer);
358extern int listenForIncomingConnectionsNoFork(rfbClient* viewer, int usec_timeout);
359
360/* rfbproto.c */
361
362extern rfbBool rfbEnableClientLogging;
363typedef void (*rfbClientLogProc)(const char *format, ...);
364extern rfbClientLogProc rfbClientLog,rfbClientErr;
365extern rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int port);
366extern rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort);
367extern void SetClientAuthSchemes(rfbClient* client,const uint32_t *authSchemes, int size);
368extern 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 */
386extern rfbBool SetFormatAndEncodings(rfbClient* client);
387extern 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 */
408extern rfbBool SendFramebufferUpdateRequest(rfbClient* client,
409 int x, int y, int w, int h,
410 rfbBool incremental);
411extern 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 */
432extern 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 */
442extern 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 */
455extern 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 */
466extern 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 */
474extern 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 */
480extern 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 */
486extern rfbBool TextChatClose(rfbClient* client);
487extern rfbBool TextChatFinish(rfbClient* client);
488extern rfbBool PermitServerInput(rfbClient* client, int enabled);
489extern rfbBool SendXvpMsg(rfbClient* client, uint8_t version, uint8_t code);
490
491extern void PrintPixelFormat(rfbPixelFormat *format);
492
493extern rfbBool SupportsClient2Server(rfbClient* client, int messageType);
494extern 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 */
511void 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 */
520void* rfbClientGetClientData(rfbClient* client, void* tag);
521
522/* protocol extensions */
523
524typedef 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
535void rfbClientRegisterExtension(rfbClientProtocolExtension* e);
536
537/* sockets.c */
538
539extern rfbBool errorMessageOnReadFailure;
540
541extern rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n);
542extern rfbBool WriteToRFBServer(rfbClient* client, char *buf, int n);
543extern int FindFreeTcpPort(void);
544extern int ListenAtTcpPort(int port);
545extern int ListenAtTcpPortAndAddress(int port, const char *address);
546extern int ConnectClientToTcpAddr(unsigned int host, int port);
547extern int ConnectClientToTcpAddr6(const char *hostname, int port);
548extern int ConnectClientToUnixSock(const char *sockFile);
549extern int AcceptTcpConnection(int listenSock);
550extern rfbBool SetNonBlocking(int sock);
551extern rfbBool SetDSCP(int sock, int dscp);
552
553extern rfbBool StringToIPAddr(const char *str, unsigned int *addr);
554extern 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 */
565extern 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 */
592rfbClient* 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 */
624rfbBool 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 */
632void 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