X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fremotepeer.cpp;h=f2439fc2548df1ea9c4452510969421919fa1133;hp=e33f56a9ebd3a69c7a4276b5446bf5b482f15331;hb=676141b18a54c4aa34d4831b9d054d8d63ba21b1;hpb=9fc57dc2c000e80fb8bd746a090e2e8210e1278e diff --git a/src/common/remotepeer.cpp b/src/common/remotepeer.cpp index e33f56a9..f2439fc2 100644 --- a/src/common/remotepeer.cpp +++ b/src/common/remotepeer.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2014 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -23,14 +23,16 @@ #ifdef HAVE_SSL # include +#else +# include #endif #include "remotepeer.h" using namespace Protocol; -RemotePeer::RemotePeer(QTcpSocket *socket, QObject *parent) - : SignalProxy::AbstractPeer(parent), +RemotePeer::RemotePeer(::AuthHandler *authHandler, QTcpSocket *socket, QObject *parent) + : Peer(authHandler, parent), _socket(socket), _signalProxy(0), _heartBeatTimer(new QTimer(this)), @@ -38,8 +40,10 @@ RemotePeer::RemotePeer(QTcpSocket *socket, QObject *parent) _lag(0) { socket->setParent(this); + connect(socket, SIGNAL(readyRead()), SLOT(onSocketDataAvailable())); + connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SLOT(onSocketStateChanged(QAbstractSocket::SocketState))); + connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), SIGNAL(disconnected())); - connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SIGNAL(error(QAbstractSocket::SocketError))); #ifdef HAVE_SSL QSslSocket *sslSocket = qobject_cast(socket); @@ -48,6 +52,25 @@ RemotePeer::RemotePeer(QTcpSocket *socket, QObject *parent) #endif connect(_heartBeatTimer, SIGNAL(timeout()), SLOT(sendHeartBeat())); + + // It's possible that more data has already arrived during the handshake, so readyRead() wouldn't be triggered. + // However, we can't call a virtual function from the ctor, so let's do it asynchronously. + if (socket->bytesAvailable()) + QTimer::singleShot(0, this, SLOT(onSocketDataAvailable())); +} + + +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()); } @@ -159,17 +182,17 @@ void RemotePeer::close(const QString &reason) void RemotePeer::handle(const HeartBeat &heartBeat) { - dispatch(HeartBeatReply(heartBeat.timestamp())); + dispatch(HeartBeatReply(heartBeat.timestamp)); } void RemotePeer::handle(const HeartBeatReply &heartBeatReply) { _heartBeatCount = 0; -#if QT_VERSION < 0x040700 - emit lagUpdated(heartBeatReply.timestamp().time().msecsTo(QTime::currentTime()) / 2); +#if QT_VERSION >= 0x040900 + emit lagUpdated(heartBeatReply.timestamp.msecsTo(QDateTime::currentDateTime().toUTC()) / 2); #else - emit lagUpdated(heartBeatReply.timestamp().msecsTo(QDateTime::currentDateTime()) / 2); + emit lagUpdated(heartBeatReply.timestamp.time().msecsTo(QDateTime::currentDateTime().toUTC().time()) / 2); #endif } @@ -189,8 +212,6 @@ void RemotePeer::sendHeartBeat() emit lagUpdated(_lag); } - dispatch(HeartBeat(QDateTime::currentDateTime())); + dispatch(HeartBeat(QDateTime::currentDateTime().toUTC())); ++_heartBeatCount; } - -