X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcommon%2Fsignalproxy.h;h=77ef3a46731050256f8f4a5a23d2ee2956b5ffdf;hb=53861faa5551606eea31588b65ba501b24fb2e1a;hp=b0933968f6fbdd51cfa4f3be042c02c487ffe650;hpb=1e7b6cda464041cac334b03a8b01679b4b9a56d3;p=quassel.git diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index b0933968..77ef3a46 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -23,6 +23,10 @@ #include #include +#include + +#include +#include #include "protocol.h" @@ -78,13 +82,50 @@ public: void dumpProxyStats(); void dumpSyncMap(SyncableObject *object); - void restrictTargetPeers(std::initializer_list peerIds, std::function closure); + static SignalProxy *current() { + return _current; + } + + /**@{*/ + /** + * This method allows to send a signal only to a limited set of peers + * @param peers A list of peers that should receive it + * @param closure Code you want to execute within of that restricted environment + */ + void restrictTargetPeers(QSet peers, std::function closure); + void restrictTargetPeers(Peer *peer, std::function closure) { + QSet set; + set.insert(peer); + restrictTargetPeers(set, std::move(closure)); + } + + //A better version, but only implemented on Qt5 if Initializer Lists exist +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) +#ifdef Q_COMPILER_INITIALIZER_LISTS + void restrictTargetPeers(std::initializer_list peers, std::function closure) { + restrictTargetPeers(QSet(peers), std::move(closure)); + } +#endif +#endif + /**}@*/ - inline int peerCount() const { return _peers.size(); } + inline int peerCount() const { return _peerMap.size(); } QVariantList peerData(); Peer *peerById(int peerId); + /** + * @return If handling a signal, the Peer from which the current signal originates + */ + Peer *sourcePeer(); + void setSourcePeer(Peer *sourcePeer); + + /** + * @return If sending a signal, the Peer to which the current signal is directed + */ + Peer *targetPeer(); + void setTargetPeer(Peer *targetPeer); + public slots: void detachObject(QObject *obj); void detachSignals(QObject *sender); @@ -149,7 +190,6 @@ private: static void disconnectDevice(QIODevice *dev, const QString &reason = QString()); - QSet _peers; QHash _peerMap; // containg a list of argtypes for fast access @@ -178,6 +218,11 @@ private: QSet _restrictedTargets; bool _restrictMessageTarget = false; + Peer *_sourcePeer = nullptr; + Peer *_targetPeer = nullptr; + + thread_local static SignalProxy *_current; + friend class SignalRelay; friend class SyncableObject; friend class Peer;