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"
38 struct hash<std::pair<SockAddr, udt::Packet::MessageNumber>> {
39 size_t operator()(
const std::pair<SockAddr, udt::Packet::MessageNumber>& pair)
const {
40 return hash<SockAddr>()(pair.first) ^ hash<udt::Packet::MessageNumber>()(pair.second);
45 class PacketReceiver :
public QObject {
48 class ListenerReference :
public QEnableSharedFromThis<ListenerReference> {
50 virtual bool invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode) = 0;
51 bool invokeWithQt(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode);
52 virtual bool isSourced()
const = 0;
53 virtual QObject* getObject()
const = 0;
55 typedef QSharedPointer<ListenerReference> ListenerReferencePointer;
58 static ListenerReferencePointer makeUnsourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>));
61 static ListenerReferencePointer makeSourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>));
64 using PacketTypeList = std::vector<PacketType>;
66 PacketReceiver(QObject* parent = 0);
67 PacketReceiver(
const PacketReceiver&) =
delete;
69 PacketReceiver& operator=(
const PacketReceiver&) =
delete;
71 void setShouldDropPackets(
bool shouldDropPackets) { _shouldDropPackets = shouldDropPackets; }
76 bool registerListener(PacketType type,
const ListenerReferencePointer& listener,
bool deliverPending =
false);
77 bool registerListenerForTypes(PacketTypeList types,
const ListenerReferencePointer& listener);
78 void unregisterListener(QObject* listener);
80 void handleVerifiedPacket(std::unique_ptr<udt::Packet> packet);
81 void handleVerifiedMessagePacket(std::unique_ptr<udt::Packet> message);
82 void handleMessageFailure(SockAddr from, udt::Packet::MessageNumber messageNumber);
86 class UnsourcedListenerReference :
public ListenerReference {
88 inline UnsourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>));
89 virtual bool invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode)
override;
90 virtual bool isSourced()
const override {
return false; }
91 virtual QObject* getObject()
const override {
return _target; }
95 void (T::*_slot)(QSharedPointer<ReceivedMessage>);
99 class SourcedListenerReference :
public ListenerReference {
101 inline SourcedListenerReference(T* target,
void (T::*slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>));
102 virtual bool invokeDirectly(
const QSharedPointer<ReceivedMessage>& receivedMessagePointer,
const QSharedPointer<Node>& sourceNode)
override;
103 virtual bool isSourced()
const override {
return true; }
104 virtual QObject* getObject()
const override {
return _target; }
108 void (T::*_slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>);
112 ListenerReferencePointer listener;
116 void handleVerifiedMessage(QSharedPointer<ReceivedMessage> message,
bool justReceived);
120 void registerDirectListenerForTypes(PacketTypeList types,
const ListenerReferencePointer& listener);
121 void registerDirectListener(PacketType type,
const ListenerReferencePointer& listener);
123 bool matchingMethodForListener(PacketType type,
const ListenerReferencePointer& listener)
const;
124 void registerVerifiedListener(PacketType type,
const ListenerReferencePointer& listener,
bool deliverPending =
false);
126 QMutex _packetListenerLock;
127 QHash<PacketType, Listener> _messageListenerMap;
129 bool _shouldDropPackets =
false;
130 QMutex _directConnectSetMutex;
131 QSet<QObject*> _directlyConnectedObjects;
133 std::unordered_map<std::pair<SockAddr, udt::Packet::MessageNumber>, QSharedPointer<ReceivedMessage>> _pendingMessages;
140 PacketReceiver::ListenerReferencePointer PacketReceiver::makeUnsourcedListenerReference(T* target,
void (T::* slot)(QSharedPointer<ReceivedMessage>)) {
141 return QSharedPointer<UnsourcedListenerReference<T>>::create(target, slot);
145 PacketReceiver::ListenerReferencePointer PacketReceiver::makeSourcedListenerReference(T* target,
void (T::* slot)(QSharedPointer<ReceivedMessage>, QSharedPointer<Node>)) {
146 return 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:24