blob: bbd7ed04f26c7302b19f52048510f4a4c2a6a294 (
plain) (
tree)
|
|
#ifndef CLIENT_H_
#define CLIENT_H_
#include <QtCore>
#include <QSslError>
#include <QAbstractSocket>
#include <QSslSocket>
#include "../../shared/networkmessage.h"
class QSslSocket;
struct ClientLogin
{
bool accept;
QString name;
QString host;
QString ip;
};
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QSslSocket* socket);
~Client();
void requestThumb(const int width, const int height);
//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 int id() const { return _id; }
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 setTutor(bool enable);
//Send message stuff
void startVncServer();
void stopVncServer();
void startVncClient(Client const * const to );
void stopVncClient();
void lockScreen(bool);
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 _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;
bool _isProjectionSource; // 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
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_ */
|