X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.h;h=f24882c6144edc8eac42fcd04be3528b7056c3f2;hb=74226102118400b228618f7373137a4a01e7d85f;hp=a985d0dcdba79de4a8ac97a634e6ce807760008d;hpb=b1b970e71618cb2d2cf372ba55234000c6324d7f;p=quassel.git diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index a985d0dc..f24882c6 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,12 +18,14 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef SIGNALPROXY_H -#define SIGNALPROXY_H +#pragma once #include #include +#include +#include + #include "protocol.h" struct QMetaObject; @@ -78,14 +80,34 @@ public: void dumpProxyStats(); void dumpSyncMap(SyncableObject *object); + static SignalProxy *current() { + return _current; + } + + /**@{*/ /** * 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 peers A list of peers that should receive it * @param closure Code you want to execute within of that restricted environment */ - void restrictTargetPeers(std::initializer_list peerIds, std::function closure); + 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); @@ -93,7 +115,14 @@ public: /** * @return If handling a signal, the Peer from which the current signal originates */ - Peer *sourcePeer() { return _sourcePeer; } + 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); @@ -159,7 +188,6 @@ private: static void disconnectDevice(QIODevice *dev, const QString &reason = QString()); - QSet _peers; QHash _peerMap; // containg a list of argtypes for fast access @@ -188,7 +216,10 @@ private: QSet _restrictedTargets; bool _restrictMessageTarget = false; - Peer *_sourcePeer; + Peer *_sourcePeer = nullptr; + Peer *_targetPeer = nullptr; + + thread_local static SignalProxy *_current; friend class SignalRelay; friend class SyncableObject; @@ -253,5 +284,3 @@ private: QHash _methodIds; QHash _receiveMap; // if slot x is called then hand over the result to slot y }; - -#endif