/***************************************************************************
- * Copyright (C) 2009 by the Quassel Project *
+ * Copyright (C) 2005-2018 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 "QPointer"
-#include "QTimer"
+#include <QNetworkConfigurationManager>
+#include <QPointer>
+#include <QTimer>
#ifdef HAVE_SSL
# include <QSslSocket>
# include <QTcpSocket>
#endif
-#ifdef HAVE_KDE
-# include <Solid/Networking>
-#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
Synchronized
};
- CoreConnection(CoreAccountModel *model, QObject *parent = 0);
+ CoreConnection(QObject *parent = 0);
void init();
- inline bool isConnected() const;
- inline ConnectionState state() const;
- inline CoreAccount currentAccount() const;
+ bool isConnected() const;
+ ConnectionState state() const;
+ CoreAccount currentAccount() const;
bool isEncrypted() const;
bool isLocalConnection() const;
- inline int progressMinimum() const;
- inline int progressMaximum() const;
- inline int progressValue() const;
- inline QString progressText() const;
+ int progressMinimum() const;
+ int progressMaximum() const;
+ int progressValue() const;
+ QString progressText() const;
//! Check if we consider the last connect as reconnect
- inline bool wasReconnect() const { return _wasReconnect; }
+ bool wasReconnect() const { return _wasReconnect; }
-#ifdef HAVE_SSL
- inline const QSslSocket *sslSocket() const;
-#endif
+ QPointer<Peer> peer() const;
public slots:
bool connectToCore(AccountId = 0);
void reconnectToCore();
void disconnectFromCore();
+ void setupCore(const Protocol::SetupData &setupData);
+
signals:
void stateChanged(CoreConnection::ConnectionState);
void encrypted(bool isEncrypted = true);
void connectionError(const QString &errorMsg);
void connectionErrorPopup(const QString &errorMsg);
- void connectionWarnings(const QStringList &warnings);
void connectionMsg(const QString &msg);
void disconnected();
void progressValueChanged(int value);
void progressTextChanged(const QString &);
- void startCoreSetup(const QVariantList &);
+ void startCoreSetup(const QVariantList &backendInfo, const QVariantList &authenticatorInfo);
void coreSetupSuccess();
void coreSetupFailed(const QString &error);
- void startInternalCore();
- void connectToInternalCore(SignalProxy *proxy);
+ void connectToInternalCore(QPointer<InternalPeer> connection);
// These signals MUST be handled synchronously!
void userAuthenticationRequired(CoreAccount *, bool *valid, const QString &errorMessage = QString());
void connectToCurrentAccount();
void disconnectFromCore(const QString &errorString, bool wantReconnect = true);
- void socketStateChanged(QAbstractSocket::SocketState);
- void coreSocketError(QAbstractSocket::SocketError);
- void coreHasData();
- 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 internalSessionStateReceived(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 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 reconnectTimeout();
-#ifdef HAVE_KDE
- void solidNetworkStatusChanged(Solid::Networking::Status status);
-#endif
+ void onlineStateChanged(bool isOnline);
private:
- CoreAccountModel *_model;
- CoreAccount _account;
- QVariantMap _coreMsgBuffer;
-
- QPointer<QAbstractSocket> _socket;
- quint32 _blockSize;
+ QPointer<ClientAuthHandler> _authHandler;
+ QPointer<Peer> _peer;
ConnectionState _state;
QTimer _reconnectTimer;
bool _wantReconnect;
+ bool _wasReconnect;
QSet<QObject *> _netsToSync;
int _numNetsToSync;
int _progressMinimum, _progressMaximum, _progressValue;
QString _progressText;
- QString _coreInfoString(const QVariantMap &);
- bool _wasReconnect;
- bool _requestedDisconnect;
+ bool _resetting;
+
+ CoreAccount _account;
+ CoreAccountModel *accountModel() const;
- inline 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; }
-
-#ifdef HAVE_SSL
-const QSslSocket *CoreConnection::sslSocket() const { return qobject_cast<QSslSocket *>(_socket); }
-#endif
-
-#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; }