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) 77 extern "C" 78 { 79 #endif 80 81 /** vncrec */ 82 83 typedef struct { 84 FILE* file; 85 struct timeval tv; 86 rfbBool readTimestamp; 87 rfbBool doNotSleep; 88 } rfbVNCRec; 89 90 /** client data */ 91 92 typedef struct rfbClientData { 93 void* tag; 94 void* data; 95 struct rfbClientData* next; 96 } rfbClientData; 97 98 /** app data (belongs into rfbClient?) */ 99 100 typedef 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 */ 121 typedef 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 142 struct _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 */ 154 typedef 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 */ 164 typedef void (*HandleXvpMsgProc)(struct _rfbClient* client, uint8_t version, uint8_t opcode); 165 typedef void (*HandleKeyboardLedStateProc)(struct _rfbClient* client, int value, int pad); 166 typedef rfbBool (*HandleCursorPosProc)(struct _rfbClient* client, int x, int y); 167 typedef void (*SoftCursorLockAreaProc)(struct _rfbClient* client, int x, int y, int w, int h); 168 typedef void (*SoftCursorUnlockScreenProc)(struct _rfbClient* client); 169 typedef void (*GotFrameBufferUpdateProc)(struct _rfbClient* client, int x, int y, int w, int h); 170 typedef void (*FinishedFrameBufferUpdateProc)(struct _rfbClient* client); 171 typedef char* (*GetPasswordProc)(struct _rfbClient* client); 172 typedef rfbCredential* (*GetCredentialProc)(struct _rfbClient* client, int credentialType); 173 typedef rfbBool (*MallocFrameBufferProc)(struct _rfbClient* client); 174 typedef void (*GotXCutTextProc)(struct _rfbClient* client, const char *text, int textlen); 175 typedef void (*BellProc)(struct _rfbClient* client); 176 177 typedef void (*GotCursorShapeProc)(struct _rfbClient* client, int xhot, int yhot, int width, int height, int bytesPerPixel); 178 typedef void (*GotCopyRectProc)(struct _rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y); 179 180 typedef 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 361 extern rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc); 362 363 /* listen.c */ 364 365 extern void listenForIncomingConnections(rfbClient* viewer); 366 extern int listenForIncomingConnectionsNoFork(rfbClient* viewer, int usec_timeout); 367 368 /* rfbproto.c */ 369 370 extern rfbBool rfbEnableClientLogging; 371 typedef void (*rfbClientLogProc)(const char *format, ...); 372 extern rfbClientLogProc rfbClientLog,rfbClientErr; 373 extern rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int port); 374 extern rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort); 375 extern void SetClientAuthSchemes(rfbClient* client,const uint32_t *authSchemes, int size); 376 extern 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 */ 394 extern rfbBool SetFormatAndEncodings(rfbClient* client); 395 extern 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 */ 416 extern rfbBool SendFramebufferUpdateRequest(rfbClient* client, 417 int x, int y, int w, int h, 418 rfbBool incremental); 419 extern 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 */ 440 extern 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 */ 450 extern 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 */ 463 extern 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 */ 474 extern 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 */ 482 extern 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 */ 488 extern 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 */ 494 extern rfbBool TextChatClose(rfbClient* client); 495 extern rfbBool TextChatFinish(rfbClient* client); 496 extern rfbBool PermitServerInput(rfbClient* client, int enabled); 497 extern rfbBool SendXvpMsg(rfbClient* client, uint8_t version, uint8_t code); 498 499 extern void PrintPixelFormat(rfbPixelFormat *format); 500 501 extern rfbBool SupportsClient2Server(rfbClient* client, int messageType); 502 extern 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 */ 519 void 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 */ 528 void* rfbClientGetClientData(rfbClient* client, void* tag); 529 530 /* protocol extensions */ 531 532 typedef 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 543 void rfbClientRegisterExtension(rfbClientProtocolExtension* e); 544 545 /* sockets.c */ 546 547 extern rfbBool errorMessageOnReadFailure; 548 549 extern rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n); 550 extern rfbBool WriteToRFBServer(rfbClient* client, char *buf, int n); 551 extern int FindFreeTcpPort(void); 552 extern int ListenAtTcpPort(int port); 553 extern int ListenAtTcpPortAndAddress(int port, const char *address); 554 extern int ConnectClientToTcpAddr(unsigned int host, int port); 555 extern int ConnectClientToTcpAddr6(const char *hostname, int port); 556 extern int ConnectClientToUnixSock(const char *sockFile); 557 extern int AcceptTcpConnection(int listenSock); 558 extern rfbBool SetNonBlocking(int sock); 559 extern rfbBool SetDSCP(int sock, int dscp); 560 561 extern rfbBool StringToIPAddr(const char *str, unsigned int *addr); 562 extern 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 */ 573 extern 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 */ 600 rfbClient* 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 */ 632 rfbBool 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 */ 640 void 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