X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.h;h=be6b804bf8e0ac75e3c032a92c24ee35e7a89b95;hp=7fefdadd352449e96e217d856b538e0ca3591cf4;hb=e625531efd04c0e77e540fbb1a0fc80457bc7aba;hpb=921e54680da16fcf2adb7a90506875aceb6633a4 diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index 7fefdadd..be6b804b 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2016 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -77,7 +77,39 @@ public: bool isSecure() const { return _secure; } void dumpProxyStats(); void dumpSyncMap(SyncableObject *object); + + /**@{*/ + /** + * 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 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(); } + QVariantList peerData(); + + Peer *peerById(int peerId); + + /** + * @return If handling a signal, the Peer from which the current signal originates + */ + Peer *sourcePeer() { return _sourcePeer; } public slots: void detachObject(QObject *obj); @@ -117,6 +149,10 @@ private: void removePeer(Peer *peer); void removeAllPeers(); + int nextPeerId() { + return _lastPeerId++; + } + template void dispatch(const T &protoMessage); template @@ -140,6 +176,7 @@ private: static void disconnectDevice(QIODevice *dev, const QString &reason = QString()); QSet _peers; + QHash _peerMap; // containg a list of argtypes for fast access QHash _extendedMetaObjects; @@ -162,6 +199,13 @@ private: bool _secure; // determines if all connections are in a secured state (using ssl or internal connections) + int _lastPeerId = 0; + + QSet _restrictedTargets; + bool _restrictMessageTarget = false; + + Peer *_sourcePeer; + friend class SignalRelay; friend class SyncableObject; friend class Peer;