X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=0350ac6542e9160ec1398858bcaf470b2bb96b62;hb=92789e6323ca73383a7954d834ecfc093234f5e2;hp=9a3c5576f61994112bfc07c83a9df34f3e4a726d;hpb=68cbd5e48cb870f641e538aa69f46f4c9e31f3ae;p=quassel.git diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 9a3c5576..0350ac65 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "syncableobject.h" #include "util.h" @@ -235,10 +236,6 @@ void SignalProxy::setProxyMode(ProxyMode mode) { initClient(); } -SignalProxy::ProxyMode SignalProxy::proxyMode() const { - return _proxyMode; -} - void SignalProxy::init() { connect(&_heartBeatTimer, SIGNAL(timeout()), this, SLOT(sendHeartBeat())); _heartBeatTimer.start(30 * 1000); @@ -722,9 +719,13 @@ void SignalProxy::receivePeerSignal(QIODevice *sender, const QVariant &packedFun break; case HeartBeat: - receiveHeartBeat(sender); + receiveHeartBeat(sender, params); break; - + + case HeartBeatReply: + receiveHeartBeatReply(sender, params); + break; + default: qWarning() << "SignalProxy::receivePeerSignal(): received undefined CallType" << callType << params; } @@ -1035,10 +1036,13 @@ void SignalProxy::setInitData(SyncableObject *obj, const QVariantMap &properties } void SignalProxy::sendHeartBeat() { - dispatchSignal(SignalProxy::HeartBeat, QVariantList()); + dispatchSignal(SignalProxy::HeartBeat, QVariantList() << QTime::currentTime()); QHash::iterator peerIter = _peers.begin(); QHash::iterator peerIterEnd = _peers.end(); while(peerIter != peerIterEnd) { + if(peerIter->sentHeartBeats > 0) { + updateLag(peerIter.key(), _heartBeatTimer.interval()); + } if(peerIter->sentHeartBeats > 1) { QAbstractSocket *socket = qobject_cast(peerIter.key()); qWarning() << "SignalProxy: Disconnecting peer:" @@ -1052,15 +1056,39 @@ void SignalProxy::sendHeartBeat() { } } -void SignalProxy::receiveHeartBeat(QIODevice *dev) { +void SignalProxy::receiveHeartBeat(QIODevice *dev, const QVariantList ¶ms) { if(!_peers.contains(dev)) { qWarning() << "SignalProxy: received heart beat from unknown Device:" << dev; + } + dispatchSignal(dev, SignalProxy::HeartBeatReply, params); +} + +void SignalProxy::receiveHeartBeatReply(QIODevice *dev, const QVariantList ¶ms) { + if(!_peers.contains(dev)) { + qWarning() << "SignalProxy: received heart beat reply from unknown Device:" << dev; return; } _peers[dev].sentHeartBeats = 0; + + if(params.isEmpty()) { + qWarning() << "SignalProxy: received heart beat reply with less params then sent from:" << dev; + return; + } + + QTime sendTime = params[0].value(); + updateLag(dev, sendTime.msecsTo(QTime::currentTime()) / 2); } +void SignalProxy::updateLag(QIODevice *dev, int lag) { + Q_ASSERT(_peers.contains(dev)); + _peers[dev].lag = lag; + if(proxyMode() == Client) { + emit lagUpdated(lag); + } +} + + void SignalProxy::dumpProxyStats() { QString mode; if(proxyMode() == Server)