/***************************************************************************
- * Copyright (C) 2009 by the Quassel Project *
+ * Copyright (C) 2005-2020 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ * 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"
-
-#ifdef HAVE_SSL
-# include <QSslSocket>
-#else
-# include <QTcpSocket>
-#endif
+#include <QNetworkConfigurationManager>
+#include <QPointer>
+#include <QSslSocket>
+#include <QTimer>
#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 {
- Q_OBJECT
+class CLIENT_EXPORT CoreConnection : public QObject
+{
+ Q_OBJECT
public:
- enum ConnectionState {
- Disconnected,
- Connecting,
- Connected,
- Synchronizing,
- Synchronized
- };
+ enum ConnectionState
+ {
+ Disconnected,
+ Connecting,
+ Connected,
+ Synchronizing,
+ Synchronized
+ };
+
+ CoreConnection(QObject* parent = nullptr);
+
+ void init();
- CoreConnection(CoreAccountModel *model, QObject *parent = 0);
+ bool isConnected() const;
+ ConnectionState state() const;
+ CoreAccount currentAccount() const;
- void init();
+ bool isEncrypted() const;
+ bool isLocalConnection() const;
- inline ConnectionState state() const;
- inline bool isConnected() const;
- inline CoreAccount currentAccount() const;
+ int progressMinimum() const;
+ int progressMaximum() const;
+ int progressValue() const;
+ QString progressText() const;
- inline int progressMinimum() const;
- inline int progressMaximum() const;
- inline int progressValue() const;
- inline QString progressText() const;
+ //! Check if we consider the last connect as reconnect
+ bool wasReconnect() const { return _wasReconnect; }
+
+ QPointer<Peer> peer() const;
public slots:
- bool connectToCore(AccountId = 0);
- void reconnectToCore();
- void disconnectFromCore();
+ bool connectToCore(AccountId = 0);
+ void reconnectToCore();
+ void disconnectFromCore();
+ void internalSessionStateReceived(const Protocol::SessionState& sessionState);
-// void useInternalCore();
+ void setupCore(const Protocol::SetupData& setupData);
signals:
- void stateChanged(CoreConnection::ConnectionState);
- void synchronized();
+ void stateChanged(CoreConnection::ConnectionState);
+ void encrypted(bool isEncrypted = true);
+ void synchronized();
+ void lagUpdated(int msecs);
- void connectionError(const QString &errorMsg);
- void connectionWarnings(const QStringList &warnings);
- void connectionMsg(const QString &msg);
- void disconnected();
+ 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 progressRangeChanged(int minimum, int maximum);
+ void progressValueChanged(int value);
+ void progressTextChanged(const QString&);
- void startCoreSetup(const QVariantList &);
- void startInternalCore();
- void connectToInternalCore(SignalProxy *proxy);
+ void startCoreSetup(const QVariantList& backendInfo, const QVariantList& authenticatorInfo);
+ void coreSetupSuccess();
+ void coreSetupFailed(const QString& error);
- // This signal MUST be handled synchronously!
- void userAuthenticationRequired(CoreAccount *, bool *valid, const QString &errorMessage = QString());
+ void connectToInternalCore(QPointer<InternalPeer> connection);
- void handleIgnoreWarnings(bool permanently);
+ // These signals MUST be handled synchronously!
+ void userAuthenticationRequired(CoreAccount*, bool* valid, const QString& errorMessage = QString());
+ void handleNoSslInClient(bool* accepted);
+ void handleNoSslInCore(bool* accepted);
+ void handleSslErrors(const QSslSocket* socket, bool* accepted, bool* permanently);
private slots:
- void connectToCurrentAccount();
+ void connectToCurrentAccount();
+ void disconnectFromCore(const QString& errorString, bool wantReconnect = true);
+
+ void coreSocketError(QAbstractSocket::SocketError error, const QString& errorString);
+ void coreSocketDisconnected();
- void socketStateChanged(QAbstractSocket::SocketState);
- void coreSocketError(QAbstractSocket::SocketError);
- void coreHasData();
- void coreSocketConnected();
- void coreSocketDisconnected();
+ // for sync progress
+ void networkInitDone();
+ void checkSyncState();
- void clientInitAck(const QVariantMap &msg);
+ void loginToCore(const QString& user, const QString& password, bool remember); // for config wizard
+ void syncToCore(const Protocol::SessionState& sessionState);
- // for sync progress
- void networkInitDone();
- void checkSyncState();
+ void resetConnection(bool wantReconnect = false);
- void syncToCore(const QVariantMap &sessionState);
- void internalSessionStateReceived(const QVariant &packedState);
- void sessionStateReceived(const QVariantMap &state);
+ void onConnectionReady();
+ void onLoginSuccessful(const CoreAccount& account);
+ void onHandshakeComplete(RemotePeer* peer, const Protocol::SessionState& sessionState);
- void setWarningsHandler(const char *slot);
- void resetWarningsHandler();
- void resetConnection();
- void connectionReady();
- //void doCoreSetup(const QVariant &setupData);
+ void updateProgress(int value, int maximum);
+ void setProgressText(const QString& text);
+ void setProgressValue(int value);
+ void setProgressMinimum(int minimum);
+ void setProgressMaximum(int maximum);
- void loginToCore(const QString &previousError = QString());
- void loginSuccess();
- void loginFailed(const QString &errorMessage);
+ void setState(ConnectionState state);
- void updateProgress(int value, int maximum);
- void setProgressText(const QString &text);
- void setProgressValue(int value);
- void setProgressMinimum(int minimum);
- void setProgressMaximum(int maximum);
+ void networkDetectionModeChanged(const QVariant& mode);
+ void pingTimeoutIntervalChanged(const QVariant& interval);
+ void reconnectIntervalChanged(const QVariant& interval);
+ void reconnectTimeout();
- void setState(QAbstractSocket::SocketState socketState);
- void setState(ConnectionState state);
+ void onlineStateChanged(bool isOnline);
private:
- CoreAccountModel *_model;
- CoreAccount _account;
- QVariantMap _coreMsgBuffer;
+ QPointer<ClientAuthHandler> _authHandler;
+ QPointer<Peer> _peer;
+ ConnectionState _state{Disconnected};
- QPointer<QIODevice> _socket;
- quint32 _blockSize;
- ConnectionState _state;
+ QTimer _reconnectTimer;
+ bool _wantReconnect{false};
+ bool _wasReconnect{false};
- QSet<Network *> _netsToSync;
- int _numNetsToSync;
- int _progressMinimum, _progressMaximum, _progressValue;
- QString _progressText;
+ QSet<QObject*> _netsToSync;
+ int _numNetsToSync;
+ int _progressMinimum{0}, _progressMaximum{-1}, _progressValue{-1};
+ QString _progressText;
- QString _coreInfoString(const QVariantMap &);
+ bool _resetting{false};
- inline CoreAccountModel *accountModel() const;
+ CoreAccount _account;
+ CoreAccountModel* accountModel() const;
+
+ QPointer<QNetworkConfigurationManager> _qNetworkConfigurationManager;
+
+ friend class CoreConfigWizard;
};
Q_DECLARE_METATYPE(CoreConnection::ConnectionState)
// Inlines
-int CoreConnection::progressMinimum() const { return _progressMinimum; }
-int CoreConnection::progressMaximum() const { return _progressMaximum; }
-int CoreConnection::progressValue() const { return _progressValue; }
-QString CoreConnection::progressText() const { return _progressText; }
-
-CoreConnection::ConnectionState CoreConnection::state() const { return _state; }
-bool CoreConnection::isConnected() const { return state() >= Connected; }
-CoreAccount CoreConnection::currentAccount() const { return _account; }
-CoreAccountModel *CoreConnection::accountModel() const { return _model; }
-
-#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;
+}
+
+inline CoreConnection::ConnectionState CoreConnection::state() const
+{
+ return _state;
+}
+inline bool CoreConnection::isConnected() const
+{
+ return state() >= Connected;
+}
+inline CoreAccount CoreConnection::currentAccount() const
+{
+ return _account;
+}