#include <QMetaProperty>
#include <QRegExp>
#include <QThread>
+#include <QTime>
#include "syncableobject.h"
#include "util.h"
initClient();
}
-SignalProxy::ProxyMode SignalProxy::proxyMode() const {
- return _proxyMode;
-}
-
void SignalProxy::init() {
connect(&_heartBeatTimer, SIGNAL(timeout()), this, SLOT(sendHeartBeat()));
_heartBeatTimer.start(30 * 1000);
break;
case HeartBeat:
- receiveHeartBeat(sender);
+ receiveHeartBeat(sender, params);
break;
-
+
+ case HeartBeatReply:
+ receiveHeartBeatReply(sender, params);
+ break;
+
default:
qWarning() << "SignalProxy::receivePeerSignal(): received undefined CallType" << callType << params;
}
}
void SignalProxy::sendHeartBeat() {
- dispatchSignal(SignalProxy::HeartBeat, QVariantList());
+ dispatchSignal(SignalProxy::HeartBeat, QVariantList() << QTime::currentTime());
QHash<QIODevice *, peerInfo>::iterator peerIter = _peers.begin();
QHash<QIODevice *, peerInfo>::iterator peerIterEnd = _peers.end();
while(peerIter != peerIterEnd) {
+ if(peerIter->sentHeartBeats > 0) {
+ updateLag(peerIter.key(), (float)_heartBeatTimer.interval());
+ }
if(peerIter->sentHeartBeats > 1) {
QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(peerIter.key());
qWarning() << "SignalProxy: Disconnecting peer:"
}
}
-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<QTime>();
+ updateLag(dev, (float)sendTime.msecsTo(QTime::currentTime()) / 2);
}
+void SignalProxy::updateLag(QIODevice *dev, float lag) {
+ Q_ASSERT(_peers.contains(dev));
+ _peers[dev].lag = lag;
+ if(proxyMode() == Client) {
+ qDebug() << "LAG" << lag;
+ emit lagUpdated(lag);
+ }
+}
+
+
void SignalProxy::dumpProxyStats() {
QString mode;
if(proxyMode() == Server)
RpcCall,
InitRequest,
InitData,
- HeartBeat
+ HeartBeat,
+ HeartBeatReply
};
SignalProxy(QObject *parent);
virtual ~SignalProxy();
void setProxyMode(ProxyMode mode);
- ProxyMode proxyMode() const;
+ inline ProxyMode proxyMode() const { return _proxyMode; }
bool addPeer(QIODevice *iodev);
void removePeer(QIODevice *iodev = 0);
void objectRenamed(const QString &newname, const QString &oldname);
void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
void sendHeartBeat();
- void receiveHeartBeat(QIODevice *dev);
-
+ void receiveHeartBeat(QIODevice *dev, const QVariantList ¶ms);
+ void receiveHeartBeatReply(QIODevice *dev, const QVariantList ¶ms);
+
signals:
void peerRemoved(QIODevice *dev);
void connected();
void disconnected();
void objectInitialized(SyncableObject *);
+ void lagUpdated(int lag);
private:
void init();
QVariantMap initData(SyncableObject *obj) const;
void setInitData(SyncableObject *obj, const QVariantMap &properties);
+ void updateLag(QIODevice *dev, float lag);
+
public:
void dumpSyncMap(SyncableObject *object);
inline int peerCount() const { return _peers.size(); }
quint32 byteCount;
bool usesCompression;
int sentHeartBeats;
+ float lag;
peerInfo() : byteCount(0), usesCompression(false), sentHeartBeats(0) {}
};
//QHash<QIODevice*, peerInfo> _peerByteCount;
//! This is the fallback version number in case we can't autogenerate one
quasselBaseVersion = "0.3.0-pre";
-protocolVersion = 3; //< Version of the client/core protocol
+protocolVersion = 4; //< Version of the client/core protocol
-coreNeedsProtocol = 3; //< Minimum protocol version the core needs
-clientNeedsProtocol = 3; //< Minimum protocol version the client needs
+coreNeedsProtocol = 4; //< Minimum protocol version the core needs
+clientNeedsProtocol = 4; //< Minimum protocol version the client needs