240 lines
6.9 KiB
C++
240 lines
6.9 KiB
C++
// Copyright (C) 2001 Constantin Kaplinsky. All Rights Reserved.
|
|
// 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.
|
|
//
|
|
// TightVNC distribution homepage on the Web: http://www.tightvnc.com/
|
|
//
|
|
// 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.
|
|
|
|
|
|
// vncClient.h
|
|
|
|
// vncClient class handles the following functions:
|
|
// - Recieves requests from the connected client and
|
|
// handles them
|
|
// - Handles incoming updates properly, using a vncBuffer
|
|
// object to keep track of screen changes
|
|
// It uses a vncBuffer and is passed the vncDesktop and
|
|
// vncServer to communicate with.
|
|
|
|
class vncClient;
|
|
typedef SHORT vncClientId;
|
|
|
|
#if (!defined(_WINVNC_VNCCLIENT))
|
|
#define _WINVNC_VNCCLIENT
|
|
|
|
#include <list>
|
|
#include <time.h>
|
|
|
|
typedef std::list<vncClientId> vncClientList;
|
|
|
|
// Includes
|
|
#include "stdhdrs.h"
|
|
#include "common.h"
|
|
#include "VSocket.h"
|
|
#include <omnithread.h>
|
|
|
|
// Custom
|
|
#include "rectlist.h"
|
|
#include "vncDesktop.h"
|
|
#include "vncRegion.h"
|
|
#include "vncBuffer.h"
|
|
#include "vncKeymap.h"
|
|
|
|
// The vncClient class itself
|
|
|
|
class vncClient
|
|
{
|
|
public:
|
|
// Constructor/destructor
|
|
vncClient();
|
|
~vncClient();
|
|
|
|
// Allow the client thread to see inside the client object
|
|
friend class vncClientThread;
|
|
|
|
// Init
|
|
virtual BOOL Init(vncServer *server,
|
|
VSocket *socket,
|
|
BOOL reverse,
|
|
BOOL shared,
|
|
vncClientId newid, AGENT_CTX * lpAgentContext);
|
|
|
|
// Kill
|
|
// The server uses this to close the client socket, causing the
|
|
// client thread to fail, which in turn deletes the client object
|
|
virtual void Kill();
|
|
|
|
// Client manipulation functions for use by the server
|
|
virtual void SetBuffer(vncBuffer *buffer);
|
|
|
|
// Update handling functions
|
|
virtual void TriggerUpdate();
|
|
virtual void UpdateMouse();
|
|
virtual void UpdateRect(RECT &rect);
|
|
virtual void UpdateRegion(vncRegion ®ion);
|
|
virtual void CopyRect(RECT &dest, POINT &source);
|
|
virtual void UpdateClipText(LPSTR text);
|
|
virtual void UpdatePalette();
|
|
|
|
// Has the client sent an input event?
|
|
virtual BOOL RemoteEventReceived() {
|
|
BOOL result = m_remoteevent;
|
|
m_remoteevent = FALSE;
|
|
return result;
|
|
}
|
|
|
|
virtual void SetCursorPosChanged() {
|
|
if (time(NULL) - m_pointer_event_time > 1) {
|
|
m_cursor_pos_changed = TRUE;
|
|
}
|
|
}
|
|
|
|
// Functions for setting & getting the client settings
|
|
virtual void EnableKeyboard(BOOL enable) { m_keyboardenabled = enable; }
|
|
virtual void EnablePointer(BOOL enable) { m_pointerenabled = enable; }
|
|
virtual void BlockInput(BOOL block) { m_inputblocked = block; }
|
|
virtual BOOL IsKeyboardEnabled() { return m_keyboardenabled; }
|
|
virtual BOOL IsPointerEnabled() { return m_pointerenabled; }
|
|
virtual BOOL IsInputEnabled() { return m_keyboardenabled || m_pointerenabled; }
|
|
virtual BOOL IsInputBlocked() { return m_inputblocked; }
|
|
|
|
virtual const char *GetClientName();
|
|
virtual const char *GetServerName();
|
|
virtual vncClientId GetClientId() {return m_id;};
|
|
|
|
BOOL SetNewFBSize(BOOL sendnewfb);
|
|
BOOL IncrRgnRequested(){return !m_incr_rgn.IsEmpty();};
|
|
BOOL FullRgnRequested(){return !m_full_rgn.IsEmpty();};
|
|
void UpdateLocalFormat();
|
|
|
|
|
|
|
|
// Update routines
|
|
protected:
|
|
BOOL SendUpdate();
|
|
BOOL SendRFBMsg(CARD8 type, BYTE *buffer, int buflen);
|
|
BOOL SendRectangles(rectlist &rects);
|
|
BOOL SendRectangle(RECT &rect);
|
|
BOOL SendCopyRect(RECT &dest, POINT &source);
|
|
BOOL SendCursorShapeUpdate();
|
|
BOOL SendCursorPosUpdate();
|
|
BOOL SendLastRect();
|
|
BOOL SendPalette();
|
|
|
|
|
|
|
|
// Internal stuffs
|
|
protected:
|
|
// Per-client settings
|
|
int m_protocol_minor_version;
|
|
BOOL m_protocol_tightvnc;
|
|
BOOL m_keyboardenabled;
|
|
BOOL m_pointerenabled;
|
|
BOOL m_inputblocked;
|
|
BOOL m_copyrect_use;
|
|
vncClientId m_id;
|
|
|
|
// The screen buffer
|
|
vncBuffer *m_buffer;
|
|
|
|
// The server
|
|
vncServer *m_server;
|
|
|
|
// The socket
|
|
VSocket *m_socket;
|
|
char *m_client_name;
|
|
char *m_server_name;
|
|
|
|
// The client thread
|
|
omni_thread *m_thread;
|
|
|
|
// Flag to indicate whether the client is ready for RFB messages
|
|
BOOL m_protocol_ready;
|
|
|
|
// Flag to indicate that our framebuffer size has changed before
|
|
// the client has told that it supports NewFBSize message
|
|
BOOL m_fb_size_changed;
|
|
|
|
// User input information
|
|
RECT m_oldmousepos;
|
|
BOOL m_mousemoved;
|
|
rfbPointerEventMsg m_ptrevent;
|
|
|
|
// Support for cursor shape updates (XCursor, RichCursor encodings)
|
|
BOOL m_cursor_update_pending;
|
|
BOOL m_cursor_update_sent;
|
|
BOOL m_cursor_pos_changed;
|
|
time_t m_pointer_event_time;
|
|
HCURSOR m_hcursor;
|
|
POINT m_cursor_pos;
|
|
|
|
// Region structures used when preparing updates
|
|
// - region of rects which may have changed since last update
|
|
// - region for which incremental data is requested
|
|
// - region for which full data is requested
|
|
vncRegion m_changed_rgn;
|
|
vncRegion m_incr_rgn;
|
|
vncRegion m_full_rgn;
|
|
omni_mutex m_regionLock;
|
|
|
|
BOOL m_copyrect_set;
|
|
RECT m_copyrect_rect;
|
|
POINT m_copyrect_src;
|
|
|
|
BOOL m_updatewanted;
|
|
RECT m_fullscreen;
|
|
|
|
// When the local display is palettized, it sometimes changes...
|
|
BOOL m_palettechanged;
|
|
|
|
// Information used in polling mode!
|
|
BOOL m_remoteevent;
|
|
|
|
BOOL m_use_NewFBSize;
|
|
BOOL m_use_PointerPos;
|
|
|
|
omni_mutex m_sendUpdateLock;
|
|
|
|
private:
|
|
unsigned int FiletimeToTime70(FILETIME filetime);
|
|
void SendFileDownloadData(unsigned short sizeFile, char *pFile);
|
|
void SendFileDownloadData(unsigned int mTime);
|
|
void SendFileUploadCancel(unsigned short reasonLen, char *reason);
|
|
void SendFileDownloadFailed(unsigned short reasonLen, char *reason);
|
|
void CloseUndoneFileTransfer();
|
|
BOOL m_bUploadStarted;
|
|
BOOL m_bDownloadStarted;
|
|
HANDLE m_hFileToRead;
|
|
HANDLE m_hFileToWrite;
|
|
char m_UploadFilename[MAX_PATH];
|
|
char m_DownloadFilename[MAX_PATH];
|
|
void Time70ToFiletime(unsigned int mTime, FILETIME *pFiletime);
|
|
unsigned int m_modTime;
|
|
unsigned int beginUploadTime;
|
|
unsigned int endUploadTime;
|
|
DWORD m_rfbBlockSize;
|
|
public:
|
|
void SendFileDownloadPortion();
|
|
};
|
|
|
|
#endif
|