+ dispatchSignal(SignalProxy::HeartBeat, QVariantList() << QTime::currentTime());
+ PeerHash::iterator peer = _peers.begin();
+ while(peer != _peers.end()) {
+ if((*peer)->type() == AbstractPeer::IODevicePeer) {
+ IODevicePeer *ioPeer = static_cast<IODevicePeer *>(*peer);
+ if(ioPeer->sentHeartBeats > 0) {
+ updateLag(ioPeer, ioPeer->sentHeartBeats * _heartBeatTimer.interval());
+ }
+ if(ioPeer->sentHeartBeats > 1) {
+ //FIXME: proper disconnect.
+// QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(peerIter.key());
+// qWarning() << "SignalProxy: Disconnecting peer:"
+// << (socket ? qPrintable(socket->peerAddress().toString()) : "local client")
+// << "(didn't receive a heartbeat for over" << peerIter->sentHeartBeats * _heartBeatTimer.interval() / 1000 << "seconds)";
+// peerIter.key()->close();
+ } else {
+ ioPeer->sentHeartBeats++;
+ }
+ }
+ peer++;
+ }
+}
+
+void SignalProxy::receiveHeartBeat(AbstractPeer *peer, const QVariantList ¶ms) {
+ peer->dispatchSignal(SignalProxy::HeartBeatReply, params);
+}
+
+void SignalProxy::receiveHeartBeatReply(AbstractPeer *peer, const QVariantList ¶ms) {
+ if(peer->type() != AbstractPeer::IODevicePeer) {
+ qWarning() << "SignalProxy::receiveHeartBeatReply: received heart beat from a non IODevicePeer!";
+ return;
+ }
+
+ IODevicePeer *ioPeer = static_cast<IODevicePeer *>(peer);
+ ioPeer->sentHeartBeats = 0;
+
+ if(params.isEmpty()) {
+ qWarning() << "SignalProxy: received heart beat reply with less params then sent from:" << ioPeer->device();
+ return;
+ }
+
+ QTime sendTime = params[0].value<QTime>();
+ updateLag(ioPeer, sendTime.msecsTo(QTime::currentTime()) / 2);