/***************************************************************************
- * Copyright (C) 2005-2013 by the Quassel Project *
+ * Copyright (C) 2005-2019 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-#ifndef CORECONNECTION_H_
-#define CORECONNECTION_H_
+#pragma once
-// TODO: support system application proxy (new in Qt 4.6)
+#include "client-export.h"
-#include "QPointer"
-#include "QTimer"
+#include <QNetworkConfigurationManager>
+#include <QPointer>
+#include <QTimer>
#ifdef HAVE_SSL
-# include <QSslSocket>
+# include <QSslSocket>
#else
-# include <QTcpSocket>
-#endif
-
-#ifdef HAVE_KDE
-# include <Solid/Networking>
+# include <QTcpSocket>
#endif
#include "coreaccount.h"
#include "remotepeer.h"
#include "types.h"
+class ClientAuthHandler;
class CoreAccountModel;
class InternalPeer;
class Network;
+class Peer;
class SignalProxy;
-class CoreConnection : public QObject
+class CLIENT_EXPORT CoreConnection : public QObject
{
Q_OBJECT
public:
- enum ConnectionState {
+ enum ConnectionState
+ {
Disconnected,
Connecting,
Connected,
Synchronized
};
- CoreConnection(CoreAccountModel *model, QObject *parent = 0);
+ CoreConnection(QObject* parent = nullptr);
void init();
//! Check if we consider the last connect as reconnect
bool wasReconnect() const { return _wasReconnect; }
-#ifdef HAVE_SSL
- const QSslSocket *sslSocket() const;
-#endif
+ QPointer<Peer> peer() const;
public slots:
bool connectToCore(AccountId = 0);
void reconnectToCore();
void disconnectFromCore();
+ void internalSessionStateReceived(const Protocol::SessionState& sessionState);
+
+ void setupCore(const Protocol::SetupData& setupData);
signals:
void stateChanged(CoreConnection::ConnectionState);
void synchronized();
void lagUpdated(int msecs);
- void connectionError(const QString &errorMsg);
- void connectionErrorPopup(const QString &errorMsg);
- void connectionWarnings(const QStringList &warnings);
- void connectionMsg(const QString &msg);
+ void connectionError(const QString& errorMsg);
+ void connectionErrorPopup(const QString& errorMsg);
+ void connectionMsg(const QString& msg);
void disconnected();
void progressRangeChanged(int minimum, int maximum);
void progressValueChanged(int value);
- void progressTextChanged(const QString &);
+ void progressTextChanged(const QString&);
- void startCoreSetup(const QVariantList &);
+ void startCoreSetup(const QVariantList& backendInfo, const QVariantList& authenticatorInfo);
void coreSetupSuccess();
- void coreSetupFailed(const QString &error);
+ void coreSetupFailed(const QString& error);
- void startInternalCore();
- void connectToInternalCore(InternalPeer *connection);
+ void connectToInternalCore(QPointer<InternalPeer> connection);
// These signals MUST be handled synchronously!
- void userAuthenticationRequired(CoreAccount *, bool *valid, const QString &errorMessage = QString());
- void handleNoSslInClient(bool *accepted);
- void handleNoSslInCore(bool *accepted);
+ void userAuthenticationRequired(CoreAccount*, bool* valid, const QString& errorMessage = QString());
+ void handleNoSslInClient(bool* accepted);
+ void handleNoSslInCore(bool* accepted);
#ifdef HAVE_SSL
- void handleSslErrors(const QSslSocket *socket, bool *accepted, bool *permanently);
+ void handleSslErrors(const QSslSocket* socket, bool* accepted, bool* permanently);
#endif
private slots:
void connectToCurrentAccount();
- void disconnectFromCore(const QString &errorString, bool wantReconnect = true);
+ void disconnectFromCore(const QString& errorString, bool wantReconnect = true);
- void socketStateChanged(QAbstractSocket::SocketState);
- void coreSocketError(QAbstractSocket::SocketError);
- void coreHasData(const QVariant &item);
- void coreSocketConnected();
+ void coreSocketError(QAbstractSocket::SocketError error, const QString& errorString);
void coreSocketDisconnected();
- void clientInitAck(const QVariantMap &msg);
-
// for sync progress
void networkInitDone();
void checkSyncState();
- void syncToCore(const QVariantMap &sessionState);
- void internalSessionStateReceived(const QVariant &packedState);
- void sessionStateReceived(const QVariantMap &state);
+ void loginToCore(const QString& user, const QString& password, bool remember); // for config wizard
+ void syncToCore(const Protocol::SessionState& sessionState);
void resetConnection(bool wantReconnect = false);
- void connectionReady();
-
- void loginToCore(const QString &user, const QString &password, bool remember); // for config wizard
- void loginToCore(const QString &previousError = QString());
- void loginSuccess();
- void loginFailed(const QString &errorMessage);
- void doCoreSetup(const QVariant &setupData);
+ void onConnectionReady();
+ void onLoginSuccessful(const CoreAccount& account);
+ void onHandshakeComplete(RemotePeer* peer, const Protocol::SessionState& sessionState);
void updateProgress(int value, int maximum);
- void setProgressText(const QString &text);
+ void setProgressText(const QString& text);
void setProgressValue(int value);
void setProgressMinimum(int minimum);
void setProgressMaximum(int maximum);
- void setState(QAbstractSocket::SocketState socketState);
void setState(ConnectionState state);
-#ifdef HAVE_SSL
- void sslSocketEncrypted();
- void sslErrors();
-#endif
-
- void networkDetectionModeChanged(const QVariant &mode);
- void pingTimeoutIntervalChanged(const QVariant &interval);
- void reconnectIntervalChanged(const QVariant &interval);
+ void networkDetectionModeChanged(const QVariant& mode);
+ void pingTimeoutIntervalChanged(const QVariant& interval);
+ void reconnectIntervalChanged(const QVariant& interval);
void reconnectTimeout();
-#ifdef HAVE_KDE
- void solidNetworkStatusChanged(Solid::Networking::Status status);
-#endif
+ void onlineStateChanged(bool isOnline);
private:
- CoreAccountModel *_model;
- CoreAccount _account;
- QVariantMap _coreMsgBuffer;
-
- QPointer<QTcpSocket> _socket;
- QPointer<SignalProxy::AbstractPeer> _peer;
- ConnectionState _state;
+ QPointer<ClientAuthHandler> _authHandler;
+ QPointer<Peer> _peer;
+ ConnectionState _state{Disconnected};
QTimer _reconnectTimer;
- bool _wantReconnect;
+ bool _wantReconnect{false};
+ bool _wasReconnect{false};
- QSet<QObject *> _netsToSync;
+ QSet<QObject*> _netsToSync;
int _numNetsToSync;
- int _progressMinimum, _progressMaximum, _progressValue;
+ int _progressMinimum{0}, _progressMaximum{-1}, _progressValue{-1};
QString _progressText;
- QString _coreInfoString(const QVariantMap &);
- bool _wasReconnect;
- bool _requestedDisconnect;
- bool _resetting;
+ bool _resetting{false};
+
+ CoreAccount _account;
+ CoreAccountModel* accountModel() const;
- inline CoreAccountModel *accountModel() const;
+ QPointer<QNetworkConfigurationManager> _qNetworkConfigurationManager;
friend class CoreConfigWizard;
};
-
Q_DECLARE_METATYPE(CoreConnection::ConnectionState)
// Inlines
-inline int CoreConnection::progressMinimum() const { return _progressMinimum; }
-inline int CoreConnection::progressMaximum() const { return _progressMaximum; }
-inline int CoreConnection::progressValue() const { return _progressValue; }
-inline QString CoreConnection::progressText() const { return _progressText; }
-
-inline CoreConnection::ConnectionState CoreConnection::state() const { return _state; }
-inline bool CoreConnection::isConnected() const { return state() >= Connected; }
-inline CoreAccount CoreConnection::currentAccount() const { return _account; }
-inline CoreAccountModel *CoreConnection::accountModel() const { return _model; }
-
-#ifdef HAVE_SSL
-inline const QSslSocket *CoreConnection::sslSocket() const { return qobject_cast<QSslSocket *>(_socket); }
-#endif
+inline int CoreConnection::progressMinimum() const
+{
+ return _progressMinimum;
+}
+inline int CoreConnection::progressMaximum() const
+{
+ return _progressMaximum;
+}
+inline int CoreConnection::progressValue() const
+{
+ return _progressValue;
+}
+inline QString CoreConnection::progressText() const
+{
+ return _progressText;
+}
-#endif
+inline CoreConnection::ConnectionState CoreConnection::state() const
+{
+ return _state;
+}
+inline bool CoreConnection::isConnected() const
+{
+ return state() >= Connected;
+}
+inline CoreAccount CoreConnection::currentAccount() const
+{
+ return _account;
+}