barrier/server/CServer.h

198 lines
4.8 KiB
C
Raw Normal View History

2001-10-06 18:13:28 +04:00
#ifndef CSERVER_H
#define CSERVER_H
#include "ClipboardTypes.h"
2001-10-06 18:13:28 +04:00
#include "KeyTypes.h"
#include "MouseTypes.h"
#include "CScreenMap.h"
#include "CClipboard.h"
2001-10-06 18:13:28 +04:00
#include "CMutex.h"
#include "CString.h"
#include "XBase.h"
#include <list>
#include <map>
class CThread;
class IServerProtocol;
class ISocketFactory;
class ISecurityFactory;
class IPrimaryScreen;
class CServer {
2002-04-29 18:40:01 +04:00
public:
2001-10-06 18:13:28 +04:00
CServer();
~CServer();
// manipulators
// start the server. does not return until quit() is called.
2001-10-06 18:13:28 +04:00
void run();
// tell server to exit gracefully
void quit();
2001-10-06 18:13:28 +04:00
// update screen map
void setScreenMap(const CScreenMap&);
// handle events on server's screen. onMouseMovePrimary() returns
// true iff the mouse enters a jump zone and jumps.
2001-10-06 18:13:28 +04:00
void onKeyDown(KeyID, KeyModifierMask);
void onKeyUp(KeyID, KeyModifierMask);
void onKeyRepeat(KeyID, KeyModifierMask, SInt32 count);
2001-10-06 18:13:28 +04:00
void onMouseDown(ButtonID);
void onMouseUp(ButtonID);
bool onMouseMovePrimary(SInt32 x, SInt32 y);
2001-10-06 18:13:28 +04:00
void onMouseMoveSecondary(SInt32 dx, SInt32 dy);
void onMouseWheel(SInt32 delta);
void grabClipboard(ClipboardID);
2001-10-06 18:13:28 +04:00
// handle messages from clients
void setInfo(const CString& clientName,
SInt32 w, SInt32 h, SInt32 zoneSize);
void grabClipboard(ClipboardID,
UInt32 seqNum, const CString& clientName);
void setClipboard(ClipboardID,
UInt32 seqNum, const CString& data);
2001-10-06 18:13:28 +04:00
// accessors
bool isLockedToScreen() const;
// get the current screen map
void getScreenMap(CScreenMap*) const;
// get the sides of the primary screen that have neighbors
UInt32 getActivePrimarySides() const;
2002-04-29 18:40:01 +04:00
protected:
2001-10-06 18:13:28 +04:00
bool onCommandKey(KeyID, KeyModifierMask, bool down);
2002-04-29 18:40:01 +04:00
private:
2001-10-06 18:13:28 +04:00
class CCleanupNote {
2002-04-29 18:40:01 +04:00
public:
2001-10-06 18:13:28 +04:00
CCleanupNote(CServer*);
~CCleanupNote();
2002-04-29 18:40:01 +04:00
private:
2001-10-06 18:13:28 +04:00
CServer* m_server;
};
class CConnectionNote {
2002-04-29 18:40:01 +04:00
public:
2001-10-06 18:13:28 +04:00
CConnectionNote(CServer*, const CString&, IServerProtocol*);
~CConnectionNote();
2002-04-29 18:40:01 +04:00
private:
2001-10-06 18:13:28 +04:00
bool m_pending;
CServer* m_server;
CString m_name;
};
class CScreenInfo {
2002-04-29 18:40:01 +04:00
public:
2001-10-06 18:13:28 +04:00
CScreenInfo(const CString& name, IServerProtocol*);
~CScreenInfo();
2002-04-29 18:40:01 +04:00
public:
2001-10-06 18:13:28 +04:00
CString m_name;
IServerProtocol* m_protocol;
SInt32 m_width, m_height;
SInt32 m_zoneSize;
bool m_gotClipboard[kClipboardEnd];
2001-10-06 18:13:28 +04:00
};
// change the active screen
void switchScreen(CScreenInfo*, SInt32 x, SInt32 y);
// lookup neighboring screen
CScreenInfo* getNeighbor(CScreenInfo*, CScreenMap::EDirection) const;
// lookup neighboring screen. given a position relative to the
// source screen, find the screen we should move onto and where.
// if the position is sufficiently far from the source then we
// cross multiple screens.
CScreenInfo* getNeighbor(CScreenInfo*,
CScreenMap::EDirection,
SInt32& x, SInt32& y) const;
// adjust coordinates to account for resolution differences. the
// position is converted to a resolution independent form then
// converted back to screen coordinates on the destination screen.
void mapPosition(CScreenInfo* src,
CScreenMap::EDirection srcSide,
CScreenInfo* dst,
SInt32& x, SInt32& y) const;
// open/close the primary screen
void openPrimaryScreen();
void closePrimaryScreen();
2001-10-06 18:13:28 +04:00
// clear gotClipboard flags in all screens
void clearGotClipboard(ClipboardID);
// send clipboard to the active screen if it doesn't already have it
void sendClipboard(ClipboardID);
// update the clipboard if owned by the primary screen
void updatePrimaryClipboard(ClipboardID);
2001-10-06 18:13:28 +04:00
// cancel running threads
void cleanupThreads();
2001-10-06 18:13:28 +04:00
// thread method to accept incoming client connections
void acceptClients(void*);
// thread method to do startup handshake with client
void handshakeClient(void*);
// thread cleanup list maintenance
friend class CCleanupNote;
void addCleanupThread(const CThread& thread);
void removeCleanupThread(const CThread& thread);
// connection list maintenance
friend class CConnectionNote;
CScreenInfo* addConnection(const CString& name, IServerProtocol*);
void removeConnection(const CString& name);
2002-04-29 18:40:01 +04:00
private:
2001-10-06 18:13:28 +04:00
typedef std::list<CThread*> CThreadList;
typedef std::map<CString, CScreenInfo*> CScreenList;
class CClipboardInfo {
public:
CClipboardInfo();
public:
CClipboard m_clipboard;
CString m_clipboardData;
CString m_clipboardOwner;
UInt32 m_clipboardSeqNum;
bool m_clipboardReady;
};
2001-10-06 18:13:28 +04:00
CMutex m_mutex;
double m_bindTimeout;
ISocketFactory* m_socketFactory;
ISecurityFactory* m_securityFactory;
CThreadList m_cleanupList;
IPrimaryScreen* m_primary;
CScreenList m_screens;
CScreenInfo* m_active;
CScreenInfo* m_primaryInfo;
2001-10-06 18:13:28 +04:00
// the sequence number of enter messages
UInt32 m_seqNum;
2001-10-06 18:13:28 +04:00
SInt32 m_x, m_y;
CScreenMap m_screenMap;
CClipboardInfo m_clipboards[kClipboardEnd];
2001-10-06 18:13:28 +04:00
};
#endif