14 #ifndef hifi_PacketReceiver_h
15 #define hifi_PacketReceiver_h
18 #include <unordered_map>
20 #include <QtCore/QMutex>
21 #include <QtCore/QObject>
22 #include <QtCore/QPointer>
23 #include <QtCore/QSet>
24 #include <QtCore/QSharedPointer>
25 #include <QtCore/QEnableSharedFromThis>
28 #include "NLPacketList.h"
29 #include "ReceivedMessage.h"
30 #include "udt/PacketHeaders.h"
32 struct sock_and_msgnum_hash {
33 size_t operator()(
const std::pair<SockAddr, udt::Packet::MessageNumber>& pair)
const {
34 return std::hash<SockAddr>()(pair.first) ^ std::hash<udt::Packet::MessageNumber>()(pair.second);
42 class PacketReceiver :
public QObject {
45 class ListenerReference :
public QEnableSharedFromThis<ListenerReference> {
47 virtual bool invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode) = 0;
48 bool invokeWithQt(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode);
49 virtual bool isSourced()
const = 0;
50 virtual QObject* getObject()
const = 0;
52 typedef QSharedPointer<ListenerReference> ListenerReferencePointer;
55 static ListenerReferencePointer makeUnsourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>));
58 static ListenerReferencePointer makeSourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>));
61 using PacketTypeList = std::vector<PacketType>;
63 PacketReceiver(QObject* parent = 0);
64 PacketReceiver(
const PacketReceiver&) =
delete;
66 PacketReceiver& operator=(
const PacketReceiver&) =
delete;
68 void setShouldDropPackets(
bool shouldDropPackets) { _shouldDropPackets = shouldDropPackets; }
73 bool registerListener(PacketType type,
const ListenerReferencePointer& listener,
bool deliverPending =
false);
74 bool registerListenerForTypes(PacketTypeList types,
const ListenerReferencePointer& listener);
75 void unregisterListener(QObject* listener);
77 void handleVerifiedPacket(std::unique_ptr<udt::Packet> packet);
78 void handleVerifiedMessagePacket(std::unique_ptr<udt::Packet> message);
79 void handleMessageFailure(SockAddr from, udt::Packet::MessageNumber messageNumber);
83 class UnsourcedListenerReference :
public ListenerReference {
85 inline UnsourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>));
86 virtual bool invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode)
override;
87 virtual bool isSourced()
const override {
return false; }
88 virtual QObject* getObject()
const override {
return _target; }
92 void (T::*_slot)(QSharedPointer<ReceivedMessage>);
96 class SourcedListenerReference :
public ListenerReference {
98 inline SourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>));
99 virtual bool invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode)
override;
100 virtual bool isSourced()
const override {
return true; }
101 virtual QObject* getObject()
const override {
return _target; }
105 void (T::*_slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>);
109 ListenerReferencePointer listener;
113 void handleVerifiedMessage(QSharedPointer<ReceivedMessage> message,
bool justReceived);
117 void registerDirectListenerForTypes(PacketTypeList types,
const ListenerReferencePointer& listener);
118 void registerDirectListener(PacketType type,
const ListenerReferencePointer& listener);
120 bool matchingMethodForListener(PacketType type,
const ListenerReferencePointer& listener)
const;
121 void registerVerifiedListener(PacketType type,
const ListenerReferencePointer& listener,
bool deliverPending =
false);
123 QMutex _packetListenerLock;
124 QHash<PacketType, Listener> _messageListenerMap;
126 bool _shouldDropPackets =
false;
127 QMutex _directConnectSetMutex;
128 QSet<QObject*> _directlyConnectedObjects;
130 std::unordered_map<std::pair<SockAddr, udt::Packet::MessageNumber>, QSharedPointer<ReceivedMessage>, sock_and_msgnum_hash>
138 PacketReceiver::ListenerReferencePointer PacketReceiver::makeUnsourcedListenerReference(T* target,
void (T::* slot)(QSharedPointer<ReceivedMessage>)) {
139 auto ptr = QSharedPointer<UnsourcedListenerReference<T>>::create(target, slot);
144 PacketReceiver::ListenerReferencePointer PacketReceiver::makeSourcedListenerReference(T* target,
void (T::* slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>)) {
145 auto ptr = QSharedPointer<SourcedListenerReference<T>>::create(target, slot);
150 PacketReceiver::UnsourcedListenerReference<T>::UnsourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>)) :
151 _target(target),_slot(slot) {
155 bool PacketReceiver::UnsourcedListenerReference<T>::invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>&) {
156 if (_target.isNull()) {
159 (_target->*_slot)(receivedMessagePointer);
164 PacketReceiver::SourcedListenerReference<T>::SourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>)) :
165 _target(target),_slot(slot) {
169 bool PacketReceiver::SourcedListenerReference<T>::invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode) {
170 if (_target.isNull()) {
173 (_target->*_slot)(receivedMessagePointer, sourceNode);
Utility for processing, packing, queueing and sending of outbound edit voxel messages.
Definition: EntityEditPacketSender.h:25
Definition: OctreePacketProcessor.h:25