-// ==================================================
-// ExtendedMetaObject
-// ==================================================
-SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta, bool checkConflicts)
- : _meta(meta),
- _updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
+Peer* SignalProxy::peerById(int peerId)
+{
+ // We use ::value() here instead of the [] operator because the latter has the side-effect
+ // of automatically inserting a null value with the passed key into the map. See
+ // https://doc.qt.io/qt-5/qhash.html#operator-5b-5d and https://doc.qt.io/qt-5/qhash.html#value.
+ return _peerMap.value(peerId);
+}
+
+void SignalProxy::restrictTargetPeers(QSet<Peer*> peers, std::function<void()> closure)
+{
+ auto previousRestrictMessageTarget = _restrictMessageTarget;
+ auto previousRestrictedTargets = _restrictedTargets;
+ _restrictMessageTarget = true;
+ _restrictedTargets = peers;
+
+ closure();
+
+ _restrictMessageTarget = previousRestrictMessageTarget;
+ _restrictedTargets = previousRestrictedTargets;
+}
+
+Peer* SignalProxy::sourcePeer()
+{
+ return _sourcePeer;
+}
+
+void SignalProxy::setSourcePeer(Peer* sourcePeer)
+{
+ _sourcePeer = sourcePeer;
+}
+
+Peer* SignalProxy::targetPeer()
+{
+ return _targetPeer;
+}
+
+void SignalProxy::setTargetPeer(Peer* targetPeer)
+{
+ _targetPeer = targetPeer;
+}
+
+// ---- SlotObjectBase ---------------------------------------------------------------------------------------------------------------------
+
+SignalProxy::SlotObjectBase::SlotObjectBase(const QObject* context)
+ : _context{context}
+{}
+
+const QObject* SignalProxy::SlotObjectBase::context() const
+{
+ return _context;
+}
+
+// ---- ExtendedMetaObject ----------------------------------------------------------------------------------------------------------------
+
+SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject* meta, bool checkConflicts)
+ : _meta(meta)
+ , _updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))