- // we take an educated guess if the signals and slots match
- QString signalsuffix = ::methodName(signal).mid(QString(::methodName(signal)).lastIndexOf(QRegExp("[A-Z]"))).toLower();
- QString slotprefix = ::methodName(slot).left(QString(::methodName(slot)).indexOf(QRegExp("[A-Z]"))).toLower();
-
- uint sizediff = qAbs(slotprefix.size() - signalsuffix.size());
- int ratio = editingDistance(slotprefix, signalsuffix) - sizediff;
- return (ratio < 2);
-}
-
-QString SignalProxy::methodBaseName(const QMetaMethod &method) {
- QString methodname = QString(method.signature()).section("(", 0, 0);
-
- // determine where we have to chop:
- int upperCharPos;
- if(method.methodType() == QMetaMethod::Slot) {
- // we take evertyhing from the first uppercase char if it's slot
- upperCharPos = methodname.indexOf(QRegExp("[A-Z]"));
- if(upperCharPos == -1)
- return QString();
- methodname = methodname.mid(upperCharPos);
- } else {
- // and if it's a signal we discard everything from the last uppercase char
- upperCharPos = methodname.lastIndexOf(QRegExp("[A-Z]"));
- if(upperCharPos == -1)
- return QString();
- methodname = methodname.left(upperCharPos);
- }
-
- methodname[0] = methodname[0].toUpper();
-
- return methodname;
-}
-
-QVariantMap SignalProxy::initData(SyncableObject *obj) const {
- return obj->toVariantMap();
-}
-
-void SignalProxy::setInitData(SyncableObject *obj, const QVariantMap &properties) {
- if(obj->isInitialized())
- return;
- obj->fromVariantMap(properties);
- obj->setInitialized();
- emit objectInitialized(obj);
- invokeSlot(obj, updatedRemotelyId(obj));
-}
-
-void SignalProxy::sendHeartBeat() {
- 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);
-}
-
-void SignalProxy::updateLag(IODevicePeer *peer, int lag) {
- peer->lag = lag;
- if(proxyMode() == Client) {
- emit lagUpdated(lag);
- }
-}
-
-
-void SignalProxy::dumpProxyStats() {
- QString mode;
- if(proxyMode() == Server)
- mode = "Server";
- else
- mode = "Client";
-
- int sigCount = 0;
- foreach(SignalRelay *relay, _relayHash.values())
- sigCount += relay->sigCount();
-
- int slaveCount = 0;
- foreach(ObjectId oid, _syncSlave.values())
- slaveCount += oid.count();
-
- qDebug() << this;
- qDebug() << " Proxy Mode:" << mode;
- qDebug() << "attached sending Objects:" << _relayHash.count();
- qDebug() << " number of Signals:" << sigCount;
- qDebug() << " attached Slots:" << _attachedSlots.count();
- qDebug() << " number of synced Slaves:" << slaveCount;
- qDebug() << "number of Classes cached:" << _classInfo.count();
-}
-
-void SignalProxy::dumpSyncMap(SyncableObject *object) {
- const QMetaObject *meta = object->metaObject();
- qDebug() << "SignalProxy: SyncMap for Class" << meta->className();
-
- QHash<QByteArray, int> syncMap_ = syncMap(object);
- QHash<QByteArray, int>::const_iterator iter = syncMap_.constBegin();
- while(iter != syncMap_.constEnd()) {
- qDebug() << iter.key() << "-->" << iter.value() << meta->method(iter.value()).signature();
- iter++;
- }
-// QHash<int, int> syncMap_ = syncMap(object);
-// QHash<int, int>::const_iterator iter = syncMap_.constBegin();
-// while(iter != syncMap_.constEnd()) {
-// qDebug() << iter.key() << meta->method(iter.key()).signature() << "-->" << iter.value() << meta->method(iter.value()).signature();
-// iter++;
-// }