00001 #ifndef RFB_H
00002 #define RFB_H
00003
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #if(defined __cplusplus)
00037 extern "C"
00038 {
00039 #endif
00040
00041 #include <stdio.h>
00042 #include <stdlib.h>
00043 #include <string.h>
00044 #include <rfb/rfbproto.h>
00045
00046 #if defined(ANDROID) || defined(LIBVNCSERVER_HAVE_ANDROID)
00047 #include <arpa/inet.h>
00048 #include <sys/select.h>
00049 #endif
00050
00051 #ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H
00052 #include <sys/types.h>
00053 #endif
00054
00055 #ifdef __MINGW32__
00056 #undef SOCKET
00057 #include <winsock2.h>
00058 #ifdef LIBVNCSERVER_HAVE_WS2TCPIP_H
00059 #undef socklen_t
00060 #include <ws2tcpip.h>
00061 #endif
00062 #endif
00063
00064 #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
00065 #include <pthread.h>
00066 #if 0
00067 #define LOCK(mutex) (rfbLog("%s:%d LOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_lock(&(mutex)))
00068 #define UNLOCK(mutex) (rfbLog("%s:%d UNLOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_unlock(&(mutex)))
00069 #define MUTEX(mutex) pthread_mutex_t (mutex)
00070 #define INIT_MUTEX(mutex) (rfbLog("%s:%d INIT_MUTEX(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_init(&(mutex),NULL))
00071 #define TINI_MUTEX(mutex) (rfbLog("%s:%d TINI_MUTEX(%s)\n",__FILE__,__LINE__,#mutex), pthread_mutex_destroy(&(mutex)))
00072 #define TSIGNAL(cond) (rfbLog("%s:%d TSIGNAL(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_signal(&(cond)))
00073 #define WAIT(cond,mutex) (rfbLog("%s:%d WAIT(%s,%s)\n",__FILE__,__LINE__,#cond,#mutex), pthread_cond_wait(&(cond),&(mutex)))
00074 #define COND(cond) pthread_cond_t (cond)
00075 #define INIT_COND(cond) (rfbLog("%s:%d INIT_COND(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_init(&(cond),NULL))
00076 #define TINI_COND(cond) (rfbLog("%s:%d TINI_COND(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_destroy(&(cond)))
00077 #define IF_PTHREADS(x) x
00078 #else
00079 #if !NONETWORK
00080 #define LOCK(mutex) pthread_mutex_lock(&(mutex));
00081 #define UNLOCK(mutex) pthread_mutex_unlock(&(mutex));
00082 #endif
00083 #define MUTEX(mutex) pthread_mutex_t (mutex)
00084 #define INIT_MUTEX(mutex) pthread_mutex_init(&(mutex),NULL)
00085 #define TINI_MUTEX(mutex) pthread_mutex_destroy(&(mutex))
00086 #define TSIGNAL(cond) pthread_cond_signal(&(cond))
00087 #define WAIT(cond,mutex) pthread_cond_wait(&(cond),&(mutex))
00088 #define COND(cond) pthread_cond_t (cond)
00089 #define INIT_COND(cond) pthread_cond_init(&(cond),NULL)
00090 #define TINI_COND(cond) pthread_cond_destroy(&(cond))
00091 #define IF_PTHREADS(x) x
00092 #endif
00093 #else
00094 #define LOCK(mutex)
00095 #define UNLOCK(mutex)
00096 #define MUTEX(mutex)
00097 #define INIT_MUTEX(mutex)
00098 #define TINI_MUTEX(mutex)
00099 #define TSIGNAL(cond)
00100 #define WAIT(cond,mutex) this_is_unsupported
00101 #define COND(cond)
00102 #define INIT_COND(cond)
00103 #define TINI_COND(cond)
00104 #define IF_PTHREADS(x)
00105 #endif
00106
00107
00108
00109
00110
00111
00112
00113 #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
00114 #ifdef LIBVNCSERVER_HAVE_LIBZ
00115 #define rfbInitServer rfbInitServerWithPthreadsAndZRLE
00116 #else
00117 #define rfbInitServer rfbInitServerWithPthreadsButWithoutZRLE
00118 #endif
00119 #else
00120 #ifdef LIBVNCSERVER_HAVE_LIBZ
00121 #define rfbInitServer rfbInitServerWithoutPthreadsButWithZRLE
00122 #else
00123 #define rfbInitServer rfbInitServerWithoutPthreadsAndZRLE
00124 #endif
00125 #endif
00126
00127 struct _rfbClientRec;
00128 struct _rfbScreenInfo;
00129 struct rfbCursor;
00130
00131 enum rfbNewClientAction {
00132 RFB_CLIENT_ACCEPT,
00133 RFB_CLIENT_ON_HOLD,
00134 RFB_CLIENT_REFUSE
00135 };
00136
00137 enum rfbSocketState {
00138 RFB_SOCKET_INIT,
00139 RFB_SOCKET_READY,
00140 RFB_SOCKET_SHUTDOWN
00141 };
00142
00143 typedef void (*rfbKbdAddEventProcPtr) (rfbBool down, rfbKeySym keySym, struct _rfbClientRec* cl);
00144 typedef void (*rfbKbdReleaseAllKeysProcPtr) (struct _rfbClientRec* cl);
00145 typedef void (*rfbPtrAddEventProcPtr) (int buttonMask, int x, int y, struct _rfbClientRec* cl);
00146 typedef void (*rfbSetXCutTextProcPtr) (char* str,int len, struct _rfbClientRec* cl);
00147 typedef struct rfbCursor* (*rfbGetCursorProcPtr) (struct _rfbClientRec* pScreen);
00148 typedef rfbBool (*rfbSetTranslateFunctionProcPtr)(struct _rfbClientRec* cl);
00149 typedef rfbBool (*rfbPasswordCheckProcPtr)(struct _rfbClientRec* cl,const char* encryptedPassWord,int len);
00150 typedef enum rfbNewClientAction (*rfbNewClientHookPtr)(struct _rfbClientRec* cl);
00151 typedef void (*rfbDisplayHookPtr)(struct _rfbClientRec* cl);
00152 typedef void (*rfbDisplayFinishedHookPtr)(struct _rfbClientRec* cl, int result);
00154 typedef int (*rfbGetKeyboardLedStateHookPtr)(struct _rfbScreenInfo* screen);
00155 typedef rfbBool (*rfbXvpHookPtr)(struct _rfbClientRec* cl, uint8_t, uint8_t);
00161 typedef void (*rfbSetSingleWindowProcPtr) (struct _rfbClientRec* cl, int x, int y);
00166 typedef void (*rfbSetServerInputProcPtr) (struct _rfbClientRec* cl, int status);
00171 typedef int (*rfbFileTransferPermitted) (struct _rfbClientRec* cl);
00173 typedef void (*rfbSetTextChat) (struct _rfbClientRec* cl, int length, char *string);
00174
00175 typedef struct {
00176 uint32_t count;
00177 rfbBool is16;
00178 union {
00179 uint8_t* bytes;
00180 uint16_t* shorts;
00181 } data;
00182 } rfbColourMap;
00183
00188 typedef struct _rfbSecurity {
00189 uint8_t type;
00190 void (*handler)(struct _rfbClientRec* cl);
00191 struct _rfbSecurity* next;
00192 } rfbSecurityHandler;
00193
00198 typedef struct _rfbProtocolExtension {
00201 rfbBool (*newClient)(struct _rfbClientRec* client, void** data);
00204 rfbBool (*init)(struct _rfbClientRec* client, void* data);
00207 int *pseudoEncodings;
00210 rfbBool (*enablePseudoEncoding)(struct _rfbClientRec* client,
00211 void** data, int encodingNumber);
00213 rfbBool (*handleMessage)(struct _rfbClientRec* client,
00214 void* data,
00215 const rfbClientToServerMsg* message);
00216 void (*close)(struct _rfbClientRec* client, void* data);
00217 void (*usage)(void);
00219 int (*processArgument)(int argc, char *argv[]);
00220 struct _rfbProtocolExtension* next;
00221 } rfbProtocolExtension;
00222
00223 typedef struct _rfbExtensionData {
00224 rfbProtocolExtension* extension;
00225 void* data;
00226 struct _rfbExtensionData* next;
00227 } rfbExtensionData;
00228
00235 typedef struct _rfbScreenInfo
00236 {
00238 struct _rfbScreenInfo *scaledScreenNext;
00239 int scaledScreenRefCount;
00240
00241 int width;
00242 int paddedWidthInBytes;
00243 int height;
00244 int depth;
00245 int bitsPerPixel;
00246 int sizeInBytes;
00247
00248 rfbPixel blackPixel;
00249 rfbPixel whitePixel;
00250
00256 void* screenData;
00257
00258
00259
00260 rfbPixelFormat serverFormat;
00261 rfbColourMap colourMap;
00262 const char* desktopName;
00263 char thisHost[255];
00264
00265 rfbBool autoPort;
00266 int port;
00267 SOCKET listenSock;
00268 int maxSock;
00269 int maxFd;
00270 #ifdef __MINGW32__
00271 struct fd_set allFds;
00272 #else
00273 fd_set allFds;
00274 #endif
00275
00276 enum rfbSocketState socketState;
00277 SOCKET inetdSock;
00278 rfbBool inetdInitDone;
00279
00280 int udpPort;
00281 SOCKET udpSock;
00282 struct _rfbClientRec* udpClient;
00283 rfbBool udpSockConnected;
00284 struct sockaddr_in udpRemoteAddr;
00285
00286 int maxClientWait;
00287
00288
00289 rfbBool httpInitDone;
00290 rfbBool httpEnableProxyConnect;
00291 int httpPort;
00292 char* httpDir;
00293 SOCKET httpListenSock;
00294 SOCKET httpSock;
00295
00296 rfbPasswordCheckProcPtr passwordCheck;
00297 void* authPasswdData;
00300 int authPasswdFirstViewOnly;
00301
00303 int maxRectsPerUpdate;
00306 int deferUpdateTime;
00307 #ifdef TODELETE
00308 char* screen;
00309 #endif
00310 rfbBool alwaysShared;
00311 rfbBool neverShared;
00312 rfbBool dontDisconnect;
00313 struct _rfbClientRec* clientHead;
00314 struct _rfbClientRec* pointerClient;
00317
00318 int cursorX, cursorY,underCursorBufferLen;
00319 char* underCursorBuffer;
00320 rfbBool dontConvertRichCursorToXCursor;
00321 struct rfbCursor* cursor;
00322
00327 char* frameBuffer;
00328 rfbKbdAddEventProcPtr kbdAddEvent;
00329 rfbKbdReleaseAllKeysProcPtr kbdReleaseAllKeys;
00330 rfbPtrAddEventProcPtr ptrAddEvent;
00331 rfbSetXCutTextProcPtr setXCutText;
00332 rfbGetCursorProcPtr getCursorPtr;
00333 rfbSetTranslateFunctionProcPtr setTranslateFunction;
00334 rfbSetSingleWindowProcPtr setSingleWindow;
00335 rfbSetServerInputProcPtr setServerInput;
00336 rfbFileTransferPermitted getFileTransferPermission;
00337 rfbSetTextChat setTextChat;
00338
00340 rfbNewClientHookPtr newClientHook;
00342 rfbDisplayHookPtr displayHook;
00343
00345 rfbGetKeyboardLedStateHookPtr getKeyboardLedStateHook;
00346
00347 #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
00348 MUTEX(cursorMutex);
00349 rfbBool backgroundLoop;
00350 #endif
00351
00353 rfbBool ignoreSIGPIPE;
00354
00358 int progressiveSliceHeight;
00359
00360 in_addr_t listenInterface;
00361 int deferPtrUpdateTime;
00362
00364 rfbBool handleEventsEagerly;
00365
00367 char *versionString;
00368
00370 int protocolMajorVersion;
00371 int protocolMinorVersion;
00372
00374 rfbBool permitFileTransfer;
00375
00377 rfbDisplayFinishedHookPtr displayFinishedHook;
00379 rfbXvpHookPtr xvpHook;
00380 #ifdef LIBVNCSERVER_WITH_WEBSOCKETS
00381 char *sslkeyfile;
00382 char *sslcertfile;
00383 #endif
00384 int ipv6port;
00385 char* listen6Interface;
00386
00387
00388
00389 SOCKET listen6Sock;
00390 int http6Port;
00391 SOCKET httpListen6Sock;
00392 } rfbScreenInfo, *rfbScreenInfoPtr;
00393
00394
00399 typedef void (*rfbTranslateFnType)(char *table, rfbPixelFormat *in,
00400 rfbPixelFormat *out,
00401 char *iptr, char *optr,
00402 int bytesBetweenInputLines,
00403 int width, int height);
00404
00405
00406
00407
00408 struct sraRegion;
00409 typedef struct sraRegion* sraRegionPtr;
00410
00411
00412
00413
00414
00415 typedef void (*ClientGoneHookPtr)(struct _rfbClientRec* cl);
00416
00417 typedef struct _rfbFileTransferData {
00418 int fd;
00419 int compressionEnabled;
00420 int fileSize;
00421 int numPackets;
00422 int receiving;
00423 int sending;
00424 } rfbFileTransferData;
00425
00426
00427 typedef struct _rfbStatList {
00428 uint32_t type;
00429 uint32_t sentCount;
00430 uint32_t bytesSent;
00431 uint32_t bytesSentIfRaw;
00432 uint32_t rcvdCount;
00433 uint32_t bytesRcvd;
00434 uint32_t bytesRcvdIfRaw;
00435 struct _rfbStatList *Next;
00436 } rfbStatList;
00437
00438 typedef struct _rfbSslCtx rfbSslCtx;
00439 typedef struct _wsCtx wsCtx;
00440
00441 typedef struct _rfbClientRec {
00442
00444 rfbScreenInfoPtr screen;
00445
00447 rfbScreenInfoPtr scaledScreen;
00449 rfbBool PalmVNC;
00450
00451
00458 void* clientData;
00459 ClientGoneHookPtr clientGoneHook;
00460
00461 SOCKET sock;
00462 char *host;
00463
00464
00465 int protocolMajorVersion;
00466 int protocolMinorVersion;
00467
00468 #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
00469 pthread_t client_thread;
00470 #endif
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00498 enum {
00499 RFB_PROTOCOL_VERSION,
00500 RFB_SECURITY_TYPE,
00501 RFB_AUTHENTICATION,
00502 RFB_INITIALISATION,
00503 RFB_NORMAL,
00505
00506
00507
00508 RFB_INITIALISATION_SHARED
00509 } state;
00510
00511 rfbBool reverseConnection;
00512 rfbBool onHold;
00513 rfbBool readyForSetColourMapEntries;
00514 rfbBool useCopyRect;
00515 int preferredEncoding;
00516 int correMaxWidth, correMaxHeight;
00517
00518 rfbBool viewOnly;
00519
00520
00521 uint8_t authChallenge[CHALLENGESIZE];
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546 sraRegionPtr copyRegion;
00547 int copyDX, copyDY;
00549 sraRegionPtr modifiedRegion;
00550
00556 sraRegionPtr requestedRegion;
00557
00564 struct timeval startDeferring;
00565 struct timeval startPtrDeferring;
00566 int lastPtrX;
00567 int lastPtrY;
00568 int lastPtrButtons;
00569
00573 rfbTranslateFnType translateFn;
00574 char *translateLookupTable;
00575 rfbPixelFormat format;
00576
00583 #define UPDATE_BUF_SIZE 30000
00584
00585 char updateBuf[UPDATE_BUF_SIZE];
00586 int ublen;
00587
00588
00589 struct _rfbStatList *statEncList;
00590 struct _rfbStatList *statMsgList;
00591 int rawBytesEquivalent;
00592 int bytesSent;
00593
00594 #ifdef LIBVNCSERVER_HAVE_LIBZ
00595
00596
00597 struct z_stream_s compStream;
00598 rfbBool compStreamInited;
00599 uint32_t zlibCompressLevel;
00600 #endif
00601 #if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
00602
00603 int tightQualityLevel;
00604
00605 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
00606
00607 z_stream zsStruct[4];
00608 rfbBool zsActive[4];
00609 int zsLevel[4];
00610 int tightCompressLevel;
00611 #endif
00612 #endif
00613
00614
00615 rfbBool compStreamInitedLZO;
00616 char *lzoWrkMem;
00617
00618 rfbFileTransferData fileTransfer;
00619
00620 int lastKeyboardLedState;
00621 rfbBool enableSupportedMessages;
00622 rfbBool enableSupportedEncodings;
00623 rfbBool enableServerIdentity;
00624 rfbBool enableKeyboardLedState;
00625 rfbBool enableLastRectEncoding;
00626 rfbBool enableCursorShapeUpdates;
00627 rfbBool enableCursorPosUpdates;
00628 rfbBool useRichCursorEncoding;
00629 rfbBool cursorWasChanged;
00630 rfbBool cursorWasMoved;
00631 int cursorX,cursorY;
00634 rfbBool useNewFBSize;
00635 rfbBool newFBSizePending;
00637 struct _rfbClientRec *prev;
00638 struct _rfbClientRec *next;
00639
00640 #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
00641
00646 int refCount;
00647 MUTEX(refCountMutex);
00648 COND(deleteCond);
00649
00650 MUTEX(outputMutex);
00651 MUTEX(updateMutex);
00652 COND(updateCond);
00653 #endif
00654
00655 #ifdef LIBVNCSERVER_HAVE_LIBZ
00656 void* zrleData;
00657 int zywrleLevel;
00658 int zywrleBuf[rfbZRLETileWidth * rfbZRLETileHeight];
00659 #endif
00660
00663 int progressiveSliceY;
00664
00665 rfbExtensionData* extensions;
00666
00668 char *zrleBeforeBuf;
00669 void *paletteHelper;
00670
00672 #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
00673 #define LIBVNCSERVER_SEND_MUTEX
00674 MUTEX(sendMutex);
00675 #endif
00676
00677
00678
00679 char *beforeEncBuf;
00680 int beforeEncBufSize;
00681 char *afterEncBuf;
00682 int afterEncBufSize;
00683 int afterEncBufLen;
00684 #if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
00685 uint32_t tightEncoding;
00686 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
00687
00688 int turboSubsampLevel;
00689 int turboQualityLevel;
00690 #endif
00691 #endif
00692
00693 #ifdef LIBVNCSERVER_WITH_WEBSOCKETS
00694 rfbSslCtx *sslctx;
00695 wsCtx *wsctx;
00696 char *wspath;
00697 #endif
00698 } rfbClientRec, *rfbClientPtr;
00699
00705 #define FB_UPDATE_PENDING(cl) \
00706 (((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) || \
00707 (((cl)->enableCursorShapeUpdates == FALSE && \
00708 ((cl)->cursorX != (cl)->screen->cursorX || \
00709 (cl)->cursorY != (cl)->screen->cursorY))) || \
00710 ((cl)->useNewFBSize && (cl)->newFBSizePending) || \
00711 ((cl)->enableCursorPosUpdates && (cl)->cursorWasMoved) || \
00712 !sraRgnEmpty((cl)->copyRegion) || !sraRgnEmpty((cl)->modifiedRegion))
00713
00714
00715
00716
00717
00718 #define Swap16(s) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))
00719
00720 #define Swap24(l) ((((l) & 0xff) << 16) | (((l) >> 16) & 0xff) | \
00721 (((l) & 0x00ff00)))
00722
00723 #define Swap32(l) (((l) >> 24) | \
00724 (((l) & 0x00ff0000) >> 8) | \
00725 (((l) & 0x0000ff00) << 8) | \
00726 ((l) << 24))
00727
00728
00729 extern char rfbEndianTest;
00730
00731 #define Swap16IfLE(s) (rfbEndianTest ? Swap16(s) : (s))
00732 #define Swap24IfLE(l) (rfbEndianTest ? Swap24(l) : (l))
00733 #define Swap32IfLE(l) (rfbEndianTest ? Swap32(l) : (l))
00734
00735
00736 #define Swap16IfBE(s) (rfbEndianTest ? (s) : Swap16(s))
00737 #define Swap24IfBE(l) (rfbEndianTest ? (l) : Swap24(l))
00738 #define Swap32IfBE(l) (rfbEndianTest ? (l) : Swap32(l))
00739
00740
00741
00742 extern int rfbMaxClientWait;
00743
00744 extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen);
00745 extern void rfbShutdownSockets(rfbScreenInfoPtr rfbScreen);
00746 extern void rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen);
00747 extern void rfbCloseClient(rfbClientPtr cl);
00748 extern int rfbReadExact(rfbClientPtr cl, char *buf, int len);
00749 extern int rfbReadExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
00750 extern int rfbPeekExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
00751 extern int rfbWriteExact(rfbClientPtr cl, const char *buf, int len);
00752 extern int rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec);
00753 extern int rfbConnect(rfbScreenInfoPtr rfbScreen, char* host, int port);
00754 extern int rfbConnectToTcpAddr(char* host, int port);
00755 extern int rfbListenOnTCPPort(int port, in_addr_t iface);
00756 extern int rfbListenOnTCP6Port(int port, const char* iface);
00757 extern int rfbListenOnUDPPort(int port, in_addr_t iface);
00758 extern int rfbStringToAddr(char* string,in_addr_t* addr);
00759 extern rfbBool rfbSetNonBlocking(int sock);
00760
00761 #ifdef LIBVNCSERVER_WITH_WEBSOCKETS
00762
00763
00764 extern rfbBool webSocketsCheck(rfbClientPtr cl);
00765 extern rfbBool webSocketCheckDisconnect(rfbClientPtr cl);
00766 extern int webSocketsEncode(rfbClientPtr cl, const char *src, int len, char **dst);
00767 extern int webSocketsDecode(rfbClientPtr cl, char *dst, int len);
00768 #endif
00769
00770
00771
00772
00773
00774 typedef struct rfbClientIterator *rfbClientIteratorPtr;
00775
00776 extern void rfbClientListInit(rfbScreenInfoPtr rfbScreen);
00777 extern rfbClientIteratorPtr rfbGetClientIterator(rfbScreenInfoPtr rfbScreen);
00778 extern rfbClientPtr rfbClientIteratorNext(rfbClientIteratorPtr iterator);
00779 extern void rfbReleaseClientIterator(rfbClientIteratorPtr iterator);
00780 extern void rfbIncrClientRef(rfbClientPtr cl);
00781 extern void rfbDecrClientRef(rfbClientPtr cl);
00782
00783 extern void rfbNewClientConnection(rfbScreenInfoPtr rfbScreen,int sock);
00784 extern rfbClientPtr rfbNewClient(rfbScreenInfoPtr rfbScreen,int sock);
00785 extern rfbClientPtr rfbNewUDPClient(rfbScreenInfoPtr rfbScreen);
00786 extern rfbClientPtr rfbReverseConnection(rfbScreenInfoPtr rfbScreen,char *host, int port);
00787 extern void rfbClientConnectionGone(rfbClientPtr cl);
00788 extern void rfbProcessClientMessage(rfbClientPtr cl);
00789 extern void rfbClientConnFailed(rfbClientPtr cl, const char *reason);
00790 extern void rfbNewUDPConnection(rfbScreenInfoPtr rfbScreen,int sock);
00791 extern void rfbProcessUDPInput(rfbScreenInfoPtr rfbScreen);
00792 extern rfbBool rfbSendFramebufferUpdate(rfbClientPtr cl, sraRegionPtr updateRegion);
00793 extern rfbBool rfbSendRectEncodingRaw(rfbClientPtr cl, int x,int y,int w,int h);
00794 extern rfbBool rfbSendUpdateBuf(rfbClientPtr cl);
00795 extern void rfbSendServerCutText(rfbScreenInfoPtr rfbScreen,char *str, int len);
00796 extern rfbBool rfbSendCopyRegion(rfbClientPtr cl,sraRegionPtr reg,int dx,int dy);
00797 extern rfbBool rfbSendLastRectMarker(rfbClientPtr cl);
00798 extern rfbBool rfbSendNewFBSize(rfbClientPtr cl, int w, int h);
00799 extern rfbBool rfbSendSetColourMapEntries(rfbClientPtr cl, int firstColour, int nColours);
00800 extern void rfbSendBell(rfbScreenInfoPtr rfbScreen);
00801
00802 extern char *rfbProcessFileTransferReadBuffer(rfbClientPtr cl, uint32_t length);
00803 extern rfbBool rfbSendFileTransferChunk(rfbClientPtr cl);
00804 extern rfbBool rfbSendDirContent(rfbClientPtr cl, int length, char *buffer);
00805 extern rfbBool rfbSendFileTransferMessage(rfbClientPtr cl, uint8_t contentType, uint8_t contentParam, uint32_t size, uint32_t length, const char *buffer);
00806 extern char *rfbProcessFileTransferReadBuffer(rfbClientPtr cl, uint32_t length);
00807 extern rfbBool rfbProcessFileTransfer(rfbClientPtr cl, uint8_t contentType, uint8_t contentParam, uint32_t size, uint32_t length);
00808
00809 void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len);
00810
00811
00812
00813 extern rfbBool rfbEconomicTranslate;
00814
00815 extern void rfbTranslateNone(char *table, rfbPixelFormat *in,
00816 rfbPixelFormat *out,
00817 char *iptr, char *optr,
00818 int bytesBetweenInputLines,
00819 int width, int height);
00820 extern rfbBool rfbSetTranslateFunction(rfbClientPtr cl);
00821 extern rfbBool rfbSetClientColourMap(rfbClientPtr cl, int firstColour, int nColours);
00822 extern void rfbSetClientColourMaps(rfbScreenInfoPtr rfbScreen, int firstColour, int nColours);
00823
00824
00825
00826 extern void rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen);
00827 extern void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen);
00828 extern void rfbHttpCheckFds(rfbScreenInfoPtr rfbScreen);
00829
00830
00831
00832
00833
00834 extern void rfbAuthNewClient(rfbClientPtr cl);
00835 extern void rfbProcessClientSecurityType(rfbClientPtr cl);
00836 extern void rfbAuthProcessClientMessage(rfbClientPtr cl);
00837 extern void rfbRegisterSecurityHandler(rfbSecurityHandler* handler);
00838 extern void rfbUnregisterSecurityHandler(rfbSecurityHandler* handler);
00839
00840
00841
00842 extern rfbBool rfbSendRectEncodingRRE(rfbClientPtr cl, int x,int y,int w,int h);
00843
00844
00845
00846
00847 extern rfbBool rfbSendRectEncodingCoRRE(rfbClientPtr cl, int x,int y,int w,int h);
00848
00849
00850
00851
00852 extern rfbBool rfbSendRectEncodingHextile(rfbClientPtr cl, int x, int y, int w,
00853 int h);
00854
00855
00856
00857
00858
00859
00860 #define ULTRA_MAX_RECT_SIZE (128*256)
00861 #define ULTRA_MAX_SIZE(min) ((( min * 2 ) > ULTRA_MAX_RECT_SIZE ) ? \
00862 ( min * 2 ) : ULTRA_MAX_RECT_SIZE )
00863
00864 extern rfbBool rfbSendRectEncodingUltra(rfbClientPtr cl, int x,int y,int w,int h);
00865
00866
00867 #ifdef LIBVNCSERVER_HAVE_LIBZ
00868
00869
00873 #define VNC_ENCODE_ZLIB_MIN_COMP_SIZE (17)
00874
00875
00876
00877
00878 #define ZLIB_MAX_RECT_SIZE (128*256)
00879 #define ZLIB_MAX_SIZE(min) ((( min * 2 ) > ZLIB_MAX_RECT_SIZE ) ? \
00880 ( min * 2 ) : ZLIB_MAX_RECT_SIZE )
00881
00882 extern rfbBool rfbSendRectEncodingZlib(rfbClientPtr cl, int x, int y, int w,
00883 int h);
00884
00885 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
00886
00887
00888 #define TIGHT_DEFAULT_COMPRESSION 6
00889 #define TURBO_DEFAULT_SUBSAMP 0
00890
00891 extern rfbBool rfbTightDisableGradient;
00892
00893 extern int rfbNumCodedRectsTight(rfbClientPtr cl, int x,int y,int w,int h);
00894
00895 extern rfbBool rfbSendRectEncodingTight(rfbClientPtr cl, int x,int y,int w,int h);
00896
00897 #if defined(LIBVNCSERVER_HAVE_LIBPNG)
00898 extern rfbBool rfbSendRectEncodingTightPng(rfbClientPtr cl, int x,int y,int w,int h);
00899 #endif
00900
00901 #endif
00902 #endif
00903
00904
00905
00906
00907 typedef struct rfbCursor {
00909 rfbBool cleanup, cleanupSource, cleanupMask, cleanupRichSource;
00910 unsigned char *source;
00911 unsigned char *mask;
00912 unsigned short width, height, xhot, yhot;
00913 unsigned short foreRed, foreGreen, foreBlue;
00914 unsigned short backRed, backGreen, backBlue;
00915 unsigned char *richSource;
00916 unsigned char *alphaSource;
00917 rfbBool alphaPreMultiplied;
00918 } rfbCursor, *rfbCursorPtr;
00919 extern unsigned char rfbReverseByte[0x100];
00920
00921 extern rfbBool rfbSendCursorShape(rfbClientPtr cl);
00922 extern rfbBool rfbSendCursorPos(rfbClientPtr cl);
00923 extern void rfbConvertLSBCursorBitmapOrMask(int width,int height,unsigned char* bitmap);
00924 extern rfbCursorPtr rfbMakeXCursor(int width,int height,char* cursorString,char* maskString);
00925 extern char* rfbMakeMaskForXCursor(int width,int height,char* cursorString);
00926 extern char* rfbMakeMaskFromAlphaSource(int width,int height,unsigned char* alphaSource);
00927 extern void rfbMakeXCursorFromRichCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor);
00928 extern void rfbMakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor);
00929 extern void rfbFreeCursor(rfbCursorPtr cursor);
00930 extern void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c);
00931
00933 extern void rfbDefaultPtrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl);
00934
00935
00936 #ifdef LIBVNCSERVER_HAVE_LIBZ
00937 extern rfbBool rfbSendRectEncodingZRLE(rfbClientPtr cl, int x, int y, int w,int h);
00938 #endif
00939
00940
00941
00942 extern void rfbResetStats(rfbClientPtr cl);
00943 extern void rfbPrintStats(rfbClientPtr cl);
00944
00945
00946
00947 typedef struct rfbFontData {
00948 unsigned char* data;
00954 int* metaData;
00955 } rfbFontData,* rfbFontDataPtr;
00956
00957 int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,rfbPixel colour);
00958 void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,rfbPixel colour);
00960 int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,int x1,int y1,int x2,int y2,rfbPixel colour,rfbPixel backColour);
00961 void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,int x1,int y1,int x2,int y2,rfbPixel colour,rfbPixel backColour);
00962 int rfbWidthOfString(rfbFontDataPtr font,const char* string);
00963 int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c);
00964 void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2);
00966 void rfbWholeFontBBox(rfbFontDataPtr font,int *x1, int *y1, int *x2, int *y2);
00967
00969 rfbFontDataPtr rfbLoadConsoleFont(char *filename);
00971 void rfbFreeFont(rfbFontDataPtr font);
00972
00973
00974
00975 void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col);
00976 void rfbDrawPixel(rfbScreenInfoPtr s,int x,int y,rfbPixel col);
00977 void rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col);
00978
00979
00980
00985 typedef void (*SelectionChangedHookPtr)(int _index);
00986 extern int rfbSelectBox(rfbScreenInfoPtr rfbScreen,
00987 rfbFontDataPtr font, char** list,
00988 int x1, int y1, int x2, int y2,
00989 rfbPixel foreColour, rfbPixel backColour,
00990 int border,SelectionChangedHookPtr selChangedHook);
00991
00992
00993
00994 extern void rfbUsage(void);
00995 extern void rfbPurgeArguments(int* argc,int* position,int count,char *argv[]);
00996 extern rfbBool rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[]);
00997 extern rfbBool rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[]);
00998
00999
01000
01001 extern void rfbLogEnable(int enabled);
01002 typedef void (*rfbLogProc)(const char *format, ...);
01003 extern rfbLogProc rfbLog, rfbErr;
01004 extern void rfbLogPerror(const char *str);
01005
01006 void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
01007 void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy);
01008
01009 void rfbDoCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
01010 void rfbDoCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy);
01011
01012 void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2);
01013 void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,sraRegionPtr modRegion);
01014 void rfbDoNothingWithClient(rfbClientPtr cl);
01015 enum rfbNewClientAction defaultNewClientHook(rfbClientPtr cl);
01016 void rfbRegisterProtocolExtension(rfbProtocolExtension* extension);
01017 void rfbUnregisterProtocolExtension(rfbProtocolExtension* extension);
01018 struct _rfbProtocolExtension* rfbGetExtensionIterator();
01019 void rfbReleaseExtensionIterator();
01020 rfbBool rfbEnableExtension(rfbClientPtr cl, rfbProtocolExtension* extension,
01021 void* data);
01022 rfbBool rfbDisableExtension(rfbClientPtr cl, rfbProtocolExtension* extension);
01023 void* rfbGetExtensionClientData(rfbClientPtr cl, rfbProtocolExtension* extension);
01024
01026 rfbBool rfbCheckPasswordByList(rfbClientPtr cl,const char* response,int len);
01027
01028
01029 extern rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
01030 int width,int height,int bitsPerSample,int samplesPerPixel,
01031 int bytesPerPixel);
01032 extern void rfbInitServer(rfbScreenInfoPtr rfbScreen);
01033 extern void rfbShutdownServer(rfbScreenInfoPtr rfbScreen,rfbBool disconnectClients);
01034 extern void rfbNewFramebuffer(rfbScreenInfoPtr rfbScreen,char *framebuffer,
01035 int width,int height, int bitsPerSample,int samplesPerPixel,
01036 int bytesPerPixel);
01037
01038 extern void rfbScreenCleanup(rfbScreenInfoPtr screenInfo);
01039 extern void rfbSetServerVersionIdentity(rfbScreenInfoPtr screen, char *fmt, ...);
01040
01041
01042
01043
01044 extern void rfbStartOnHoldClient(rfbClientPtr cl);
01045 extern void rfbRefuseOnHoldClient(rfbClientPtr cl);
01046
01047
01048
01049
01050
01051
01052
01053 extern void rfbRunEventLoop(rfbScreenInfoPtr screenInfo, long usec, rfbBool runInBackground);
01054 extern rfbBool rfbProcessEvents(rfbScreenInfoPtr screenInfo,long usec);
01055 extern rfbBool rfbIsActive(rfbScreenInfoPtr screenInfo);
01056
01057
01058 void rfbRegisterTightVNCFileTransferExtension();
01059 void rfbUnregisterTightVNCFileTransferExtension();
01060
01061
01062 extern char *messageNameServer2Client(uint32_t type, char *buf, int len);
01063 extern char *messageNameClient2Server(uint32_t type, char *buf, int len);
01064 extern char *encodingName(uint32_t enc, char *buf, int len);
01065
01066 extern rfbStatList *rfbStatLookupEncoding(rfbClientPtr cl, uint32_t type);
01067 extern rfbStatList *rfbStatLookupMessage(rfbClientPtr cl, uint32_t type);
01068
01069
01070 extern void rfbStatRecordEncodingSent(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw);
01071 extern void rfbStatRecordEncodingSentAdd(rfbClientPtr cl, uint32_t type, int byteCount);
01072 extern void rfbStatRecordEncodingRcvd(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw);
01073 extern void rfbStatRecordMessageSent(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw);
01074 extern void rfbStatRecordMessageRcvd(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw);
01075 extern void rfbResetStats(rfbClientPtr cl);
01076 extern void rfbPrintStats(rfbClientPtr cl);
01077
01078 extern int rfbStatGetSentBytes(rfbClientPtr cl);
01079 extern int rfbStatGetSentBytesIfRaw(rfbClientPtr cl);
01080 extern int rfbStatGetRcvdBytes(rfbClientPtr cl);
01081 extern int rfbStatGetRcvdBytesIfRaw(rfbClientPtr cl);
01082 extern int rfbStatGetMessageCountSent(rfbClientPtr cl, uint32_t type);
01083 extern int rfbStatGetMessageCountRcvd(rfbClientPtr cl, uint32_t type);
01084 extern int rfbStatGetEncodingCountSent(rfbClientPtr cl, uint32_t type);
01085 extern int rfbStatGetEncodingCountRcvd(rfbClientPtr cl, uint32_t type);
01086
01088 extern void rfbSetProtocolVersion(rfbScreenInfoPtr rfbScreen, int major_, int minor_);
01089
01091 extern rfbBool rfbSendTextChatMessage(rfbClientPtr cl, uint32_t length, char *buffer);
01092
01093
01094
01095
01096
01097
01098 rfbBool rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen);
01099 rfbBool rfbUpdateClient(rfbClientPtr cl);
01100
01101
01102 #if(defined __cplusplus)
01103 }
01104 #endif
01105
01276 #endif