⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientconnection.h

📁 realvnc是一个非常流行的远程控制程序
💻 H
字号:
//  Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.////  This file is part of the VNC system.////  The VNC system 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 program 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 program; if not, write to the Free Software//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,//  USA.//// If the source code for the VNC system is not available from the place // whence you received this file, check http://www.uk.research.att.com/vnc or contact// the authors on vnc@uk.research.att.com for information on obtaining it.#pragma once#include "stdhdrs.h"#ifdef UNDER_CE#include "omnithreadce.h"#else#include "omnithread.h"#endif#include "VNCOptions.h"#include "VNCviewerApp.h"
#include "KeyMap.h"#include <rdr/types.h>
#include "FullScreenTitleBar.h" //Added by: Lars Werner (http://lars.werner.no)
#define SETTINGS_KEY_NAME "Software\\ORL\\VNCviewer\\Settings"#define MAX_HOST_NAME_LEN 250namespace rdr { class InStream; class FdInStream; class ZlibInStream; }class ClientConnection  : public omni_thread{public:	ClientConnection(VNCviewerApp *pApp);	ClientConnection(VNCviewerApp *pApp, SOCKET sock);	ClientConnection(VNCviewerApp *pApp, LPTSTR host, int port);	ClientConnection(VNCviewerApp *pApp, LPTSTR configFile);	virtual ~ClientConnection();	void Run();	void KillThread();	// Exceptions 	class UserCancelExc {};	class AuthenticationExc {};	class SocketExc {};	class ProtocolExc {};	class Fatal {};private:	static LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);	void DoBlit();	VNCviewerApp *m_pApp;	int m_port;    TCHAR m_host[MAX_HOST_NAME_LEN];	SOCKET m_sock;	bool m_serverInitiated;	HWND m_hwnd, m_hbands;	void Init(VNCviewerApp *pApp);	void CreateDisplay();	void GetConnectDetails();	void Connect();	void SetSocketOptions();	void Authenticate();	void NegotiateProtocolVersion();	void ReadServerInit();	void SendClientInit();	void CreateLocalFramebuffer();	void SaveConnection();	int  LoadConnection(char *fname);		void SetupPixelFormat();	void SetFormatAndEncodings();	void SendSetPixelFormat(rfbPixelFormat newFormat);	void SendIncrementalFramebufferUpdateRequest();	void SendFullFramebufferUpdateRequest();	void SendAppropriateFramebufferUpdateRequest();	void SendFramebufferUpdateRequest(int x, int y, int w, int h, bool incremental);		void ProcessPointerEvent(int x, int y, DWORD keyflags, UINT msg); 	void SubProcessPointerEvent(int x, int y, DWORD keyflags);  void ProcessMouseWheel(int delta);	void SendPointerEvent(int x, int y, int buttonMask);    void ProcessKeyEvent(int virtkey, DWORD keyData);	void SendKeyEvent(CARD32 key, bool down);		void ReadScreenUpdate();	void Update(RECT *pRect);	void SizeWindow();	bool ScrollScreen(int dx, int dy);	void UpdateScrollbars();    	void ReadRawRect(rfbFramebufferUpdateRectHeader *pfburh);	void ReadCopyRect(rfbFramebufferUpdateRectHeader *pfburh);    void ReadRRERect(rfbFramebufferUpdateRectHeader *pfburh);	void ReadCoRRERect(rfbFramebufferUpdateRectHeader *pfburh);	void ReadHextileRect(rfbFramebufferUpdateRectHeader *pfburh);	void HandleHextileEncoding8(int x, int y, int w, int h);	void HandleHextileEncoding16(int x, int y, int w, int h);	void HandleHextileEncoding32(int x, int y, int w, int h);		void ReadRBSRect(rfbFramebufferUpdateRectHeader *pfburh);	BOOL DrawRBSRect8(int x, int y, int w, int h, CARD8 **pptr);	BOOL DrawRBSRect16(int x, int y, int w, int h, CARD8 **pptr);	BOOL DrawRBSRect32(int x, int y, int w, int h, CARD8 **pptr);	// ClientConnectionFullScreen.cpp	void SetFullScreenMode(bool enable);	bool InFullScreenMode();	void RealiseFullScreenMode();	bool BumpScroll(int x, int y);
	CTitleBar TitleBar; //Added by: Lars Werner (http://lars.werner.no)
	// ClientConnectionClipboard.cpp	void ProcessLocalClipboardChange();	void UpdateLocalClipboard(char *buf, int len);	void SendClientCutText(char *str, int len);	void ReadServerCutText();	void ReadBell();	void ReadEnableExtension();	void ReadExtensionData();		void SendRFBMsg(CARD8 msgType, void* data, int length);	void ReadExact(char *buf, int bytes);	void ReadString(char *buf, int length);	void WriteExact(char *buf, int bytes);	// This is what controls the thread	void * run_undetached(void* arg);	bool m_bKillThread;	// Utilities	// These draw a solid rectangle of colour on the bitmap	// They assume the bitmap is already selected into the DC, and the	// DC is locked if necessary.#ifndef UNDER_CE	// Normally this is an inline call to a GDI method.	inline void FillSolidRect(RECT *pRect, COLORREF color) {		COLORREF oldbgcol = SetBkColor(m_hBitmapDC, color);		// This is the call MFC uses for FillSolidRect. Who am I to argue?		::ExtTextOut(m_hBitmapDC, 0, 0, ETO_OPAQUE, pRect, NULL, 0, NULL);				};#else	// Under WinCE this is a manual insert into a pixmap, 	// and is a little too complicated for an inline.	void FillSolidRect(RECT *pRect, COLORREF color);#endif // UNDER_CE	inline void FillSolidRect(int x, int y, int w, int h, COLORREF color) {		RECT r;		r.left = x;		r.right = x + w;		r.top = y;		r.bottom = y + h;		FillSolidRect(&r, color);	};    // how many other windows are owned by this process?    unsigned int CountProcessOtherWindows();    // Buffer for network operations	void CheckBufferSize(int bufsize);	char *m_netbuf;	int m_netbufsize;	omni_mutex m_bufferMutex, 		m_bitmapdcMutex,  m_clipMutex,          m_writeMutex, m_sockMutex;	// Bitmap for local copy of screen, and DC for writing to it.	HBITMAP m_hBitmap;	HDC		m_hBitmapDC;	HPALETTE m_hPalette;#ifdef UNDER_CE	// Under WinCE this points to the DIB pixels.	BYTE* m_bits;#endif 	// Keyboard mapper	KeyMap m_keymap;	// RFB settings	VNCOptions m_opts;	TCHAR *m_desktopName;	unsigned char m_encPasswd[8];	rfbServerInitMsg m_si;	rfbPixelFormat m_myFormat, m_pendingFormat;	// protocol version in use.	int m_majorVersion, m_minorVersion;	bool m_threadStarted, m_running;	// mid-connection format change requested	bool m_pendingFormatChange;	// Display connection info;	void ShowConnInfo();	// Window may be scrollable - these control the scroll position	int m_hScrollPos, m_hScrollMax, m_vScrollPos, m_vScrollMax;	// The current window size	int m_winwidth, m_winheight;	// The size of the current client area	int m_cliwidth, m_cliheight;	// The size of a window needed to hold entire screen without scrollbars	int m_fullwinwidth, m_fullwinheight;	// The size of the CE CommandBar	int m_barheight;	// Dormant basically means minimized; updates will not be requested 	// while dormant.	void SetDormant(bool newstate);	bool m_dormant;	// The number of bytes required to hold at least one pixel.	unsigned int m_minPixelBytes;	// Next window in clipboard chain	HWND m_hwndNextViewer; 	bool m_initialClipboardSeen;			// Are we waiting on a timer for emulating three buttons?	bool m_waitingOnEmulateTimer;	// Or are we emulating the middle button now?	bool m_emulatingMiddleButton;	// Emulate 3 buttons mouse timer:	UINT m_emulate3ButtonsTimer;	// Buttons pressed, waiting for timer in emulating 3 buttons:	DWORD m_emulateKeyFlags;	int m_emulateButtonPressedX;	int m_emulateButtonPressedY;  int oldPointerX, oldPointerY, oldButtonMask;  int kbitsPerSecond;  rdr::FdInStream* fis;  rdr::ZlibInStream* zis;  void zrleDecode(int x, int y, int w, int h);  void zrleDecode8(int x, int y, int w, int h, rdr::InStream* is,                   rdr::ZlibInStream* zis, rdr::U8* buf);  void zrleDecode16(int x, int y, int w, int h, rdr::InStream* is,                    rdr::ZlibInStream* zis, rdr::U16* buf);  void zrleDecode24A(int x, int y, int w, int h, rdr::InStream* is,                     rdr::ZlibInStream* zis, rdr::U32* buf);  void zrleDecode24B(int x, int y, int w, int h, rdr::InStream* is,                     rdr::ZlibInStream* zis, rdr::U32* buf);  void zrleDecode32(int x, int y, int w, int h, rdr::InStream* is,                    rdr::ZlibInStream* zis, rdr::U32* buf);};// Some handy classes for temporary GDI object selection// These select objects when constructed and automatically release them when destructed.class ObjectSelector {public:	ObjectSelector(HDC hdc, HGDIOBJ hobj) { m_hdc = hdc; m_hOldObj = SelectObject(hdc, hobj); }	~ObjectSelector() { m_hOldObj = SelectObject(m_hdc, m_hOldObj); }	HGDIOBJ m_hOldObj;	HDC m_hdc;};class PaletteSelector {public:	PaletteSelector(HDC hdc, HPALETTE hpal) { 		m_hdc = hdc; 		m_hOldPal = SelectPalette(hdc, hpal, FALSE); 		RealizePalette(hdc);	}	~PaletteSelector() { 		m_hOldPal = SelectPalette(m_hdc, m_hOldPal, FALSE); 		RealizePalette(m_hdc);	}	HPALETTE m_hOldPal;	HDC m_hdc;};class TempDC {public:	TempDC(HWND hwnd) { m_hdc = GetDC(hwnd); m_hwnd = hwnd; }	~TempDC() { ReleaseDC(m_hwnd, m_hdc); }	operator HDC() {return m_hdc;};	HDC m_hdc;	HWND m_hwnd;};// Colour decoding utility functions// Define rs,rm, bs,bm, gs & gm before using, eg with the following:#define SETUP_COLOR_SHORTCUTS \	 CARD8 rs = m_myFormat.redShift;   CARD16 rm = m_myFormat.redMax;   \     CARD8 gs = m_myFormat.greenShift; CARD16 gm = m_myFormat.greenMax; \     CARD8 bs = m_myFormat.blueShift;  CARD16 bm = m_myFormat.blueMax;  \// read a pixel from the given address, and return a color value#define COLOR_FROM_PIXEL8_ADDRESS(p) (PALETTERGB( \                (int) (((*(CARD8 *)p >> rs) & rm) * 255 / rm), \                (int) (((*(CARD8 *)p >> gs) & gm) * 255 / gm), \                (int) (((*(CARD8 *)p >> bs) & bm) * 255 / bm) ))#define COLOR_FROM_PIXEL16_ADDRESS(p) (PALETTERGB( \                (int) ((( *(CARD16 *)p >> rs) & rm) * 255 / rm), \                (int) ((( *(CARD16 *)p >> gs) & gm) * 255 / gm), \                (int) ((( *(CARD16 *)p >> bs) & bm) * 255 / bm) ))#define COLOR_FROM_PIXEL32_ADDRESS(p) (PALETTERGB( \                (int) ((( *(CARD32 *)p >> rs) & rm) * 255 / rm), \                (int) ((( *(CARD32 *)p >> gs) & gm) * 255 / gm), \                (int) ((( *(CARD32 *)p >> bs) & bm) * 255 / bm) ))// The following may be faster if you already have a pixel value of the appropriate size#define COLOR_FROM_PIXEL8(p) (PALETTERGB( \                (int) (((p >> rs) & rm) * 255 / rm), \                (int) (((p >> gs) & gm) * 255 / gm), \                (int) (((p >> bs) & bm) * 255 / bm) ))#define COLOR_FROM_PIXEL16(p) (PALETTERGB( \                (int) ((( p >> rs) & rm) * 255 / rm), \                (int) ((( p >> gs) & gm) * 255 / gm), \                (int) ((( p >> bs) & bm) * 255 / bm) ))#define COLOR_FROM_PIXEL32(p) (PALETTERGB( \                (int) (((p >> rs) & rm) * 255 / rm), \                (int) (((p >> gs) & gm) * 255 / gm), \                (int) (((p >> bs) & bm) * 255 / bm) ))#ifdef UNDER_CE#define SETPIXEL(b,x,y,c) SetPixel((b),(x),(y),(c))#else#define SETPIXEL(b,x,y,c) SetPixelV((b),(x),(y),(c))#endif#define SETPIXELS(bpp, x, y, w, h)												\	{																			\		CARD##bpp *p = (CARD##bpp *) m_netbuf;									\        register CARD##bpp pix;													\		for (int k = y; k < y+h; k++) {											\			for (int j = x; j < x+w; j++) {										\                    pix = *p;													\                    SETPIXEL(m_hBitmapDC, j,k, COLOR_FROM_PIXEL##bpp##(pix));	\					p++;														\			}																	\		}																		\	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -