From: Janne Koschinski Date: Mon, 28 Aug 2017 01:56:41 +0000 (+0200) Subject: Implement peer-specific signal sending X-Git-Tag: travis-deploy-test~223 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=1e7b6cda464041cac334b03a8b01679b4b9a56d3 Implement peer-specific signal sending --- diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 68ac6fbc..e37986b6 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -159,6 +159,11 @@ int SignalProxy::SignalRelay::qt_metacall(QMetaObject::Call _c, int _id, void ** if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId() && proxy()->proxyMode() == SignalProxy::Server) { Peer *peer = params[0].value(); proxy()->dispatch(peer, RpcCall(signal.signature, params)); + } else 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)); } @@ -836,6 +841,23 @@ Peer *SignalProxy::peerById(int peerId) { return _peerMap[peerId]; } +/** + * This method allows to send a signal only to a limited set of peers + * @param peerIds A list of peers that should receive it + * @param closure Code you want to execute within of that restricted environment + */ +void SignalProxy::restrictTargetPeers(std::initializer_list peers, std::function closure) +{ + auto previousRestrictMessageTarget = _restrictMessageTarget; + auto previousRestrictedTargets = _restrictedTargets; + _restrictMessageTarget = true; + _restrictedTargets = QSet(peers); + + closure(); + + _restrictMessageTarget = previousRestrictMessageTarget; + _restrictedTargets = previousRestrictedTargets; +} // ================================================== // ExtendedMetaObject diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index dce008ab..b0933968 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -77,6 +77,9 @@ public: bool isSecure() const { return _secure; } void dumpProxyStats(); void dumpSyncMap(SyncableObject *object); + + void restrictTargetPeers(std::initializer_list peerIds, std::function closure); + inline int peerCount() const { return _peers.size(); } QVariantList peerData(); @@ -172,6 +175,9 @@ private: int _lastPeerId = 0; + QSet _restrictedTargets; + bool _restrictMessageTarget = false; + friend class SignalRelay; friend class SyncableObject; friend class Peer; diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 635067a5..ea584f9c 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -106,6 +106,7 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) p->attachSignal(this, SIGNAL(passwordChanged(PeerPtr,bool))); p->attachSlot(SIGNAL(kickClient(int)), this, SLOT(kickClient(int))); + p->attachSignal(this, SIGNAL(disconnectFromCore())); loadSettings(); initScriptEngine(); @@ -721,9 +722,15 @@ void CoreSession::changePassword(PeerPtr peer, const QString &userName, const QS } void CoreSession::kickClient(int peerId) { + qWarning() << "kickClient(" << peerId << ")"; + auto peer = signalProxy()->peerById(peerId); - if (!peer) { + if (peer == nullptr) { qWarning() << "Invalid peer Id: " << peerId; + return; } - peer->close("Terminated by user action"); + signalProxy()->restrictTargetPeers({peer}, [&]{ + qWarning() << "executing closure"; + emit disconnectFromCore(); + }); } diff --git a/src/core/coresession.h b/src/core/coresession.h index c4de8cc9..61b7d22e 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -171,6 +171,8 @@ signals: void passwordChanged(PeerPtr peer, bool success); + void disconnectFromCore(); + protected: virtual void customEvent(QEvent *event);