summaryrefslogtreecommitdiffstats
path: root/src/client/connectwindow/connectwindow.h
blob: af45db610871d4e73e8e7710922a7c3bd54c5d5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
 # Copyright (c) 2013 - OpenSLX Project, Computer Center University of
 # Freiburg
 #
 # This program is free software distributed under the GPL version 2.
 # See http://openslx.org/COPYING
 #
 # If you have any feedback please consult http://openslx.org/feedback and
 # send your suggestions, praise, or complaints to feedback@openslx.org
 #
 # General information about OpenSLX can be found at http://openslx.org/
 # ---------------------------------------------------------------------
 # - Allow user to connect/disconnect to/from server
 */

#ifndef PVSCONNECTWINDOW_H_
#define PVSCONNECTWINDOW_H_

#include <QtWidgets>
#include <QMap>
#include <QUdpSocket>
#include <QSslSocket>
#include "../../shared/networkmessage.h"
#include "../net/serverdiscovery.h"
#include "../util/room.h"

namespace Ui
{
class ConnectWindow;
}
class ServerConnection;

/**
 * Class for handling the client connection.
 * Display toolbar with menu bar for connect or disconnect to pvs manager and
 * show current connection status.
 * For connecting with manager, user is able to set sessionName. If connection works
 * correctly flashy green checkmark is shown.
 */
class ConnectWindow : public QWidget
{
	Q_OBJECT

public:
	enum ConnectionState {
		Idle,
		Scanning,
		Connecting,
		AwaitingChallenge,
		AwaitingChallengeResponse,
		LoggingIn,
		InvalidSslHash, // Hash of challenge inside SSL connection invalid
		InvalidCert,
		Connected
	};

	explicit ConnectWindow(QWidget *parent = nullptr);
	virtual ~ConnectWindow();

	void connectToSession(const QByteArray sessionName, QString mgrIP);
	void setAvailableRooms(QList<Room> m);

private:
	Ui::ConnectWindow *_ui;
	int               _hashSslErrorCount;
	ServerDiscovery   _serverDiscovery;
	ServerConnection* _pendingConnection;
	ConnectionState   _state;
	QByteArray        _currentSession;
	QString           _currentIp;
	QString           _defaultSessionName;
	NetworkMessage    _packet;
	bool              _tryReconnect;
	int               _timerHide;

	void updateUserInterface();

protected:
	void timerEvent(QTimerEvent* event);
	void closeEvent(QCloseEvent *e);
	void showEvent(QShowEvent* event);

protected slots:
	void doShow();
	void onBtnConnection();
	void onBtnCancel();

	void onRoomSelection(int index);

	void onConnectionStateChange(ConnectWindow::ConnectionState state);
	void onConnectionClosed(QObject* connection);
	void onConnectionDisconnected(ServerConnection* connection);
	//	void onUdpReadyRead();
	void onServerDetected(const QString& host, const quint16 port, const QByteArray& sessionName, const QByteArray& certHash, bool autoConnect);

	void onComboBox_keyPressed(QKeyEvent* e);

public slots:
	/** actually connects the connection **/
	void DoConnect();
	/** actually disconnects the connection **/
	void DoDisconnect();
signals:
	void disconnect();
	void connected(ServerConnection* connection);
};

#endif