-
Notifications
You must be signed in to change notification settings - Fork 10
/
connectionManager.cpp
89 lines (80 loc) · 2.69 KB
/
connectionManager.cpp
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
/* Copyright 2017 Konstantin Batoev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file was modified by Konstantin Batoev to make it comply with the requirements of trikRuntime
* project. See git revision history for detailed changes. */
#include <QEventLoop>
#include <QNetworkProxy>
#include "connectionManager.h"
ConnectionManager::ConnectionManager(QSettings *settings, QObject *parent)
: QObject(parent)
, mSettings(settings)
{
}
ConnectionManager::~ConnectionManager()
{
reset();
}
void ConnectionManager::init()
{
mKeepaliveTimer = new QTimer(this);
mSocket = new QTcpSocket(this);
connect(mSocket, &QTcpSocket::stateChanged, this, &ConnectionManager::stateChanged);
connect(mKeepaliveTimer, &QTimer::timeout, this, [this]() { write("keepalive 4000\n"); } );
}
bool ConnectionManager::isConnected() const
{
return mSocket->state() == QTcpSocket::ConnectedState;
}
void ConnectionManager::write(const QString &data)
{
qint64 result = mSocket->write(data.toLatin1().data());
Q_EMIT dataWasWritten(static_cast<int>(result));
}
void ConnectionManager::reset()
{
mKeepaliveTimer->stop();
mSocket->disconnectFromHost();
Q_EMIT dataWasWritten(-1); // simulate disconnect
}
void ConnectionManager::reconnectToHost()
{
reset();
constexpr auto timeout = 3 * 1000;
QEventLoop loop;
QTimer::singleShot(timeout, &loop, &QEventLoop::quit);
connect(mSocket, &QTcpSocket::connected, &loop, &QEventLoop::quit);
#ifdef TRIK_USE_QT6
connect(mSocket
, static_cast<void(QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::errorOccurred)
, &loop
, [&loop](QAbstractSocket::SocketError) { loop.quit(); });
#else
connect(mSocket
, static_cast<void(QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error)
, &loop
, [&loop](QAbstractSocket::SocketError) { loop.quit(); });
#endif
mSocket->setProxy(QNetworkProxy::NoProxy);
const auto &gamepadIp = mSettings->value("gamepadIp").toString();
auto gamepadPort = static_cast<quint16>(mSettings->value("gamepadPort").toUInt());
mSocket->connectToHost(gamepadIp, gamepadPort);
loop.exec();
if (mSocket->state() == QTcpSocket::ConnectedState) {
mKeepaliveTimer->start(3000);
} else {
mSocket->abort();
Q_EMIT connectionFailed();
}
}