/apps/desktop/libvncserver/rfb/rfbclient.h
http://ftk.googlecode.com/ · C Header · 335 lines · 191 code · 75 blank · 69 comment · 0 complexity · 883a70f799af2237d14b25c27356dba1 MD5 · raw file
- #ifndef RFBCLIENT_H
- #define RFBCLIENT_H
- /*
- * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved.
- * Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
- * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- * USA.
- */
- /*
- * vncviewer.h
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/time.h>
- #include <unistd.h>
- #include <rfb/rfbproto.h>
- #include <rfb/keysym.h>
- #define rfbClientSwap16IfLE(s) \
- (*(char *)&client->endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s))
- #define rfbClientSwap32IfLE(l) \
- (*(char *)&client->endianTest ? ((((l) & 0xff000000) >> 24) | \
- (((l) & 0x00ff0000) >> 8) | \
- (((l) & 0x0000ff00) << 8) | \
- (((l) & 0x000000ff) << 24)) : (l))
- #define FLASH_PORT_OFFSET 5400
- #define LISTEN_PORT_OFFSET 5500
- #define TUNNEL_PORT_OFFSET 5500
- #define SERVER_PORT_OFFSET 5900
- #define DEFAULT_SSH_CMD "/usr/bin/ssh"
- #define DEFAULT_TUNNEL_CMD \
- (DEFAULT_SSH_CMD " -f -L %L:localhost:%R %H sleep 20")
- #define DEFAULT_VIA_CMD \
- (DEFAULT_SSH_CMD " -f -L %L:%H:%R %G sleep 20")
- #if(defined __cplusplus)
- extern "C"
- {
- #endif
- /* vncrec */
- typedef struct {
- FILE* file;
- struct timeval tv;
- rfbBool readTimestamp;
- rfbBool doNotSleep;
- } rfbVNCRec;
- /* client data */
- typedef struct rfbClientData {
- void* tag;
- void* data;
- struct rfbClientData* next;
- } rfbClientData;
- /* app data (belongs into rfbClient?) */
- typedef struct {
- rfbBool shareDesktop;
- rfbBool viewOnly;
- const char* encodingsString;
- rfbBool useBGR233;
- int nColours;
- rfbBool forceOwnCmap;
- rfbBool forceTrueColour;
- int requestedDepth;
- int compressLevel;
- int qualityLevel;
- rfbBool enableJPEG;
- rfbBool useRemoteCursor;
- rfbBool palmVNC; /* use palmvnc specific SetScale (vs ultravnc) */
- int scaleSetting; /* 0 means no scale set, else 1/scaleSetting */
- } AppData;
- struct _rfbClient;
- typedef void (*HandleTextChatProc)(struct _rfbClient* client, int value, char *text);
- typedef void (*HandleKeyboardLedStateProc)(struct _rfbClient* client, int value, int pad);
- typedef rfbBool (*HandleCursorPosProc)(struct _rfbClient* client, int x, int y);
- typedef void (*SoftCursorLockAreaProc)(struct _rfbClient* client, int x, int y, int w, int h);
- typedef void (*SoftCursorUnlockScreenProc)(struct _rfbClient* client);
- typedef void (*GotFrameBufferUpdateProc)(struct _rfbClient* client, int x, int y, int w, int h);
- typedef char* (*GetPasswordProc)(struct _rfbClient* client);
- typedef rfbBool (*MallocFrameBufferProc)(struct _rfbClient* client);
- typedef void (*GotXCutTextProc)(struct _rfbClient* client, const char *text, int textlen);
- typedef void (*BellProc)(struct _rfbClient* client);
- typedef void (*GotCursorShapeProc)(struct _rfbClient* client, int xhot, int yhot, int width, int height, int bytesPerPixel);
- typedef void (*GotCopyRectProc)(struct _rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y);
- typedef struct _rfbClient {
- uint8_t* frameBuffer;
- int width, height;
- int endianTest;
- AppData appData;
- const char* programName;
- char* serverHost;
- int serverPort; /* if -1, then use file recorded by vncrec */
- rfbBool listenSpecified;
- int listenPort, flashPort;
- struct {
- int x, y, w, h;
- } updateRect;
- /* Note that the CoRRE encoding uses this buffer and assumes it is big enough
- to hold 255 * 255 * 32 bits -> 260100 bytes. 640*480 = 307200 bytes.
- Hextile also assumes it is big enough to hold 16 * 16 * 32 bits.
- Tight encoding assumes BUFFER_SIZE is at least 16384 bytes. */
- #define RFB_BUFFER_SIZE (640*480)
- char buffer[RFB_BUFFER_SIZE];
- /* rfbproto.c */
- int sock;
- rfbBool canUseCoRRE;
- rfbBool canUseHextile;
- char *desktopName;
- rfbPixelFormat format;
- rfbServerInitMsg si;
- /* sockets.c */
- #define RFB_BUF_SIZE 8192
- char buf[RFB_BUF_SIZE];
- char *bufoutptr;
- int buffered;
- /* The zlib encoding requires expansion/decompression/deflation of the
- compressed data in the "buffer" above into another, result buffer.
- However, the size of the result buffer can be determined precisely
- based on the bitsPerPixel, height and width of the rectangle. We
- allocate this buffer one time to be the full size of the buffer. */
- /* Ultra Encoding uses this buffer too */
-
- int ultra_buffer_size;
- char *ultra_buffer;
- int raw_buffer_size;
- char *raw_buffer;
- #ifdef LIBVNCSERVER_HAVE_LIBZ
- z_stream decompStream;
- rfbBool decompStreamInited;
- #endif
- #ifdef LIBVNCSERVER_HAVE_LIBZ
- #ifdef LIBVNCSERVER_HAVE_LIBJPEG
- /*
- * Variables for the ``tight'' encoding implementation.
- */
- /* Separate buffer for compressed data. */
- #define ZLIB_BUFFER_SIZE 30000
- char zlib_buffer[ZLIB_BUFFER_SIZE];
- /* Four independent compression streams for zlib library. */
- z_stream zlibStream[4];
- rfbBool zlibStreamActive[4];
- /* Filter stuff. Should be initialized by filter initialization code. */
- rfbBool cutZeros;
- int rectWidth, rectColors;
- char tightPalette[256*4];
- uint8_t tightPrevRow[2048*3*sizeof(uint16_t)];
- /* JPEG decoder state. */
- rfbBool jpegError;
- struct jpeg_source_mgr* jpegSrcManager;
- void* jpegBufferPtr;
- size_t jpegBufferLen;
- #endif
- #endif
- /* cursor.c */
- uint8_t *rcSource, *rcMask;
- /* private data pointer */
- rfbClientData* clientData;
- rfbVNCRec* vncRec;
- /* Keyboard State support (is 'Caps Lock' set on the remote display???) */
- int KeyboardLedStateEnabled;
- int CurrentKeyboardLedState;
- int canHandleNewFBSize;
- /* hooks */
- HandleTextChatProc HandleTextChat;
- HandleKeyboardLedStateProc HandleKeyboardLedState;
- HandleCursorPosProc HandleCursorPos;
- SoftCursorLockAreaProc SoftCursorLockArea;
- SoftCursorUnlockScreenProc SoftCursorUnlockScreen;
- GotFrameBufferUpdateProc GotFrameBufferUpdate;
- /* the pointer returned by GetPassword will be freed after use! */
- GetPasswordProc GetPassword;
- MallocFrameBufferProc MallocFrameBuffer;
- GotXCutTextProc GotXCutText;
- BellProc Bell;
- GotCursorShapeProc GotCursorShape;
- GotCopyRectProc GotCopyRect;
- /* Which messages are supported by the server
- * This is a *guess* for most servers.
- * (If we can even detect the type of server)
- *
- * If the server supports the "rfbEncodingSupportedMessages"
- * then this will be updated when the encoding is received to
- * accurately reflect the servers capabilities.
- */
- rfbSupportedMessages supportedMessages;
- /* negotiated protocol version */
- int major, minor;
- } rfbClient;
- /* cursor.c */
- extern rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc);
- /* listen.c */
- extern void listenForIncomingConnections(rfbClient* viewer);
- /* rfbproto.c */
- extern rfbBool rfbEnableClientLogging;
- typedef void (*rfbClientLogProc)(const char *format, ...);
- extern rfbClientLogProc rfbClientLog,rfbClientErr;
- extern rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int port);
- extern rfbBool InitialiseRFBConnection(rfbClient* client);
- extern rfbBool SetFormatAndEncodings(rfbClient* client);
- extern rfbBool SendIncrementalFramebufferUpdateRequest(rfbClient* client);
- extern rfbBool SendFramebufferUpdateRequest(rfbClient* client,
- int x, int y, int w, int h,
- rfbBool incremental);
- extern rfbBool SendScaleSetting(rfbClient* client,int scaleSetting);
- extern rfbBool SendPointerEvent(rfbClient* client,int x, int y, int buttonMask);
- extern rfbBool SendKeyEvent(rfbClient* client,uint32_t key, rfbBool down);
- extern rfbBool SendClientCutText(rfbClient* client,char *str, int len);
- extern rfbBool HandleRFBServerMessage(rfbClient* client);
- extern rfbBool TextChatSend(rfbClient* client, char *text);
- extern rfbBool TextChatOpen(rfbClient* client);
- extern rfbBool TextChatClose(rfbClient* client);
- extern rfbBool TextChatFinish(rfbClient* client);
- extern rfbBool PermitServerInput(rfbClient* client, int enabled);
- extern void PrintPixelFormat(rfbPixelFormat *format);
- /* client data */
- void rfbClientSetClientData(rfbClient* client, void* tag, void* data);
- void* rfbClientGetClientData(rfbClient* client, void* tag);
- /* protocol extensions */
- typedef struct _rfbClientProtocolExtension {
- int* encodings;
- /* returns TRUE if the encoding was handled */
- rfbBool (*handleEncoding)(rfbClient* cl,
- rfbFramebufferUpdateRectHeader* rect);
- /* returns TRUE if it handled the message */
- rfbBool (*handleMessage)(rfbClient* cl,
- rfbServerToClientMsg* message);
- struct _rfbClientProtocolExtension* next;
- } rfbClientProtocolExtension;
- void rfbClientRegisterExtension(rfbClientProtocolExtension* e);
- /* sockets.c */
- extern rfbBool errorMessageOnReadFailure;
- extern rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n);
- extern rfbBool WriteToRFBServer(rfbClient* client, char *buf, int n);
- extern int FindFreeTcpPort(void);
- extern int ListenAtTcpPort(int port);
- extern int ConnectClientToTcpAddr(unsigned int host, int port);
- extern int AcceptTcpConnection(int listenSock);
- extern rfbBool SetNonBlocking(int sock);
- extern rfbBool StringToIPAddr(const char *str, unsigned int *addr);
- extern rfbBool SameMachine(int sock);
- extern int WaitForMessage(rfbClient* client,unsigned int usecs);
- /* vncviewer.c */
- rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,int bytesPerPixel);
- rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv);
- /* rfbClientCleanup() does not touch client->frameBuffer */
- void rfbClientCleanup(rfbClient* client);
- #if(defined __cplusplus)
- }
- #endif
- #endif