summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorsr2013-02-06 19:21:04 +0100
committersr2013-02-06 19:21:04 +0100
commit49f3903f316ab7363b4543615d3231e1407a67ab (patch)
tree9f6ec082403f388c0e791de68b1743000a12bc49 /src/server
parent... (diff)
downloadpvs2-49f3903f316ab7363b4543615d3231e1407a67ab.tar.gz
pvs2-49f3903f316ab7363b4543615d3231e1407a67ab.tar.xz
pvs2-49f3903f316ab7363b4543615d3231e1407a67ab.zip
[SERVER] Add "stop projection" button
[SERVER] Don't show error message when VNC server stops as expected [SERVER/CLIENT] Implement connection timeout of 15 seconds
Diffstat (limited to 'src/server')
-rw-r--r--src/server/mainwindow/mainwindow.cpp21
-rw-r--r--src/server/mainwindow/mainwindow.h1
-rw-r--r--src/server/net/client.cpp16
-rw-r--r--src/server/net/client.h2
4 files changed, 35 insertions, 5 deletions
diff --git a/src/server/mainwindow/mainwindow.cpp b/src/server/mainwindow/mainwindow.cpp
index 710da3f..74e1e7d 100644
--- a/src/server/mainwindow/mainwindow.cpp
+++ b/src/server/mainwindow/mainwindow.cpp
@@ -65,6 +65,7 @@ MainWindow::MainWindow(QWidget* parent) :
connect(ui->action_TutorToAll, SIGNAL(triggered()), this, SLOT(onButtonTutorToAll()));
connect(ui->action_StudentToTutor, SIGNAL(triggered()), this, SLOT(onButtonStudentToTutor()));
connect(ui->action_TutorToStudent, SIGNAL(triggered()), this, SLOT(onButtonTutorToStudent()));
+ connect(ui->action_StopProjection, SIGNAL(triggered()), this, SLOT(onButtonStopProjection()));
connect(ui->action_Lock, SIGNAL(toggled(bool)), this, SLOT(onButtonLock(bool)));
// Clicking the session name label shows the edit field for it
connect(_sessionNameLabel, SIGNAL(clicked()), this, SLOT(onSessionNameClick()));
@@ -565,6 +566,24 @@ void MainWindow::onButtonTutorToStudent()
prepareForProjection(from, to);
}
+void MainWindow::onButtonStopProjection()
+{
+ const qint64 now = QDateTime::currentMSecsSinceEpoch();
+ if (now < _buttonBlockTime)
+ return;
+ _buttonBlockTime = now + 3000;
+ //
+ NetworkMessage msg;
+ msg.setField(_ID, _VNCCLIENT);
+ for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
+ {
+ Client *c = (**it).client();
+ if (c == NULL)
+ continue;
+ c->sendMessage(msg);
+ }
+}
+
void MainWindow::onButtonLock(bool checked)
{
NetworkMessage msg;
@@ -769,7 +788,7 @@ void MainWindow::onVncServerStateChange(Client* client)
c->setDesiredProjectionSource(0);
}
}
- if (wasInterested)
+ if (wasInterested && QDateTime::currentMSecsSinceEpoch() < _buttonBlockTime)
{
QMessageBox::information(this,
tr("Projection Error"),
diff --git a/src/server/mainwindow/mainwindow.h b/src/server/mainwindow/mainwindow.h
index 0cc6abc..9b6c6d3 100644
--- a/src/server/mainwindow/mainwindow.h
+++ b/src/server/mainwindow/mainwindow.h
@@ -62,6 +62,7 @@ protected slots:
void onButtonStudentToTutor();
void onButtonTutorToAll();
void onButtonTutorToStudent();
+ void onButtonStopProjection();
void onButtonLock(bool checked);
void onButtonExit();
// connection frame
diff --git a/src/server/net/client.cpp b/src/server/net/client.cpp
index d6002a6..3adeeaa 100644
--- a/src/server/net/client.cpp
+++ b/src/server/net/client.cpp
@@ -24,7 +24,6 @@ Client::Client(QSslSocket* socket) :
{
assert(socket != NULL);
_id = ++_clientIdCounter;
- _pingTimeout = QDateTime::currentMSecsSinceEpoch() + PING_TIMEOUT_MS;
_ip = _socket->peerAddress().toString();
qDebug("*** Client %s created.", qPrintable(_ip));
// Connect important signals
@@ -42,6 +41,8 @@ Client::Client(QSslSocket* socket) :
_toClient.writeMessage(_socket);
// give client 3 seconds to complete handshake
_timerIdAuthTimeout = startTimer(3000);
+ _timerPingTimeout = startTimer(5000);
+ _pingTimeout = QDateTime::currentMSecsSinceEpoch() + PING_TIMEOUT_MS;
}
Client::~Client()
@@ -56,7 +57,16 @@ Client::~Client()
void Client::timerEvent(QTimerEvent* event)
{
- if (event->timerId() == _timerIdAuthTimeout)
+ if (event->timerId() == _timerPingTimeout)
+ {
+ if (_pingTimeout < QDateTime::currentMSecsSinceEpoch())
+ {
+ qDebug() << "Client" << _ip << "has a ping timeout.";
+ killTimer(_timerPingTimeout);
+ this->disconnect();
+ }
+ }
+ else if (event->timerId() == _timerIdAuthTimeout)
{
// Client did not send login request within 3 seconds
killTimer(_timerIdAuthTimeout);
@@ -108,7 +118,6 @@ void Client::requestThumb(const int width, const int height)
void Client::onDataArrival()
{
- _pingTimeout = QDateTime::currentMSecsSinceEpoch() + PING_TIMEOUT_MS;
//
if (_socket == NULL || _socket->state() != QAbstractSocket::ConnectedState)
{
@@ -153,6 +162,7 @@ void Client::onError(QAbstractSocket::SocketError errcode)
void Client::handleMsg()
{
+ _pingTimeout = QDateTime::currentMSecsSinceEpoch() + PING_TIMEOUT_MS;
const QString &id = _fromClient.getFieldString(_ID);
if (id.isEmpty())
{
diff --git a/src/server/net/client.h b/src/server/net/client.h
index ce17c18..32ce69f 100644
--- a/src/server/net/client.h
+++ b/src/server/net/client.h
@@ -31,7 +31,7 @@ private:
QByteArray _challenge;
qint64 _pingTimeout;
NetworkMessage _toClient, _fromClient;
- int _timerIdAuthTimeout, _timerDelete;
+ int _timerIdAuthTimeout, _timerDelete, _timerPingTimeout;
int _id; // this client's unique id