setSocket(socket);
// handled by the base class for now; may need to rethink for protocol detection
//connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketError(QAbstractSocket::SocketError)));
- //connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
+ connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
connect(socket, SIGNAL(connected()), SLOT(onSocketConnected()));
emit statusMessage(tr("Connecting to %1...").arg(_account.accountName()));
// TODO: handle protocol detection
-// This method might go away anyway, unless we really need our own states...
-/*
void ClientAuthHandler::onSocketStateChanged(QAbstractSocket::SocketState socketState)
{
- qDebug() << Q_FUNC_INFO << socketState;
QString text;
- AuthHandler::State state = UnconnectedState;
switch(socketState) {
case QAbstractSocket::UnconnectedState:
text = tr("Disconnected");
- state = UnconnectedState;
+ // Ensure the disconnected() signal is sent even if we haven't reached the Connected state yet.
+ // The baseclass implementation will make sure to only send the signal once.
+ onSocketDisconnected();
break;
case QAbstractSocket::HostLookupState:
text = tr("Looking up %1...").arg(_account.hostName());
- state = HostLookupState;
break;
case QAbstractSocket::ConnectingState:
text = tr("Connecting to %1...").arg(_account.hostName());
- state = ConnectingState;
break;
case QAbstractSocket::ConnectedState:
text = tr("Connected to %1").arg(_account.hostName());
- state = ConnectedState;
break;
case QAbstractSocket::ClosingState:
text = tr("Disconnecting from %1...").arg(_account.hostName());
- state = ClosingState;
break;
default:
break;
}
if (!text.isEmpty()) {
- setState(state);
emit statusMessage(text);
}
}
-*/
// TODO: handle protocol detection
/*
private slots:
void onSocketConnected();
- //void onSocketStateChanged(QAbstractSocket::SocketState state);
+ void onSocketStateChanged(QAbstractSocket::SocketState state);
//void onSocketError(QAbstractSocket::SocketError);
#ifdef HAVE_SSL
void onSslSocketEncrypted();
}
-void CoreConnection::socketStateChanged(QAbstractSocket::SocketState socketState)
-{
- QString text;
-
- switch (socketState) {
- case QAbstractSocket::UnconnectedState:
- text = tr("Disconnected");
- break;
- case QAbstractSocket::HostLookupState:
- text = tr("Looking up %1...").arg(currentAccount().hostName());
- break;
- case QAbstractSocket::ConnectingState:
- text = tr("Connecting to %1...").arg(currentAccount().hostName());
- break;
- case QAbstractSocket::ConnectedState:
- text = tr("Connected to %1").arg(currentAccount().hostName());
- break;
- case QAbstractSocket::ClosingState:
- text = tr("Disconnecting from %1...").arg(currentAccount().hostName());
- break;
- default:
- break;
- }
-
- if (!text.isEmpty())
- emit progressTextChanged(text);
-
- setState(socketState);
-}
-
-
-void CoreConnection::setState(QAbstractSocket::SocketState socketState)
-{
- ConnectionState state;
-
- switch (socketState) {
- case QAbstractSocket::UnconnectedState:
- state = Disconnected;
- break;
- case QAbstractSocket::HostLookupState:
- case QAbstractSocket::ConnectingState:
- case QAbstractSocket::ConnectedState: // we'll set it to Connected in connectionReady()
- state = Connecting;
- break;
- default:
- state = Disconnected;
- }
-
- setState(state);
-}
-
-
void CoreConnection::onConnectionReady()
{
setState(Connected);
void CoreConnection::coreSocketDisconnected()
{
+ setState(Disconnected);
_wasReconnect = false;
resetConnection(_wantReconnect);
- // FIXME handle disconnects gracefully
}
emit connectionMsg(tr("Disconnected from core."));
emit encrypted(false);
+ setState(Disconnected);
// initiate if a reconnect if appropriate
CoreConnectionSettings s;
_peer = peer;
Client::instance()->signalProxy()->addPeer(peer); // sigproxy will take ownership
emit connectToInternalCore(peer);
+ setState(Connected);
return;
}
connect(_authHandler, SIGNAL(disconnected()), SLOT(coreSocketDisconnected()));
connect(_authHandler, SIGNAL(connectionReady()), SLOT(onConnectionReady()));
- connect(_authHandler, SIGNAL(socketStateChanged(QAbstractSocket::SocketState)), SLOT(socketStateChanged(QAbstractSocket::SocketState)));
connect(_authHandler, SIGNAL(socketError(QAbstractSocket::SocketError,QString)), SLOT(coreSocketError(QAbstractSocket::SocketError,QString)));
connect(_authHandler, SIGNAL(transferProgress(int,int)), SLOT(updateProgress(int,int)));
connect(_authHandler, SIGNAL(requestDisconnect(QString,bool)), SLOT(disconnectFromCore(QString,bool)));
connect(_authHandler, SIGNAL(loginSuccessful(CoreAccount)), SLOT(onLoginSuccessful(CoreAccount)));
connect(_authHandler, SIGNAL(handshakeComplete(RemotePeer*,Protocol::SessionState)), SLOT(onHandshakeComplete(RemotePeer*,Protocol::SessionState)));
+ setState(Connecting);
_authHandler->connectToCore();
}
_peer = peer;
connect(peer, SIGNAL(disconnected()), SLOT(coreSocketDisconnected()));
- connect(peer, SIGNAL(socketStateChanged(QAbstractSocket::SocketState)), SLOT(socketStateChanged(QAbstractSocket::SocketState)));
+ connect(peer, SIGNAL(statusMessage(QString)), SIGNAL(connectionMsg(QString)));
connect(peer, SIGNAL(socketError(QAbstractSocket::SocketError,QString)), SLOT(coreSocketError(QAbstractSocket::SocketError,QString)));
Client::signalProxy()->addPeer(_peer); // sigproxy takes ownership of the peer!
void connectToCurrentAccount();
void disconnectFromCore(const QString &errorString, bool wantReconnect = true);
- void socketStateChanged(QAbstractSocket::SocketState);
void coreSocketError(QAbstractSocket::SocketError error, const QString &errorString);
void coreSocketDisconnected();
void setProgressMinimum(int minimum);
void setProgressMaximum(int maximum);
- void setState(QAbstractSocket::SocketState socketState);
void setState(ConnectionState state);
void networkDetectionModeChanged(const QVariant &mode);
AuthHandler::AuthHandler(QObject *parent)
: QObject(parent),
- _state(UnconnectedState),
_socket(0),
_disconnectedSent(false)
{
}
-AuthHandler::State AuthHandler::state() const
-{
- return _state;
-}
-
-
-void AuthHandler::setState(AuthHandler::State state)
-{
- if (_state != state) {
- _state = state;
- emit stateChanged(state);
- }
-}
-
-
QTcpSocket *AuthHandler::socket() const
{
return _socket;
void AuthHandler::setSocket(QTcpSocket *socket)
{
_socket = socket;
- connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SIGNAL(socketStateChanged(QAbstractSocket::SocketState)));
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketError(QAbstractSocket::SocketError)));
connect(socket, SIGNAL(disconnected()), SLOT(onSocketDisconnected()));
}
Q_OBJECT
public:
- enum State {
- UnconnectedState,
- HostLookupState,
- ConnectingState,
- ConnectedState,
- RetryWithLegacyState,
- AuthenticatingState,
- AuthenticatedState,
- ClosingState
- };
-
AuthHandler(QObject *parent = 0);
- State state() const;
QTcpSocket *socket() const;
virtual void handle(const Protocol::RegisterClient &) { invalidMessage(); }
void close();
signals:
- void stateChanged(State state);
void disconnected();
-
- void socketStateChanged(QAbstractSocket::SocketState state);
void socketError(QAbstractSocket::SocketError error, const QString &errorString);
protected:
void setSocket(QTcpSocket *socket);
- void setState(State state);
-private slots:
+protected slots:
void onSocketError(QAbstractSocket::SocketError error);
void onSocketDisconnected();
private:
void invalidMessage();
- State _state;
QTcpSocket *_socket; // FIXME: should be a QSharedPointer? -> premature disconnect before the peer has taken over
bool _disconnectedSent;
};
{
socket->setParent(this);
connect(socket, SIGNAL(disconnected()), SIGNAL(disconnected()));
- connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SIGNAL(socketStateChanged(QAbstractSocket::SocketState)));
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketError(QAbstractSocket::SocketError)));
#ifdef HAVE_SSL
}
+void RemotePeer::onSocketStateChanged(QAbstractSocket::SocketState state)
+{
+ if (state == QAbstractSocket::ClosingState) {
+ emit statusMessage(tr("Disconnecting..."));
+ }
+}
+
+
void RemotePeer::onSocketError(QAbstractSocket::SocketError error)
{
emit socketError(error, socket()->errorString());
signals:
void transferProgress(int current, int max);
- void socketStateChanged(QAbstractSocket::SocketState socketState);
void socketError(QAbstractSocket::SocketError error, const QString &errorString);
+ void statusMessage(const QString &msg);
protected:
SignalProxy *signalProxy() const;
private slots:
void sendHeartBeat();
void changeHeartBeatInterval(int secs);
+ void onSocketStateChanged(QAbstractSocket::SocketState state);
void onSocketError(QAbstractSocket::SocketError error);
private: