X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=8499e1ada965b2e94895d41f21bd780b1b7cff35;hp=45f3b50acc83c92c62c604bffa12f94cd392bb5d;hb=2c4e055125a3e3ab7a2bd0d9c0ea33415f6ce7cc;hpb=c1722505b4906fe59c48aad54e6545a17afb78d7;ds=sidebyside diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 45f3b50a..8499e1ad 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -156,9 +156,11 @@ int SignalProxy::SignalRelay::qt_metacall(QMetaObject::Call _c, int _id, void ** params << QVariant(argTypes[i], _a[i+1]); } - if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId() && proxy()->proxyMode() == SignalProxy::Server) { - Peer *peer = params[0].value(); - proxy()->dispatch(peer, RpcCall(signal.signature, params)); + if (proxy()->_restrictMessageTarget) { + for (auto peer : proxy()->_restrictedTargets) { + if (peer != nullptr) + proxy()->dispatch(peer, RpcCall(signal.signature, params)); + } } else proxy()->dispatch(RpcCall(signal.signature, params)); } @@ -290,6 +292,7 @@ bool SignalProxy::addPeer(Peer *peer) if (peer->_id < 0) { peer->_id = nextPeerId(); + peer->_connectedSince = QDateTime::currentDateTimeUtc(); } _peers.insert(peer); @@ -667,12 +670,8 @@ bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList qWarning() << "SignalProxy::invokeSlot(): incompatible param types to invoke" << eMeta->methodName(methodId); return false; } - // if first arg is a PeerPtr, replace it by the address of the peer originally receiving the RpcCall - if (peer && i == 0 && args[0] == qMetaTypeId()) { - QVariant v = QVariant::fromValue(peer); - _a[1] = const_cast(v.constData()); - } else - _a[i+1] = const_cast(params[i].constData()); + + _a[i+1] = const_cast(params[i].constData()); } if (returnValue.type() != QVariant::Invalid) @@ -683,9 +682,11 @@ bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList : Qt::QueuedConnection; if (type == Qt::DirectConnection) { - return receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0; - } - else { + _sourcePeer = peer; + auto result = receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0; + _sourcePeer = nullptr; + return result; + } else { qWarning() << "Queued Connections are not implemented yet"; // note to self: qmetaobject.cpp:990 ff return false; @@ -764,9 +765,11 @@ void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode params << QVariant(argTypes[i], va_arg(ap, void *)); } - if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId() && proxyMode() == SignalProxy::Server) { - Peer *peer = params[0].value(); - dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); + if (_restrictMessageTarget) { + for (auto peer : _restrictedTargets) { + if (peer != nullptr) + dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); + } } else dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); } @@ -821,9 +824,10 @@ QVariantList SignalProxy::peerData() { for (auto peer : _peers) { QVariantMap data; data["id"] = peer->_id; - data["buildData"] = peer->_buildDate; data["clientVersion"] = peer->_clientVersion; - data["description"] = peer->description(); + data["clientVersionDate"] = peer->_buildDate; + data["remoteAddress"] = peer->address(); + data["connectedSince"] = peer->_connectedSince; data["secure"] = peer->isSecure(); result << data; } @@ -834,6 +838,18 @@ Peer *SignalProxy::peerById(int peerId) { return _peerMap[peerId]; } +void SignalProxy::restrictTargetPeers(QSet peers, std::function closure) +{ + auto previousRestrictMessageTarget = _restrictMessageTarget; + auto previousRestrictedTargets = _restrictedTargets; + _restrictMessageTarget = true; + _restrictedTargets = peers; + + closure(); + + _restrictMessageTarget = previousRestrictMessageTarget; + _restrictedTargets = previousRestrictedTargets; +} // ================================================== // ExtendedMetaObject