#ifndef CLIENT_H_ #define CLIENT_H_ #include #include #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 public: enum class State { Authenticating, Idle, VncClient, VncServer, Locked }; explicit Client(QSslSocket* socket); ~Client(); // Getters inline const State state() const { return _state; } inline const bool isAuthed() const { return _authed == 2; } inline const QString& name() const { return _name; } inline const QString& host() const { return _host; } inline const QString ip() const { return _socket->peerAddress().toString(); } inline const int id() const { return _id; } inline const int desiredProjectionSource() const { return _desiredProjectionSource; } inline const int currentProjectionSource() const { return _currentProjectionSource; } // To be replaced by states inline const bool isActiveVncClient() const { return _activeVncClient; } inline const bool isActiveVncServer() const { return _vncPort > 0; } inline const bool isBroadcastSource() const { return _isBroadcastSource; } // Setters inline void setBroadcastSource(bool enable) { _isBroadcastSource = enable; } inline void setDesiredProjectionSource(int source) { _desiredProjectionSource = source; } inline void setTutor(bool enable){ _isTutor = enable; } //New ones //b void startVncServer(); //Send message stuff void startVncServer(); void stopVncServer(); void startVncClient(Client const * const to ); void stopVncClient(); void lockScreen(bool); void requestThumb(const int width, const int height); private: QSslSocket * const _socket; State _state; int _authed; // 0 = challenge sent, awaiting reply 1 = challenge ok, client challenge replied, awaiting login, 2 = ESTABLISHED QString _name; QString _host; QByteArray _challenge; qint64 _pingTimeout; NetworkMessage _fromClient; int _timerIdAuthTimeout, _timerPingTimeout; int _id; // this client's unique id int _desiredProjectionSource; bool _isBroadcastSource; // Tells whether this client is currently the VNC broadcast source. int _currentProjectionSource; QString _vncRwPass, _vncRoPass; int _vncPort; // VNCserver state. Greater 0 -> active on this port. Equals 0 -> no server. bool _activeVncClient; // Flag indicating that the client is displaying a remote screen via VNC bool _isTutor; // Flag indicating that the client has been set as a tutor static int _clientIdCounter; void handleMsg(); void sendMessage(NetworkMessage& message); protected: void timerEvent(QTimerEvent* event); 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_ */