diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 1959c915bb..73eaa3dc9f 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -15,13 +15,11 @@ #include #include -#include - #include "ThreadedAssignment.h" class QSharedMemory; -class AssignmentClient : public QObject, public PacketListener { +class AssignmentClient : public QObject { Q_OBJECT public: AssignmentClient(Assignment::Type requestAssignmentType, QString assignmentPool, diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index a75e876581..8463498d7d 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -23,8 +23,7 @@ extern const char* NUM_FORKS_PARAMETER; - -class AssignmentClientMonitor : public QObject, public PacketListener { +class AssignmentClientMonitor : public QObject { Q_OBJECT public: AssignmentClientMonitor(const unsigned int numAssignmentClientForks, const unsigned int minAssignmentClientForks, diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 9b0af75b07..3a3176b78d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -341,6 +341,9 @@ void AvatarMixer::broadcastAvatarData() { ++_sumIdentityPackets; } }); + + // close the current packet so that we're always sending something + avatarPacketList.closeCurrentPacket(true); // send the avatar data PacketList nodeList->sendPacketList(avatarPacketList, *node); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index c2d5db367f..7786fb34ac 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -24,7 +24,6 @@ #include #include #include -#include #include "DomainServerSettingsManager.h" #include "DomainServerWebSessionData.h" @@ -35,7 +34,7 @@ typedef QSharedPointer SharedAssignmentPointer; typedef QMultiHash TransactionHash; -class DomainServer : public QCoreApplication, public HTTPSRequestHandler, public PacketListener { +class DomainServer : public QCoreApplication, public HTTPSRequestHandler { Q_OBJECT public: DomainServer(int argc, char* argv[]); diff --git a/interface/src/Application.h b/interface/src/Application.h index e487fa5733..feb8063c29 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -126,11 +125,7 @@ class Application; typedef bool (Application::* AcceptURLMethod)(const QString &); -class Application : - public QApplication, - public AbstractViewStateInterface, - public AbstractScriptingServicesInterface, - public PacketListener { +class Application : public QApplication, public AbstractViewStateInterface, public AbstractScriptingServicesInterface { Q_OBJECT friend class OctreePacketProcessor; diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index a783256392..47ebdc73bc 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -13,11 +13,10 @@ #define hifi_OctreePacketProcessor_h #include -#include /// Handles processing of incoming voxel packets for the interface application. As with other ReceivedPacketProcessor classes /// the user is responsible for reading inbound packets and adding them to the processing queue by calling queueReceivedPacket() -class OctreePacketProcessor : public ReceivedPacketProcessor, public PacketListener { +class OctreePacketProcessor : public ReceivedPacketProcessor { Q_OBJECT public: OctreePacketProcessor(); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 5292e51d91..a1d08ec540 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -81,7 +80,7 @@ typedef glm::quat (*AudioOrientationGetter)(); class NLPacket; -class AudioClient : public AbstractAudioInterface, public Dependency, public PacketListener { +class AudioClient : public AbstractAudioInterface, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY public: diff --git a/libraries/audio-client/src/AudioIOStats.h b/libraries/audio-client/src/AudioIOStats.h index d0ec34e86b..11f1d74185 100644 --- a/libraries/audio-client/src/AudioIOStats.h +++ b/libraries/audio-client/src/AudioIOStats.h @@ -19,11 +19,10 @@ #include #include #include -#include class MixedProcessedAudioStream; -class AudioIOStats : public QObject, public PacketListener { +class AudioIOStats : public QObject { Q_OBJECT public: AudioIOStats(MixedProcessedAudioStream* receivedAudioStream); diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index c0e068001a..105282dde3 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -21,12 +21,11 @@ #include #include #include -#include #include "AvatarData.h" #include -class AvatarHashMap : public QObject, public Dependency, public PacketListener { +class AvatarHashMap : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 85f21a9954..3125b2132c 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -14,12 +14,10 @@ #include -#include - #include "EntityItem.h" /// Utility for processing, packing, queueing and sending of outbound edit voxel messages. -class EntityEditPacketSender : public OctreeEditPacketSender, public PacketListener { +class EntityEditPacketSender : public OctreeEditPacketSender { Q_OBJECT public: EntityEditPacketSender(); diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 43453e46c5..6079035f8b 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -22,14 +22,13 @@ #include "HifiSockAddr.h" #include "NetworkPeer.h" #include "NLPacket.h" -#include "PacketListener.h" const unsigned short DEFAULT_DOMAIN_SERVER_PORT = 40102; const unsigned short DEFAULT_DOMAIN_SERVER_DTLS_PORT = 40103; const quint16 DOMAIN_SERVER_HTTP_PORT = 40100; const quint16 DOMAIN_SERVER_HTTPS_PORT = 40101; -class DomainHandler : public QObject, public PacketListener { +class DomainHandler : public QObject { Q_OBJECT public: DomainHandler(QObject* parent = 0); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index a86db3629f..7528b973c4 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -39,7 +39,6 @@ #include "NLPacket.h" #include "udt/PacketHeaders.h" #include "PacketReceiver.h" -#include "PacketListener.h" #include "NLPacketList.h" #include "UUIDHasher.h" @@ -74,7 +73,7 @@ namespace PingType { const PingType_t Symmetric = 3; } -class LimitedNodeList : public QObject, public Dependency, public PacketListener { +class LimitedNodeList : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY public: diff --git a/libraries/networking/src/PacketListener.cpp b/libraries/networking/src/PacketListener.cpp deleted file mode 100644 index f4a5c4a9cd..0000000000 --- a/libraries/networking/src/PacketListener.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// PacketListener.cpp -// libraries/networking/src -// -// Created by Stephen Birarda on 07/14/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "PacketListener.h" - -#include "NodeList.h" - -PacketListener::~PacketListener() { - auto limitedNodelist = DependencyManager::get(); - if (limitedNodelist) { - limitedNodelist->getPacketReceiver().unregisterListener(this); - } -} diff --git a/libraries/networking/src/PacketListener.h b/libraries/networking/src/PacketListener.h deleted file mode 100644 index ad0f1c6f7f..0000000000 --- a/libraries/networking/src/PacketListener.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// PacketListener.h -// libraries/networking/src -// -// Created by Stephen Birarda on 07/14/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_PacketListener_h -#define hifi_PacketListener_h - -#pragma once - -class PacketListener { -public: - virtual ~PacketListener(); -}; - -#endif // hifi_PacketListener_h diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 8b95954e41..446fb67736 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -24,7 +24,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : qRegisterMetaType>(); } -bool PacketReceiver::registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot) { +bool PacketReceiver::registerListenerForTypes(const QSet& types, QObject* listener, const char* slot) { QSet nonSourcedTypes; QSet sourcedTypes; @@ -36,14 +36,13 @@ bool PacketReceiver::registerListenerForTypes(const QSet& typ } } - QObject* object = dynamic_cast(listener); - Q_ASSERT(object); + Q_ASSERT(listener); if (nonSourcedTypes.size() > 0) { - QMetaMethod nonSourcedMethod = matchingMethodForListener(*nonSourcedTypes.begin(), object, slot); + QMetaMethod nonSourcedMethod = matchingMethodForListener(*nonSourcedTypes.begin(), listener, slot); if (nonSourcedMethod.isValid()) { foreach(PacketType::Value type, nonSourcedTypes) { - registerVerifiedListener(type, object, nonSourcedMethod); + registerVerifiedListener(type, listener, nonSourcedMethod); } } else { return false; @@ -51,10 +50,10 @@ bool PacketReceiver::registerListenerForTypes(const QSet& typ } if (sourcedTypes.size() > 0) { - QMetaMethod sourcedMethod = matchingMethodForListener(*sourcedTypes.begin(), object, slot); + QMetaMethod sourcedMethod = matchingMethodForListener(*sourcedTypes.begin(), listener, slot); if (sourcedMethod.isValid()) { foreach(PacketType::Value type, sourcedTypes) { - registerVerifiedListener(type, object, sourcedMethod); + registerVerifiedListener(type, listener, sourcedMethod); } } else { return false; @@ -66,7 +65,7 @@ bool PacketReceiver::registerListenerForTypes(const QSet& typ void PacketReceiver::registerDirectListenerForTypes(const QSet& types, - PacketListener* listener, const char* slot) { + QObject* listener, const char* slot) { // just call register listener for types to start bool success = registerListenerForTypes(types, listener, slot); if (success) { @@ -79,14 +78,13 @@ void PacketReceiver::registerDirectListenerForTypes(const QSet(listener); - Q_ASSERT(object); +bool PacketReceiver::registerListener(PacketType::Value type, QObject* listener, const char* slot) { + Q_ASSERT(listener); - QMetaMethod matchingMethod = matchingMethodForListener(type, object, slot); + QMetaMethod matchingMethod = matchingMethodForListener(type, listener, slot); if (matchingMethod.isValid()) { - registerVerifiedListener(type, object, matchingMethod); + registerVerifiedListener(type, listener, matchingMethod); return true; } else { return false; @@ -156,21 +154,19 @@ void PacketReceiver::registerVerifiedListener(PacketType::Value type, QObject* o } // add the mapping - _packetListenerMap[type] = ObjectMethodPair(object, slot); + _packetListenerMap[type] = ObjectMethodPair(QPointer(object), slot); _packetListenerLock.unlock(); } -void PacketReceiver::unregisterListener(PacketListener* listener) { - QObject* listenerObject = dynamic_cast(listener); - +void PacketReceiver::unregisterListener(QObject* listener) { _packetListenerLock.lock(); auto it = _packetListenerMap.begin(); while (it != _packetListenerMap.end()) { - if (it.value().first == listenerObject) { + if (it.value().first == listener) { // this listener matches - erase it it = _packetListenerMap.erase(it); } else { @@ -181,7 +177,7 @@ void PacketReceiver::unregisterListener(PacketListener* listener) { _packetListenerLock.unlock(); _directConnectSetMutex.lock(); - _directlyConnectedObjects.remove(listenerObject); + _directlyConnectedObjects.remove(listener); _directConnectSetMutex.unlock(); } @@ -335,6 +331,11 @@ void PacketReceiver::processDatagrams() { << listener.first << "::" << qPrintable(listener.second.methodSignature()); } + } else { + qDebug().nospace() << "Listener for packet" << packet->getType() + << " (" << qPrintable(nameForPacketType(packet->getType())) << ")" + << " has been destroyed. Removing from listener map."; + it = _packetListenerMap.erase(it); } } else { qWarning() << "No listener found for packet type " << nameForPacketType(packet->getType()); diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 1bf31b30b1..27dc1ce55e 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -17,13 +17,13 @@ #include #include #include +#include #include #include "NLPacket.h" #include "udt/PacketHeaders.h" class OctreePacketProcessor; -class PacketListener; class PacketReceiver : public QObject { Q_OBJECT @@ -40,9 +40,9 @@ public: void resetCounters() { _inPacketCount = 0; _inByteCount = 0; } - bool registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot); - bool registerListener(PacketType::Value type, PacketListener* listener, const char* slot); - void unregisterListener(PacketListener* listener); + bool registerListenerForTypes(const QSet& types, QObject* listener, const char* slot); + bool registerListener(PacketType::Value type, QObject* listener, const char* slot); + void unregisterListener(QObject* listener); public slots: void processDatagrams(); @@ -55,14 +55,14 @@ signals: private: // this is a brutal hack for now - ideally GenericThread / ReceivedPacketProcessor // should be changed to have a true event loop and be able to handle our QMetaMethod::invoke - void registerDirectListenerForTypes(const QSet& types, PacketListener* listener, const char* slot); + void registerDirectListenerForTypes(const QSet& types, QObject* listener, const char* slot); bool packetVersionMatch(const NLPacket& packet); QMetaMethod matchingMethodForListener(PacketType::Value type, QObject* object, const char* slot) const; void registerVerifiedListener(PacketType::Value type, QObject* listener, const QMetaMethod& slot); - using ObjectMethodPair = std::pair; + using ObjectMethodPair = std::pair, QMetaMethod>; QMutex _packetListenerLock; QHash _packetListenerMap; diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index cfe2363c98..51917cd74d 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -14,11 +14,9 @@ #include -#include "PacketListener.h" - #include "Assignment.h" -class ThreadedAssignment : public Assignment, public PacketListener { +class ThreadedAssignment : public Assignment { Q_OBJECT public: ThreadedAssignment(NLPacket& packet);