#ifndef CLIENT_H_ #define CLIENT_H_ #include #include #include #include "../../shared/networkmessage.h" class QSslSocket; struct ClientLogin { bool accept; QString name; QString host; QString ip; }; class Client : public QObject { Q_OBJECT private: static int _clientIdCounter; QSslSocket *_socket; int _authed; // 0 = challenge sent, awaiting reply 1 = challenge ok, client challenge replied, awaiting login, 2 = ESTABLISHED QString _name; QString _host; QString _ip; QByteArray _challenge; qint64 _pingTimeout; NetworkMessage _toClient, _fromClient; int _timerIdAuthTimeout, _timerDelete, _timerPingTimeout; int _id; // this client's unique id // If this client should be projected to from another client, the other client's id is set here. 0 otherwise. // This is not currently used and it is questionable if this makes sense, as it might just be confusing if // several groups students watch different other students. // Also, visualizing such a situation in the GUI in a meaningful way would be hard. int _desiredProjectionSource; // This boolean tells whether this client is currently the VNC broadcast source. This // version only allows "one to all others" setups bool _isProjectionSource; int _currentProjectionSource; QString _vncRwPass, _vncRoPass; int _vncPort; bool _activeVncClient; bool _isTutor; void handleMsg(); protected: void timerEvent(QTimerEvent* event); public: explicit Client(QSslSocket* socket); ~Client(); void requestThumb(const int width, const int height); void sendMessage(NetworkMessage& message); //void acceptData(); const inline bool isAuthed() const { return _authed == 2; } const inline QString& name() const { return _name; } const inline QString& host() const { return _host; } const inline QString& ip() const { return _ip; } // The computer ID (used eg. for saving the frame positions) is currently the IP, but this is an extra method for easier modification later on const inline QString& computerId() const { return _ip; } const inline int id() const { return _id; } inline const QString& vncRwPass() const { return _vncRwPass; } inline const QString& vncRoPass() const { return _vncRoPass; } inline const int vncPort() const { return _vncPort; } inline const bool isActiveVncClient() const { return _activeVncClient; } inline const bool isActiveVncServer() const { return _vncPort > 0; } inline const int desiredProjectionSource() const { return _desiredProjectionSource; } inline void setDesiredProjectionSource(int source) { _desiredProjectionSource = source; } inline const bool isProjectionSource() const { return _isProjectionSource; } inline void setProjectionSource(bool enable) { _isProjectionSource = enable; } inline const int currentProjectionSource() const { return _currentProjectionSource; } void startVncServer(); void stopVncServer(); void stopVncClient(); void setTutor(bool enable); signals: void authenticating(Client* client, ClientLogin* request); void authenticated(Client* client); void thumbUpdated(Client* client, const QPixmap& thumb); void vncServerStateChange(Client* client); void vncClientStateChange(Client* client, int lastProjectionSource); void disconnected(); private slots: void onDataArrival(); // triggered if data is available for reading void disconnect(); }; #endif /* CLIENT_H_ */