barrier/CServer.h

104 lines
2.5 KiB
C++

#ifndef CSERVER_H
#define CSERVER_H
#include "IServer.h"
#include "BasicTypes.h"
#include "CString.h"
#include <map>
#include <set>
class CEvent;
class CEventKey;
class IScreen;
class ISocket;
class CServer : public IServer {
public:
enum EDirection { kLeft, kRight, kTop, kBottom,
kFirstDirection = kLeft, kLastDirection = kBottom };
CServer();
virtual ~CServer();
// manipulators
// set the server's interface and port to listen for remote screens
void setListenPort(const CString& hostname, UInt16 port);
// add local screen
void addLocalScreen(IScreen*);
// add a remote screen
void addRemoteScreen(const CString& name);
// remove a local or remote screen. neighbors on opposite sides
// of this screen are made neighbors of each other.
void removeScreen(const CString& name);
// connect/disconnect screen edges
void connectEdge(const CString& src, EDirection srcSide,
const CString& dst);
void disconnectEdge(const CString& src, EDirection srcSide);
// accessors
// IServer overrides
virtual void run();
virtual void onClipboardChanged(IScreen*);
virtual void setActiveScreen(IScreen*);
virtual IScreen* getActiveScreen() const;
protected:
virtual void relayEvent(const CEvent* event);
virtual bool onCommandKey(const CEventKey* keyEvent);
virtual void onLocalMouseMove(SInt32 x, SInt32 y);
virtual void onRemoteMouseMove(SInt32 dx, SInt32 dy);
virtual bool isLockedToScreen() const;
virtual void mapPosition(const IScreen* src, EDirection srcSide,
const IScreen* dst, SInt32& x, SInt32& y) const;
IScreen* getNeighbor(const IScreen* src, EDirection) const;
IScreen* getNeighbor(const IScreen* src, EDirection srcSide,
SInt32& x, SInt32& y) const;
void switchScreen(IScreen* screen, SInt32 x, SInt32 y);
private:
void addScreen(const CString&, IScreen*);
void newConnectionCB();
void loginCB(ISocket*);
struct ScreenCell {
public:
ScreenCell() : m_screen(NULL) { }
public:
IScreen* m_screen;
CString m_neighbor[kLastDirection - kFirstDirection + 1];
};
private:
typedef std::map<CString, ScreenCell> ScreenMap;
typedef std::set<ISocket*> SocketSet;
// main loop stuff
bool m_running;
bool m_done;
// screen tracking
IScreen* m_localScreen;
IScreen* m_activeScreen;
SInt32 m_x, m_y;
ScreenMap m_map;
// listen socket stuff
CString m_listenHost;
UInt16 m_listenPort;
ISocket* m_listenSocket;
// login sockets
SocketSet m_logins;
static const SInt32 s_zoneSize;
};
#endif